INT(x86命令)

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より前のプロセッサには実装されていません。

参照

参考文献