汎用命令

移動
MOV移動
MOVBE移動 (BigEndian)
MOVD
MOVQ
MMX/XMM レジスタとの移動
MOVNTI非テンポラルな値の移動
LEAメモリのアドレスをレジスタに格納
XLAT
XLATB
seg:[rBX] のバイト配列の AL の位置の値をコピー
ゼロ拡張/符号拡張/符号反転
MOVZXゼロ拡張して移動
MOVSX符号拡張して移動
MOVSXD符号拡張して移動 (32->64bit)
CBW
CWDE
CDQE
AL/AX/EAX の符号拡張
CWD
CDQ
CQO
AX/EAX/RAX を、rDX:rAX に符号拡張
交換
BSWAPバイトスワップ
XCHG値の交換
XADD値の交換と加算
CMPXCHG比較して交換
CMPXCHG8B
CMPXCHG16B
比較して交換 (64/128bit)
スタック
PUSHスタックに値を入れる
POPスタックから取り出す
フラグ
CLCCF を 0 に
STCCF を 1 に
CMCCF を反転
CLDDF を 0 に
STDDF を 1 に
PUSHF
PUSHFD
PUSHFQ
rFLAGS を PUSH
POPF
POPFD
POPFQ
rFLAGS に POP
LAHFrFLAGS の下位8bitを AH レジスタに格納
SAHFAH の値を EFLAGS にセット
ほか
NOP何もしない
PAUSE一時停止
UD0
UD1
UD2
無効なオペコード例外を生成
RDPIDプロセッサ ID の読み込み
CPUIDプロセッサの識別
ポート
INポートからの入力
OUTポートへの出力
INS
INSB
INSW
INSD
ポートからメモリへの入力
OUTS
OUTSB
OUTSW
OUTSD
ポートにメモリの値を出力
割り込み
INT割り込み
移動
MOV reg/mem8, reg8   | 88 /r
MOV reg/mem16, reg16 | 89 /r
MOV reg/mem32, reg32 | 89 /r
MOV reg/mem64, reg64 | 89 /r

MOV reg8, reg/mem8   | 8A /r
MOV reg16, reg/mem16 | 8B /r
MOV reg32, reg/mem32 | 8B /r
MOV reg64, reg/mem64 | 8B /r

MOV reg8, imm8       | B0 +rb ib
MOV reg16, imm16     | B8 +rw iw
MOV reg32, imm32     | B8 +rd id
MOV reg64, imm64     | B8 +rq iq
MOV reg/mem8, imm8   | C6 /0 ib
MOV reg/mem16, imm16 | C7 /0 iw
MOV reg/mem32, imm32 | C7 /0 id
MOV reg/mem64, imm32 | C7 /0 id

MOV AL, moffset8     | A0
MOV AX, moffset16    | A1
MOV EAX, moffset32   | A1
MOV RAX, moffset64   | A1
MOV moffset8, AL     | A2
MOV moffset16, AX    | A3
MOV moffset32, EAX   | A3
MOV moffset64, RAX   | A3

MOV reg16/32/64/mem16,segReg | 8C /r
MOV segReg, reg/mem16        | 8E /r
レジスタ/メモリ/即値の値を、レジスタ/メモリにコピーします。
宛先とソースは同じサイズである必要があり、両方をメモリにすることはできません。

64bit モードで、32bit レジスタに値を格納した場合、レジスタの上位 32bit は 0 になります (ゼロ拡張)。

レジスタの値を 0 にしたい場合は、XOR で同じレジスタを指定した方が効率的です。
MOVBE reg16, mem16 | 0F 38 F0 /r
MOVBE reg32, mem32 | 0F 38 F0 /r
MOVBE reg64, mem64 | 0F 38 F0 /r
MOVBE mem16, reg16 | 0F 38 F1 /r
MOVBE mem32, reg32 | 0F 38 F1 /r
MOVBE mem64, reg64 | 0F 38 F1 /r
バイトオーダーを逆順にしながら、16/32/64bit の値をコピーします。

CPUID(MOVBE): 0000_0001h > ECX(bit22)
MOVD xmm, reg/mem32 | 66 0F 6E /r
MOVD mmx, reg/mem32 | 0F 6E /r
MOVD reg/mem32, xmm | 66 0F 7E /r
MOVD reg/mem32, mmx | 0F 7E /r

MOVQ mmx, reg/mem64 | 0F 6E /r
MOVQ xmm, reg/mem64 | 66 0F 6E /r
MOVQ reg/mem64, mmx | 0F 7E /r
MOVQ reg/mem64, xmm | 66 0F 7E /r
MMX or XMM レジスタと、汎用レジスタ/メモリ間で、値をコピーします。
宛先が MMX/XMM レジスタの場合、レジスタ全体にゼロ拡張されます。

CPUID: MMX, SSE2 (x64 には含まれている)
MOVNTI mem32, reg32 | 0F C3 /r
MOVNTI mem64, reg64 | 0F C3 /r
32/64bit の汎用レジスタの値を、メモリに格納します。
データがすぐに再使用される可能性が低いことを、プロセッサに示します。

CPUID: SSE2
LEA reg16, mem | 8D /r
LEA reg32, mem | 8D /r
LEA reg64, mem | 8D /r
指定されたメモリ位置のアドレスを計算して、そのアドレス値をレジスタに格納します。

MOV 命令とは違い、LEA 命令は、ソースオペランドでメモリ位置を指定し、そのアドレス値をコピーします。

LEA 命令では、「base + offset + index * scale」形式によるアドレス指定ができるため、その計算を行った上で、アドレスの絶対位置を取得したい時に使います。

ソースのアドレスサイズと、宛先のレジスタサイズが異なる場合、宛先のサイズに値を切り捨てるか、ゼロ拡張されます。

; 以下は同じ
; (EBX のアドレス位置を EAX にコピーする)
lea eax, [ebx]
mov eax, ebx

; EBX+EDI の結果のアドレスを EAX にコピーする
; これは単一の MOV 命令では実現できない
lea eax, [ebx+edi]
XLAT mem8 | D7
XLATB     | D7
seg:[rBX] の位置のバイト配列から、AL レジスタの符号なし整数をインデックス位置として使用して、バイト値を読み込み、AL レジスタに値をコピーします。

seg はデフォルトで DS セグメントになりますが、セグメントプレフィックスによって変更される場合があります。

rAX の上位ビットは変更されません。
この命令は、オペランドサイズの指定を無視します。

XLAT 命令では、rBX レジスタをベースとするメモリ位置を明示的に指定します。
ゼロ拡張/符号拡張/符号反転
MOVZX reg16, reg/mem8  | 0F B6 /r | 8 -> 16
MOVZX reg32, reg/mem8  | 0F B6 /r | 8 -> 32
MOVZX reg64, reg/mem8  | 0F B6 /r | 8 -> 64
MOVZX reg32, reg/mem16 | 0F B7 /r | 16 -> 32
MOVZX reg64, reg/mem16 | 0F B7 /r | 16 -> 64
8 or 16bit の値を、16/32/64bit にゼロ拡張してコピーします。
MOVSX reg16, reg/mem8  | 0F BE /r | 8 -> 16
MOVSX reg32, reg/mem8  | 0F BE /r | 8 -> 32
MOVSX reg64, reg/mem8  | 0F BE /r | 8 -> 64
MOVSX reg32, reg/mem16 | 0F BF /r | 16 -> 32
MOVSX reg64, reg/mem16 | 0F BF /r | 16 -> 64
8 or 16bit の値を、16/32/64bit に符号拡張してコピーします。
MOVSXD reg64, reg/mem32 | 63 /r
32bit 値を、64bit レジスタに符号拡張して移動します。

この命令は 64bit モードでのみ使用できます。
レガシー/互換モードでは、このオペコードは ARPL として解釈されます。

この命令では、32bit のソースオペランドを、64bit の結果に符号拡張するため、REX.W を 1 にする必要があります。
これがないと、オペランドサイズは 32bit になり、64bit レジスタにゼロ拡張されます。
オペランドサイズが 16bit の場合は、宛先の上位 48bit は変更せずに、16bit の値のみがコピーされます。
CBW  | 98 | AL -> AX
CWDE | 98 | AX -> EAX
CDQE | 98 | EAX -> RAX
AL/AX/EAX の値を、AX/EAX/RAX に符号拡張します。
CWD | 99 | AX -> DX:AX
CDQ | 99 | EAX -> EDX:EAX
CQO | 99 | RAX -> RDX:RAX
AX/EAX/RAX の値を、rDX:rAX に符号拡張します。
交換
BSWAP reg32 | 0F C8 +rd
BSWAP reg64 | 0F C8 +rq
レジスタの値のバイト順を反転させます。

16bit レジスタのバイトを交換したい場合は、XCHG AL, AH とします。

※Intel 486 より前ではサポートされていない。
XCHG AX, reg16  | 90 +rw
XCHG EAX, reg32 | 90 +rd
XCHG RAX, reg64 | 90 +rq
XCHG reg16, AX  | 90 +rw
XCHG reg32, EAX | 90 +rd
XCHG reg64, RAX | 90 +rq

XCHG reg8, reg/mem8   | 86 /r
XCHG reg16, reg/mem16 | 87 /r
XCHG reg32, reg/mem32 | 87 /r
XCHG reg64, reg/mem64 | 87 /r
XCHG reg/mem8, reg8   | 86 /r
XCHG reg/mem16, reg16 | 87 /r
XCHG reg/mem32, reg32 | 87 /r
XCHG reg/mem64, reg64 | 87 /r
2つのオペランドの値を交換します。

いずれかのオペランドがメモリを参照する場合、LOCK プレフィックスがあるかどうかに関係なく、自動的にロックします。

x86 では、通常、「XCHG EAX, EAX」 (オペコード 90h) が NOP として使用されます。
64bit モードでは、rAX のいずれかのサイズを交換する場合にのみ、オペコード 90h を、真の NOP として扱います。
そうでなければ、「XCHG EAX, EAX」では、RAX の上位 32bit が 0 になるため、「何も変化しない」という結果とは異なってしまいます。

適切な REX プレフィックスが使用されている場合は、オペコード 90h を使用して、rAX と r8 を交換することができます。
XADD reg/mem8, reg8   | 0F C0 /r
XADD reg/mem16, reg16 | 0F C1 /r
XADD reg/mem32, reg32 | 0F C1 /r
XADD reg/mem64, reg64 | 0F C1 /r
2つのオペランドの値を交換した後、2つの値を加算し、結果を第1オペランドに格納します。

メモリに書き込む場合、LOCK プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF
CMPXCHG reg/mem8, reg8   | 0F B0 /r
CMPXCHG reg/mem16, reg16 | 0F B1 /r
CMPXCHG reg/mem32, reg32 | 0F B1 /r
CMPXCHG reg/mem64, reg64 | 0F B1 /r
AL/AX/EAX/RAX レジスタの値を、第1オペランドの値と比較します。
値が等しい場合、第2オペランドの値を、第1オペランドにコピーし、ZF フラグを 1 にします。
それ以外の場合、第1オペランドの値を、rAX レジスタにコピーし、ZF フラグを 0 にします。

第1オペランドがメモリの場合、比較の結果に関係なく、書き込みサイクルを受け取ります。

メモリに書き込む場合、LOCK プレフィックスをサポートします。

※Intel 486 より前では、サポートされていない。
rFLAGS
CF, PF, AF, ZF, SF, OF
CMPXCHG8B mem64   | 0F C7 /1 m64
CMPXCHG16B mem128 | 0F C7 /1 m128
rDX:rAX レジスタの値を、メモリの 64bit or 128bit (8 or 16 byte) の値と比較します。

値が等しい場合、rCX:rBX レジスタの値をメモリにコピーし、ZF フラグを 1 にします。
そうでない場合、メモリの値を rDX:rAX レジスタにコピーし、ZF フラグを 0 にします。

2つのオペコードは同じだが、オペランドサイズ (REX プレフィックス) によって、サイズが判断されます。

16/32bit: CMPXCHG8B (EDX:EAX, ECX:EBX)
64bit: CMPXCHG16B (RDX:RAX, RCX:RBX)

LOCK プレフィックスをサポートしています。

CMPXCHG16B の場合、メモリは 16 byte にアライメントされている必要があります。そうでない場合、一般保護例外が生成されます。

[CPUID]
CMPXCHG8B : EAX = 0000_0001h > EDX(bit8) ※x64 には含まれている。
CMPXCHG16B : EAX = 0000_0001h > ECX(bit13)
rFLAGS
ZF
スタック
PUSH reg/mem16 | FF /6
PUSH reg/mem32 | FF /6 | x 64bit モード
PUSH reg/mem64 | FF /6
PUSH reg16 | 50 +rw
PUSH reg32 | 50 +rd | x 64bit モード
PUSH reg64 | 50 +rq
PUSH imm8  | 6A ib
PUSH imm16 | 68 iw
PUSH imm32 | 68 id
PUSH CS    | 0E | x 64bit モード
PUSH SS    | 16 | x 64bit モード
PUSH DS    | 1E | x 64bit モード
PUSH ES    | 06 | x 64bit モード
PUSH FS    | 0F A0
PUSH GS    | 0F A8
スタックポインタを減算した後、オペランドの値を、スタック (SS:rSP が指すメモリ位置) にコピーします。

※rSP レジスタ自体を PUSH した場合、スタック上に格納される値は、この命令の実行前の rSP 値になります。
※PUSH CS 命令はありますが、対応する POP CS はありません。

  • オペランドサイズ属性 (66h プレフィックス) で、rSP を減算する量が決まります。
    64bit モードでは、デフォルトで 64bit になります (ただし、即値は 8/16/32bit の各サイズでエンコードできる)。
  • アドレスサイズ属性 (67h プレフィックス) は、メモリオペランドのアドレス指定のみで使われます。
  • スタック・アドレスサイズ属性によって、SP/ESP/RSP のいずれを使うかが決まります。また、66h プレフィックスがない場合は、rSP を減算する量になります。
    (スタック・アドレスサイズは、現在のスタックセグメント記述子の B フラグによって、16bit か 32bit が決まります。64bit モードでは、常に 64bit です)
  • オペランドサイズが、スタック・アドレスサイズより小さい場合、スタック・アドレスサイズに符号拡張して格納されます。
  • 64bit モードで「PUSH CS/SS/DS/ES」を使用すると、無効なオペコード例外が生成されます。

[64bit モード時]
66h プレフィックスがあり、オペランドサイズが 16bit となる場合、格納されるサイズと RSP の減算量は 2 byte になります。
8/32bit 即値の場合は、64bit に符号拡張されて、64bit サイズで格納されます。
POP reg/mem16 | 8F /0
POP reg/mem32 | 8F /0 | x 64bit モード
POP reg/mem64 | 8F /0
POP reg16     | 58 +rw
POP reg32     | 58 +rd | x 64bit モード
POP reg64     | 58 +rq
POP DS        | 1F | x 64bit モード
POP ES        | 07 | x 64bit モード
POP SS        | 17 | x 64bit モード
POP FS        | 0F A1
POP GS        | 0F A9
スタックポインタ (SS:rSP) が指している位置から値を読み込んで、指定オペランドにコピーし、rSP をサイズ分加算します。

  • オペランドサイズ属性は、スタックポインタが加算される量 (2, 4, 8 byte) を決定します。
    64bit モードでは、デフォルトで 64bit であり、32bit オペランドサイズを指定できるプレフィックスはありません。
  • スタックサイズ属性によって、SP/ESP/RSP のいずれが使われるかが決まります。
  • セグメントレジスタをロードする場合、オペランドは、有効なセグメントセレクタである必要があります。
    セグメントセレクタがセグメントレジスタに POP されると、関連するすべての記述子情報をレジスタの隠し部分にロードして、検証します。
  • 64bit モードで「POP DS/ES/SS」を使用すると、無効なオペコード例外が生成されます。
  • この命令は、CS レジスタに値を POP できません。
フラグ
CLC | F8
キャリーフラグ (CF) を 0 にクリアする。
rFLAGS
CF = 0
STC | F9
キャリーフラグ (CF) を 1 にセットする。
rFLAGS
CF = 1
CMC | F5
キャリーフラグ (CF) を反転する。
rFLAGS
CF
CLD | FC
方向フラグ (DF) を 0 にクリアする。
0 の場合、rSI/rDI をインクリメントする。
rFLAGS
DF = 0
STD | FD
方向フラグ (DF) を 1 にセットする。
1 の場合、rSI/rDI をデクリメントする。
PUSHF  | 9C | FLAGS
PUSHFD | 9C | EFLAGS | x 64bit モード
PUSHFQ | 9C | RFLAGS
rFLAGS レジスタの値 (VM と RF フラグを除く) を、スタックに PUSH します。
この命令は、PUSH する前に、VM と RF フラグをクリアします。

64bit モードでは、デフォルトで 64bit のオペランドサイズになります。32bit として指定できるプレフィックスはありません。

仮想 8086 モードでは、システムソフトウェアが、IOPL フィールドを 3 未満の値に設定している場合、VME が有効になっていない時またはオペランドサイズが 16bit でない時に、アプリケーションソフトウェアが PUSHFx/POPFx を実行しようとすると、一般保護例外が発生します。
POPF  | 9D
POPFD | 9D | x 64bit モード
POPFQ | 9D
スタックから、FLAGS/EFLAGS/RFLAGS レジスタに値を POP します。

プロテクトモードまたはリアルモードでは、変更されない VIP, VIF, VM フラグを除いて、rFLAGS のすべての非予約フラグを変更できます。
プロテクトモードでは、0 より大きい特権レベルでも、IOPL は変更されません。
この命令は、CPL が IOPL 以下の場合にのみ、割り込みフラグ (IF) を変更します。

仮想 8086 モードでは、IOPL フィールドが 3 未満の場合、VME が有効でない時またはオペランドサイズが 16bit でない時に、POPFx/PUSHFx 命令を実行しようとすると、#GP 例外が生成されます。

64bit モードでは、デフォルトで 64bit のオペランドサイズになります。32bit として指定できるプレフィックスはありません。
LAHF | 9F
rFLAGS の下位 8bit 値 (SF, ZF, AF, PF, CF を含む) を、AH レジスタに格納します。

AH レジスタの bit 1, 3, 5 は、それぞれ 1, 0, 0 になります。

64bit モードの場合、CPUID でサポートされている場合のみ使用できます。
他の動作モード (互換モードを含む) では、常に使用できます。

CPUID(LahfSahf): EAX = 8000_0001h > ECX(bit0)
SAHF | 9E
AH レジスタに格納されている SF, ZF, AF, PF, CF (bit 7,6,4,2,0) の値を、EFLAGS レジスタにセットします。

この命令は、AH の bit 1, 3, 5 は無視します。EFLAGS レジスタのこれらのビットは、それぞれ 1, 0, 0 に設定されます。

64bit モードの場合、CPUID でサポートされている場合のみ使用できます。
他の動作モード (互換モードを含む) では、常に使用できます。

CPUID(LahfSahf): EAX = 8000_0001h > ECX(bit0)
ほか
NOP | 90
NOP reg/mem16 | 0F 1F /0
NOP reg/mem32 | 0F 1F /0
NOP reg/mem64 | 0F 1F /0
何もしません。

オペランド指定のない NOP は、「XCHG rAX, rAX」と同じオペコードになります。

オペランド指定のある NOP 命令は、サポートされているプロセッサでは操作を実行せず、サポートしていないプロセッサでは、未定義のオペコード例外を生成します。
使用法としては、2〜9 byte のバイナリコードを、何もしない一つの命令にしたい時に使います (一つの NOP を何回も繰り返す代わりに)。

2 bytes66 NOP66 90H
3 bytesNOP DWORD ptr [EAX]0F 1F 00H
4 bytesNOP DWORD ptr [EAX + 00H]0F 1F 40 00H
5 bytesNOP DWORD ptr [EAX + EAX*1 + 00H]0F 1F 44 00 00H
6 bytes66 NOP DWORD ptr [EAX + EAX*1 + 00H]66 0F 1F 44 00 00H
7 bytesNOP DWORD ptr [EAX + 00000000H]0F 1F 80 00 00 00 00H
8 bytesNOP DWORD ptr [EAX + EAX*1 + 00000000H]0F 1F 84 00 00 00 00 00H
9 bytes66 NOP DWORD ptr [EAX + EAX*1 + 00000000H]66 0F 1F 84 00 00 00 00 00H
PAUSE | F3 90
現在のコードがスピンループ内にあるというヒントをプロセッサに提供することで、スピンループのパフォーマンスを向上させます。
プロセッサはこれを使用して、スピンループ内の電力消費を最適化できます。

アーキテクチャ的には、NOP 命令のように動作します。
PAUSE をサポートしないプロセッサでは、NOP 命令として扱います。
UD0 | 0F FF
UD1 | 0F B9 /r
UD2 | 0F 0B
無効なオペコード例外を生成します。
無効なオペコード例外を明示的に生成するソフトウェアのテストのために提供されています。

例外の送信によって保存された rIP は UD 命令の位置を示します (次の命令ではありません)。
RDPID reg32 | F3 0F C7 /7
RDPID reg64 | F3 0F C7 /7
TSC_AUX MSR の値を、宛先レジスタに格納します。
オペランドサイズのプレフィックスは適用されず、現在のモードに基づいて、32/64bit のいずれかになります。

TSC_AUX MSR の内容 (プロセッサ ID を実際に示す方法や、示すかどうかも含めて) は、オペレーティングシステムの規則によって決まります。

[Intel] CPUID: 0000_0007h (ECX = 0) > ECX(bit22)
[AMD] CPUID: 0000_0007h (ECX = 0) > EBX(bit22)
CPUID | 0F A2
プロセッサと、その機能に関する情報を取得します。

CPUID 命令を実行する前に、機能番号を EAX レジスタにセットします。サブ番号がある場合は、ECX にセットします。
実行後、EAX, EBX, ECX, EDX レジスタに値が返ります。

標準機能と拡張機能の2つがあり、0000_xxxxh は標準機能、8000_xxxxh は拡張機能です。

プロセッサがサポートする、最大の拡張機能番号を確認するには、EAX = 8000_0000h を実行します。
EAX で返された値が 8000_0000h より大きい場合、プロセッサは拡張機能をサポートしています。

64bit モードでは、32bit レジスタの結果は、64bit にゼロ拡張されます。
ポート
IN AL, imm8  | E4 ib
IN AX, imm8  | E5 ib
IN EAX, imm8 | E5 ib
IN AL, DX    | EC
IN AX, DX    | ED
IN EAX, DX   | ED
I/O ポートから、AL/AX/EAX レジスタに入力を転送します。

ポートアドレスは、8bit 即値 (00h 〜 FFh) または、DX レジスタの 16bit の値 (0000h 〜 FFFFh) で指定されます。
プロセッサの I/O アドレス空間は、システムメモリのアドレス指定とは異なります。

即値指定の場合、ポートのデータサイズは 8bit に固定されます。
レジスタ指定の場合、オペランドサイズによって、ポートサイズが決まります。

オペランドサイズが 64bit の場合、I/O ポートから 32bit 値のみを読み取ります。
OUT imm8, AL  | E6 ib
OUT imm8, AX  | E7 ib
OUT imm8, EAX | E7 ib
OUT DX, AL    | EE
OUT DX, AX    | EF
OUT DX, EAX   | EF
AL/AX/EAX レジスタの値を、第1オペランドで指定された I/O ポートに出力します。

ポートアドレスは、即値 (00h 〜 FFh) または DX レジスタの値 (0000h 〜 FFFFh) です。
使用されるソースレジスタによって、ポートのサイズ (8/16/32bit) が決まります。

オペランドサイズが 64bit の場合、I/O ポートに 32bit のみ書き込みます。
INS mem8, DX  | 6C
INS mem16, DX | 6D
INS mem32, DX | 6D
INSB | 6C
INSW | 6D
INSD | 6D
DX レジスタで指定された I/O ポートから、rDI レジスタで指定されたバッファに入力データを転送し、rFLAGS の DF フラグの設定に従って、rDI レジスタをインクリメントまたはデクリメントします。

16/32bit のモードでは、常にデータセグメントとして ES を使用します。
ES セグメントは、セグメントプレフィックスで変更できません。

INS 命令は、明示的にメモリオペランドと DX を指定します。メモリ位置は常に ES:[rDI] を使用します。

INSB/INSW/INSD 命令は、DX レジスタで指定された I/O ポート (0000h 〜 FFFFh) から、ES:rDI レジスタで指定された入力バッファに、それぞれ 8bit/16bit/32bit のデータをコピーします。

オペランドサイズが 64bit の場合、32bit であるかのように動作します。

REP プレフィックスをサポートしています。
OUTS DX, mem8  | 6E
OUTS DX, mem16 | 6F
OUTS DX, mem32 | 6F
OUTSB | 6E
OUTSW | 6F
OUTSD | 6F
DS:rSI で指定されたメモリ位置から、DX レジスタで指定された I/O ポートアドレス (0000h 〜 FFFFh) にデータを出力し、rFLAGS の DF フラグの設定に従って、rSI レジスタをインクリメントまたはデクリメントします。

OUTS 命令は、DX とメモリ位置を明示的に指定します。メモリ位置は、常に DS:rSI を使用します。

オペランドサイズが 64bit の場合、32bit であるかのように動作します。
割り込み
INT imm8 | CD ib
符号なし 8bit の即値で指定された割り込みハンドラに、実行を移します。
即値は割り込みベクトル番号 (00h 〜 FFh) であり、プロセッサはこれを、割り込み記述子テーブル (IDT) へのインデックスとして使用します。
rFLAGS
IF, NT, VM, AC, VIF は変更。TF, RF = 0。