INTは、ソフトウェア割り込みを生成するx86プロセッサ用のアセンブリ言語命令です。バイト値としてフォーマットされた割り込み番号を受け取ります。[ 1 ]
アセンブリ言語で記述する場合、命令は次のように記述されます。
INT X生成すべきソフトウェア割り込み(0~255)はどこにXありますか?
機械のバイナリ演算の慣例に従い、割り込み番号は16進数で表記されることが多く、これは0xを接頭辞として、またはhを接尾辞として示すことができます。たとえば、 0x13は20番目のソフトウェア割り込みINT 13Hを生成し(16進数の0x13は10進数で19です。カウントは0から始まります)、割り込みテーブルの20番目のベクタが指す関数が実行されます。
ソフトウェア割り込みは、プロセッサの状態も保存する長い呼び出しです。すべての割り込みには、8 ビットの割り込み番号が関連付けられています。この番号は、アドレス 0 ~ 3FFH に格納されている 256 要素の割り込みベクタ テーブルでセグメント:オフセットを検索するために使用されます。リアル モードでソフトウェア割り込みが発生すると、プロセッサの状態がプッシュされ、CS と IP がプッシュされ、割り込み番号が 4 倍されて新しい実行アドレスがインデックス付けされ、ベクタ テーブルからロードされます。フラグ レジスタをプッシュした後、ファーコール命令を使用して割り込み機能を手動で開始することは完全に可能です。割り込みルーチンは通常、IRET命令で終了します。
DOSソフトウェア割り込みの便利な例として、割り込み0x21がありました。レジスタ(主にahとal)に異なるパラメータを指定して呼び出すことで、さまざまなIO操作、文字列出力などにアクセスできます。[ 2 ]
ほとんどのUnixシステムとその派生システムは、ソフトウェア割り込みを使用していません。ただし、 2000年代半ば以前にシステムコールを行うために使用されていた割り込み0x80は例外です。これは、カーネル関数に対応する32ビット値をプロセッサのEAXレジスタに入力し、INT 0x80を実行することによって実現されます。
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命令 は、ハードウェアデバッグトラップとして定義された1バイトの命令です。
INT1 のオペコードは0xF1であり、INT 1 のオペコードは です0xCD 0x01。INT1 は DR6 のビットを設定せずにデバッグ例外 (#DB) を生成します。ハードウェアベンダーは、ハードウェアデバッグに INT1 命令を使用する場合があります。Intel は、ソフトウェアベンダーがソフトウェアブレークポイントに INT3 命令を引き続き使用することを推奨しています。[ 1 ] 80386 より前のプロセッサでは実装されていません。