移動 | |
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 | スタックから取り出す |
フラグ | |
CLC | CF を 0 に |
STC | CF を 1 に |
CMC | CF を反転 |
CLD | DF を 0 に |
STD | DF を 1 に |
PUSHF PUSHFD PUSHFQ | rFLAGS を PUSH |
POPF POPFD POPFQ | rFLAGS に POP |
LAHF | rFLAGS の下位8bitを AH レジスタに格納 |
SAHF | AH の値を 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 で同じレジスタを指定した方が効率的です。
宛先とソースは同じサイズである必要があり、両方をメモリにすることはできません。
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)
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 には含まれている)
宛先が MMX/XMM レジスタの場合、レジスタ全体にゼロ拡張されます。
CPUID: MMX, SSE2 (x64 には含まれている)
MOVNTI mem32, reg32 | 0F C3 /r MOVNTI mem64, reg64 | 0F C3 /r
32/64bit の汎用レジスタの値を、メモリに格納します。
データがすぐに再使用される可能性が低いことを、プロセッサに示します。
CPUID: SSE2
データがすぐに再使用される可能性が低いことを、プロセッサに示します。
CPUID: SSE2
LEA reg16, mem | 8D /r LEA reg32, mem | 8D /r LEA reg64, mem | 8D /r
指定されたメモリ位置のアドレスを計算して、そのアドレス値をレジスタに格納します。
MOV 命令とは違い、LEA 命令は、ソースオペランドでメモリ位置を指定し、そのアドレス値をコピーします。
LEA 命令では、「base + offset + index * scale」形式によるアドレス指定ができるため、その計算を行った上で、アドレスの絶対位置を取得したい時に使います。
ソースのアドレスサイズと、宛先のレジスタサイズが異なる場合、宛先のサイズに値を切り捨てるか、ゼロ拡張されます。
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 レジスタをベースとするメモリ位置を明示的に指定します。
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 の値のみがコピーされます。
この命令は 64bit モードでのみ使用できます。
レガシー/互換モードでは、このオペコードは ARPL として解釈されます。
この命令では、32bit のソースオペランドを、64bit の結果に符号拡張するため、REX.W を 1 にする必要があります。
これがないと、オペランドサイズは 32bit になり、64bit レジスタにゼロ拡張されます。
オペランドサイズが 16bit の場合は、宛先の上位 48bit は変更せずに、16bit の値のみがコピーされます。
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 より前ではサポートされていない。
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 を交換することができます。
いずれかのオペランドがメモリを参照する場合、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 プレフィックスをサポートします。
メモリに書き込む場合、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 より前では、サポートされていない。
値が等しい場合、第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)
値が等しい場合、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 はありません。
[64bit モード時]
66h プレフィックスがあり、オペランドサイズが 16bit となる場合、格納されるサイズと RSP の減算量は 2 byte になります。
8/32bit 即値の場合は、64bit に符号拡張されて、64bit サイズで格納されます。
※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 できません。
フラグ
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 を実行しようとすると、一般保護例外が発生します。
この命令は、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 として指定できるプレフィックスはありません。
プロテクトモードまたはリアルモードでは、変更されない 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)
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)
この命令は、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 を何回も繰り返す代わりに)。
オペランド指定のない NOP は、「XCHG rAX, rAX」と同じオペコードになります。
オペランド指定のある NOP 命令は、サポートされているプロセッサでは操作を実行せず、サポートしていないプロセッサでは、未定義のオペコード例外を生成します。
使用法としては、2〜9 byte のバイナリコードを、何もしない一つの命令にしたい時に使います (一つの NOP を何回も繰り返す代わりに)。
2 bytes | 66 NOP | 66 90H |
---|---|---|
3 bytes | NOP DWORD ptr [EAX] | 0F 1F 00H |
4 bytes | NOP DWORD ptr [EAX + 00H] | 0F 1F 40 00H |
5 bytes | NOP DWORD ptr [EAX + EAX*1 + 00H] | 0F 1F 44 00 00H |
6 bytes | 66 NOP DWORD ptr [EAX + EAX*1 + 00H] | 66 0F 1F 44 00 00H |
7 bytes | NOP DWORD ptr [EAX + 00000000H] | 0F 1F 80 00 00 00 00H |
8 bytes | NOP DWORD ptr [EAX + EAX*1 + 00000000H] | 0F 1F 84 00 00 00 00 00H |
9 bytes | 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] | 66 0F 1F 84 00 00 00 00 00H |
PAUSE | F3 90
現在のコードがスピンループ内にあるというヒントをプロセッサに提供することで、スピンループのパフォーマンスを向上させます。
プロセッサはこれを使用して、スピンループ内の電力消費を最適化できます。
アーキテクチャ的には、NOP 命令のように動作します。
PAUSE をサポートしないプロセッサでは、NOP 命令として扱います。
プロセッサはこれを使用して、スピンループ内の電力消費を最適化できます。
アーキテクチャ的には、NOP 命令のように動作します。
PAUSE をサポートしないプロセッサでは、NOP 命令として扱います。
UD0 | 0F FF UD1 | 0F B9 /r UD2 | 0F 0B
無効なオペコード例外を生成します。
無効なオペコード例外を明示的に生成するソフトウェアのテストのために提供されています。
例外の送信によって保存された rIP は UD 命令の位置を示します (次の命令ではありません)。
無効なオペコード例外を明示的に生成するソフトウェアのテストのために提供されています。
例外の送信によって保存された 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)
オペランドサイズのプレフィックスは適用されず、現在のモードに基づいて、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 にゼロ拡張されます。
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 値のみを読み取ります。
ポートアドレスは、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 のみ書き込みます。
ポートアドレスは、即値 (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 プレフィックスをサポートしています。
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 であるかのように動作します。
OUTS 命令は、DX とメモリ位置を明示的に指定します。メモリ位置は、常に DS:rSI を使用します。
オペランドサイズが 64bit の場合、32bit であるかのように動作します。
割り込み