INTはx86プロセッサ用のアセンブリ言語命令であり、ソフトウェア割り込みを生成します。割り込み番号をバイト値として受け取ります。[ 1 ]
アセンブリ言語で記述する場合、命令は次のように記述されます。
INT X
生成される ソフトウェア割り込みはここにXあります(0-255)。
マシンの2進演算では慣例的に、割り込み番号は16進数で表記されることが多く、接頭辞0xまたは接尾辞hで示されます。例えば、は20番目のソフトウェア割り込みINT 13Hを生成し(16進数0x13は10進数では19で、カウントは0から始まります)、割り込みテーブル内の20番目のベクトルが指す関数を実行します。
INTはリアルモードで広く使用されています。プロテクトモードでは、INTは特権命令です。[ 1 ]
リアルモード
ソフトウェア割り込みは、プロセッサステータスも保存するロングコールです。すべての割り込みには、8ビットの割り込み番号が関連付けられています。この番号は、アドレス0~3FFHに格納されている256要素の割り込みベクターテーブル内のセグメントオフセットを検索するために使用されます。リアルモードでソフトウェア割り込みが発生すると、プロセッサステータスがプッシュされ、CSとIPがプッシュされます。そして、割り込み番号が4倍されて、ベクターテーブルからロードされる新しい実行アドレスが割り当てられます。フラグレジスタをプッシュした後、far-call命令を使用して割り込み機能を手動で開始することも可能です。割り込みルーチンは通常、IRET命令で終了します。
DOSのソフトウェア割り込みの便利な例として、割り込み0x21が挙げられます。レジスタ(主にahとal)に異なるパラメータを指定してこの割り込みを呼び出すことで、様々なIO操作や文字列出力などにアクセスできました。[ 2 ]
ほとんどのUnixシステムおよびその派生システムでは、2000年代半ば以前にシステムコールを実行するために使用されていた割り込み0x80を除き、ソフトウェア割り込みは使用されません。これは、カーネル関数に対応する32ビット値をプロセッサのEAXレジスタに入力し、INT 0x80を実行することで実現されます。
INT3
INT3命令は、デバッガが実行中のプログラム内の命令を一時的に置き換えてコードブレークポイントを設定するため に使用する1バイト命令です。より一般的なINT XXh命令は2バイトでエンコードされます。そのため、命令のパッチ適用(1バイト長の場合もある)には適していません。SIGTRAPを参照してください。
INT3のオペコードは で0xCCあるのに対し、INT immediate8のオペコードはである。専用オペコードにはデバッグに望ましい特殊な特性があり、これはINT3の通常の2バイトオペコードには備わっていないため、アセンブラは通常、ニーモニックから汎用オペコードを生成しない。[ 1 ]0xCD immediate80xCC0xCD 0x03
の中へ
INTO命令 は、もう一つの1バイト命令です。これは条件付き割り込みであり、このオペコードの実行時にオーバーフローフラグがセットされているとトリガーされます。これは暗黙的に割り込み#4を示します。
INTO のオペコードは です0xCEが、x86-64 モードでは使用できません。
INT1
INT1命令 は、ハードウェア デバッグ トラップとして定義された 1 バイトの命令です。
INT1のオペコードは ですが0xF1、INT 1のオペコードは です0xCD 0x01。INT1はDR6のビットをセットせずにデバッグ例外(#DB)を生成します。ハードウェアベンダーはハードウェアデバッグにINT1命令を使用できます。Intelはソフトウェアベンダーに対し、ソフトウェアブレークポイントには引き続きINT3命令を使用することを推奨しています。[ 1 ] 80386より前のプロセッサには実装されていません。
参照
参考文献
- ^ a b c dインテル® 64 および IA-32 アーキテクチャー・ソフトウェア開発マニュアル(PDF)第2巻Intel Corporation 2024年3月 p. 3-520 2024年5月23日閲覧。
- ^定義: int 21