加算/減算 | |
ADD | 加算 |
---|---|
ADC | キャリー付き加算 |
ADCX | キャリー付き加算 (符号なし) |
ADOX | OF 付きの符号なし加算 |
SUB | 減算 |
SBB | キャリー付き減算 |
INC | インクリメント |
DEC | デクリメント |
NEG | 符号反転 |
乗算/除算 | |
MUL | 乗算 (符号なし) |
IMUL | 乗算 (符号付き) |
DIV | 除算 (符号なし) |
IDIV | 除算 (符号付き) |
論理演算 | |
AND | 論理積 |
OR | 論理和 |
XOR | 排他的論理和 |
NOT | ビット反転 |
ビットシフト | |
SAL SHL | 左シフト |
SHR | 右シフト (符号なし) |
SAR | 右シフト (符号付き) |
SHLD | 左ダブルシフト |
SHRD | 右ダブルシフト |
ビット回転 | |
ROL | ビットを左回転 |
ROR | ビットを右回転 |
RCL | ビットを左回転 (CF付き) |
RCR | ビットを右回転 (CF付き) |
ビット操作 | |
BSF | 最下位の 1 のビットを検索 |
BSR | 最上位の 1 のビットを検索 |
POPCNT | ビットが 1 の個数を数える |
LZCNT | 上位の 0 のビット数を数える |
ほか | |
CRC32 | CRC32 の計算 |
加算/減算
ADD AL, imm8 | 04 ib ADD AX, imm16 | 05 iw ADD EAX, imm32 | 05 id ADD RAX, imm32 | 05 id ADD reg/mem8, imm8 | 80 /0 ib ADD reg/mem16, imm16 | 81 /0 iw ADD reg/mem32, imm32 | 81 /0 id ADD reg/mem64, imm32 | 81 /0 id ADD reg/mem16, imm8 | 83 /0 ib ADD reg/mem32, imm8 | 83 /0 ib ADD reg/mem64, imm8 | 83 /0 ib ADD reg/mem8, reg8 | 00 /r ADD reg/mem16, reg16 | 01 /r ADD reg/mem32, reg32 | 01 /r ADD reg/mem64, reg64 | 01 /r ADD reg8, reg/mem8 | 02 /r ADD reg16, reg/mem16 | 03 /r ADD reg32, reg/mem32 | 03 /r ADD reg64, reg/mem64 | 03 /r
2つのオペランドの値を加算し、結果を第1オペランドに格納します。
符号付き/符号なしのどちらとして扱っても、加算後の結果は同じになります。
即値オペランドの値は、第1オペランドのサイズと同じになるように、符号拡張されます。
この命令は、符号付きと符号なしの両方の結果を評価して、結果を OF フラグと CF フラグに設定します。SF フラグで、結果の符号を示します。
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
符号付き/符号なしのどちらとして扱っても、加算後の結果は同じになります。
即値オペランドの値は、第1オペランドのサイズと同じになるように、符号拡張されます。
この命令は、符号付きと符号なしの両方の結果を評価して、結果を OF フラグと CF フラグに設定します。SF フラグで、結果の符号を示します。
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF
ADC AL, imm8 | 14 ib ADC AX, imm16 | 15 iw ADC EAX, imm32 | 15 id ADC RAX, imm32 | 15 id ADC reg/mem8, imm8 | 80 /2 ib ADC reg/mem16, imm16 | 81 /2 iw ADC reg/mem32, imm32 | 81 /2 id ADC reg/mem64, imm32 | 81 /2 id ADC reg/mem16, imm8 | 83 /2 ib ADC reg/mem32, imm8 | 83 /2 ib ADC reg/mem64, imm8 | 83 /2 ib ADC reg/mem8, reg8 | 10 /r ADC reg/mem16, reg16 | 11 /r ADC reg/mem32, reg32 | 11 /r ADC reg/mem64, reg64 | 11 /r ADC reg8, reg/mem8 | 12 /r ADC reg16, reg/mem16 | 13 /r ADC reg32, reg/mem32 | 13 /r ADC reg64, reg/mem64 | 13 /r
2つのオペランドと、キャリーフラグ (0 or 1) の値を加算し、結果を第1オペランドに格納します。
複数の値で連結された数値の加算を行う時に使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
複数の値で連結された数値の加算を行う時に使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
rFLAGS
CF, PF, AF, ZF, SF, OF
ADCX reg32, reg/mem32 | 66 0F 38 F6 /r ADCX reg64, reg/mem64 | 66 0F 38 F6 /r
2つのオペランドと、キャリーフラグ (0 or 1) の値を加算し、結果を第1オペランドに格納します。
この命令は、符号なしの加算に基づいて、CF を設定します。
加算の開始時に、CF を初期状態 (0) にして使います。
CF を直接クリアする命令はありませんが、XOR 命令などの、CF が常に 0 になる命令を使うことで、実行できます。
CPUID(ADX): EAX = 0000_0007h > EBX(bit19)
この命令は、符号なしの加算に基づいて、CF を設定します。
加算の開始時に、CF を初期状態 (0) にして使います。
CF を直接クリアする命令はありませんが、XOR 命令などの、CF が常に 0 になる命令を使うことで、実行できます。
CPUID(ADX): EAX = 0000_0007h > EBX(bit19)
rFLAGS
CF
ADOX reg32, reg/mem32 | F3 0F 38 F6 /r ADOX reg64, reg/mem64 | F3 0F 38 F6 /r
2つのオペランドと、オーバーフローフラグ (0 or 1) の値を加算し、結果を第1オペランドに格納します。
符号なし加算で桁あふれが起こった場合、CF ではなく、OF を 1 にします。
CPUID(ADX): EAX = 0000_0007h > EBX(bit19)
符号なし加算で桁あふれが起こった場合、CF ではなく、OF を 1 にします。
CPUID(ADX): EAX = 0000_0007h > EBX(bit19)
rFLAGS
OF
SUB AL, imm8 | 2C ib SUB AX, imm16 | 2D iw SUB EAX, imm32 | 2D id SUB RAX, imm32 | 2D id SUB reg/mem8, imm8 | 80 /5 ib SUB reg/mem16, imm16 | 81 /5 iw SUB reg/mem32, imm32 | 81 /5 id SUB reg/mem64, imm32 | 81 /5 id SUB reg/mem16, imm8 | 83 /5 ib SUB reg/mem32, imm8 | 83 /5 ib SUB reg/mem64, imm8 | 83 /5 ib SUB reg/mem8, reg8 | 28 /r SUB reg/mem16, reg16 | 29 /r SUB reg/mem32, reg32 | 29 /r SUB reg/mem64, reg64 | 29 /r SUB reg8, reg/mem8 | 2A /r SUB reg16, reg/mem16 | 2B /r SUB reg32, reg/mem32 | 2B /r SUB reg64, reg/mem64 | 2B /r
第1オペランドの値から、第2オペランドの値を減算し、結果を第1オペランドに格納します。
即値オペランドの値は、第1オペランドのサイズに符号拡張されます。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
即値オペランドの値は、第1オペランドのサイズに符号拡張されます。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF
SBB AL, imm8 | 1C ib SBB AX, imm16 | 1D iw SBB EAX, imm32 | 1D id SBB RAX, imm32 | 1D id SBB reg/mem8, imm8 | 80 /3 ib SBB reg/mem16, imm16 | 81 /3 iw SBB reg/mem32, imm32 | 81 /3 id SBB reg/mem64, imm32 | 81 /3 id SBB reg/mem16, imm8 | 83 /3 ib SBB reg/mem32, imm8 | 83 /3 ib SBB reg/mem64, imm8 | 83 /3 ib SBB reg/mem8, reg8 | 18 /r SBB reg/mem16, reg16 | 19 /r SBB reg/mem32, reg32 | 19 /r SBB reg/mem64, reg64 | 19 /r SBB reg8, reg/mem8 | 1A /r SBB reg16, reg/mem16 | 1B /r SBB reg32, reg/mem32 | 1B /r SBB reg64, reg/mem64 | 1B /r
第1オペランドの値から、第2オペランドとキャリーフラグ (0 or 1) の値を減算し、結果を第1オペランドに格納します。
rFLAGS
CF, PF, AF, ZF, SF, OF
INC reg/mem8 | FE /0 INC reg/mem16 | FF /0 INC reg/mem32 | FF /0 INC reg/mem64 | FF /0 INC reg16 | 40 +r INC reg32 | 40 +rd
オペランドの値に 1 を加算します。
加算した結果、桁あふれして 0 になったとしても、CF フラグは影響を受けません。
CF フラグを設定させたい場合は、ADD 命令を使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
加算した結果、桁あふれして 0 になったとしても、CF フラグは影響を受けません。
CF フラグを設定させたい場合は、ADD 命令を使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
rFLAGS
PF, AF, ZF, SF, OF (CF は変更されない)
DEC reg/mem8 | FE /1 DEC reg/mem16 | FF /1 DEC reg/mem32 | FF /1 DEC reg/mem64 | FF /1 DEC reg16 | 48 +rw DEC reg32 | 48 +rd
オペランドの値から 1 を減算します。
0 から 1 を引いた場合でも、CF フラグは影響を受けません。
CF フラグを設定させたい場合は、SUB 命令を使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
0 から 1 を引いた場合でも、CF フラグは影響を受けません。
CF フラグを設定させたい場合は、SUB 命令を使います。
メモリに書き込む場合、LOCK プレフィックスをサポートしています。
rFLAGS
PF, AF, ZF, SF, OF (CF は変更されない)
NEG reg/mem8 | F6 /3 NEG reg/mem16 | F7 /3 NEG reg/mem32 | F7 /3 NEG reg/mem64 | F7 /3
0 からオペランドの値を減算することにより、符号の反転を行います。
元の値が 0 の場合は、CF = 0。それ以外の場合は、CF = 1 になります。
それ以外のフラグは、結果の値により設定されます。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
元の値が 0 の場合は、CF = 0。それ以外の場合は、CF = 1 になります。
それ以外のフラグは、結果の値により設定されます。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF
乗算/除算
MUL reg/mem8 | F6 /4 | op * AL -> AX MUL reg/mem16 | F7 /4 | op * AX -> DX:AX MUL reg/mem32 | F7 /4 | op * EAX -> EDX:EAX MUL reg/mem64 | F7 /4 | op * RAX -> RDX:RAX
符号なしのオペランドの値と、AL/AX/EAX/RAX の値を乗算し、結果を、AX, DX:AX, EDX:EAX, RDX:RAX に格納します (オペランドサイズによって異なる)。
結果の上半分が 0 以外になった場合 (元のサイズから桁あふれした場合)、CF と OF を 1 に設定します。それ以外の場合、CF と OF を 0 にします。
結果の上半分が 0 以外になった場合 (元のサイズから桁あふれした場合)、CF と OF を 1 に設定します。それ以外の場合、CF と OF を 0 にします。
rFLAGS
CF, OF は変更。SF, ZF, AF, PF は未定義。
IMUL reg/mem8 | F6 /5 IMUL reg/mem16 | F7 /5 IMUL reg/mem32 | F7 /5 IMUL reg/mem64 | F7 /5 IMUL reg16, reg/mem16 | 0F AF /r IMUL reg32, reg/mem32 | 0F AF /r IMUL reg64, reg/mem64 | 0F AF /r IMUL reg16, reg/mem16, imm8 | 6B /r ib IMUL reg32, reg/mem32, imm8 | 6B /r ib IMUL reg64, reg/mem64, imm8 | 6B /r ib IMUL reg16, reg/mem16, imm16 | 69 /r iw IMUL reg32, reg/mem32, imm32 | 69 /r id IMUL reg64, reg/mem64, imm32 | 69 /r id
符号付きの2つのオペランド値を乗算します。
オペランドが1つの場合、オペランドの値と、AL/AX/EAX/RAX レジスタの値を乗算し、結果を AX, DX:AX, EDX:EAX, RDX:RAX に格納します。
オペランドが2つの場合、第1オペランドと第2オペランドを乗算し、結果の下位の値を第1オペランドに格納します。
オペランドが3つの場合、第2オペランドと第3オペランド (即値) を乗算し、結果を第1オペランドに格納します。
即値オペランドの値は、他のレジスタ/メモリのサイズまで符号拡張します。
結果の値が、オーバーフローにより、ソースサイズの符号付きで表現できる値の範囲を超えた場合、CF フラグと OF フラグがセットされます。
それ以外の場合、CF フラグと OF フラグはクリアされます。
オペランドが1つの場合、オペランドの値と、AL/AX/EAX/RAX レジスタの値を乗算し、結果を AX, DX:AX, EDX:EAX, RDX:RAX に格納します。
オペランドが2つの場合、第1オペランドと第2オペランドを乗算し、結果の下位の値を第1オペランドに格納します。
オペランドが3つの場合、第2オペランドと第3オペランド (即値) を乗算し、結果を第1オペランドに格納します。
即値オペランドの値は、他のレジスタ/メモリのサイズまで符号拡張します。
結果の値が、オーバーフローにより、ソースサイズの符号付きで表現できる値の範囲を超えた場合、CF フラグと OF フラグがセットされます。
それ以外の場合、CF フラグと OF フラグはクリアされます。
rFLAGS
CF, OF は変更。SF, ZF, AF, PF は未定義。
DIV reg/mem8 | F6 /6 DIV reg/mem16 | F7 /6 DIV reg/mem32 | F7 /6 DIV reg/mem64 | F7 /6
符号なし値として、特定のレジスタに格納されている値を、オペランドの値で除算します。
商と剰余は、それぞれ特定のレジスタに格納されます。
小数点以下の結果は、0 の方向に切り捨てられます。
オーバーフローが発生する場合、CF フラグが設定されるのではなく、#DE (除算エラー) 例外が生成されます。
ゼロで割った場合、ゼロ除算例外を生成します。
商と剰余は、それぞれ特定のレジスタに格納されます。
オペランド | 被除数 | 商 | 剰余 |
8bit | AX | AL | AH |
---|---|---|---|
16bit | DX:AX | AX | DX |
32bit | EDX:EAX | EAX | EDX |
64bit | RDX:RAX | RAX | RDX |
小数点以下の結果は、0 の方向に切り捨てられます。
オーバーフローが発生する場合、CF フラグが設定されるのではなく、#DE (除算エラー) 例外が生成されます。
ゼロで割った場合、ゼロ除算例外を生成します。
rFLAGS
CF, OF, SF, ZF, AF, PF は未定義となる。
IDIV reg/mem8 | F6 /7 IDIV reg/mem16 | F7 /7 IDIV reg/mem32 | F7 /7 IDIV reg/mem64 | F7 /7
符号付き除算を行う以外は、DIV 命令と同じです。
小数点以下の結果は、0 の方向に切り捨てます。
剰余の符号は、常に被除数の符号と同じであり、剰余の絶対値は、オペランドの絶対値より小さくなります。
オーバーフローが発生すると、OF フラグが設定されるのではなく、#DE (除算エラー) 例外が生成されます。
オーバーフローの問題を回避するには、この命令の前に符号拡張を行って、より大きなオペランドサイズで除算します。
小数点以下の結果は、0 の方向に切り捨てます。
剰余の符号は、常に被除数の符号と同じであり、剰余の絶対値は、オペランドの絶対値より小さくなります。
オーバーフローが発生すると、OF フラグが設定されるのではなく、#DE (除算エラー) 例外が生成されます。
オーバーフローの問題を回避するには、この命令の前に符号拡張を行って、より大きなオペランドサイズで除算します。
rFLAGS
CF, OF, SF, ZF, AF, PF は未定義となる。
論理演算
AND AL, imm8 | 24 ib AND AX, imm16 | 25 iw AND EAX, imm32 | 25 id AND RAX, imm32 | 25 id AND reg/mem8, imm8 | 80 /4 ib AND reg/mem16, imm16 | 81 /4 iw AND reg/mem32, imm32 | 81 /4 id AND reg/mem64, imm32 | 81 /4 id AND reg/mem16, imm8 | 83 /4 ib AND reg/mem32, imm8 | 83 /4 ib AND reg/mem64, imm8 | 83 /4 ib AND reg/mem8, reg8 | 20 /r AND reg/mem16, reg16 | 21 /r AND reg/mem32, reg32 | 21 /r AND reg/mem64, reg64 | 21 /r AND reg8, reg/mem8 | 22 /r AND reg16, reg/mem16 | 23 /r AND reg32, reg/mem32 | 23 /r AND reg64, reg/mem64 | 23 /r
2つのオペランドの値で、ビット単位の論理積 (AND) を実行し、結果を第1オペランドに格納します。
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
0 0 -> 0 1 0 -> 0 0 1 -> 0 1 1 -> 1
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
rFLAGS
PF, ZF, SF は変更。CF, OF = 0。AF は未定義。
OR AL, imm8 | 0C ib OR AX, imm16 | 0D iw OR EAX, imm32 | 0D id OR RAX, imm32 | 0D id OR reg/mem8, imm8 | 80 /1 ib OR reg/mem16, imm16 | 81 /1 iw OR reg/mem32, imm32 | 81 /1 id OR reg/mem64, imm32 | 81 /1 id OR reg/mem16, imm8 | 83 /1 ib OR reg/mem32, imm8 | 83 /1 ib OR reg/mem64, imm8 | 83 /1 ib OR reg/mem8, reg8 | 08 /r OR reg/mem16, reg16 | 09 /r OR reg/mem32, reg32 | 09 /r OR reg/mem64, reg64 | 09 /r OR reg8, reg/mem8 | 0A /r OR reg16, reg/mem16 | 0B /r OR reg32, reg/mem32 | 0B /r OR reg64, reg/mem64 | 0B /r
2つのオペランドの値で論理和 (OR) を実行し、結果を第1オペランドに格納します。
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
0 0 -> 0 1 0 -> 1 0 1 -> 1 1 1 -> 1
メモリに書き込む場合は、LOCK プレフィックスをサポートします。
rFLAGS
PF, ZF, SF は変更。CF, OF = 0。AF は未定義。
XOR AL, imm8 | 34 ib XOR AX, imm16 | 35 iw XOR EAX, imm32 | 35 id XOR RAX, imm32 | 35 id XOR reg/mem8, imm8 | 80 /6 ib XOR reg/mem16, imm16 | 81 /6 iw XOR reg/mem32, imm32 | 81 /6 id XOR reg/mem64, imm32 | 81 /6 id XOR reg/mem16, imm8 | 83 /6 ib XOR reg/mem32, imm8 | 83 /6 ib XOR reg/mem64, imm8 | 83 /6 ib XOR reg/mem8, reg8 | 30 /r XOR reg/mem16, reg16 | 31 /r XOR reg/mem32, reg32 | 31 /r XOR reg/mem64, reg64 | 31 /r XOR reg8, reg/mem8 | 32 /r XOR reg16, reg/mem16 | 33 /r XOR reg32, reg/mem32 | 33 /r XOR reg64, reg/mem64 | 33 /r
2つのオペランドの値で、ビット単位の論理 XOR 演算を実行し、結果を第1オペランドに格納します。
同じレジスタに対して XOR 演算すると、値は常に 0 になります。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
同じレジスタに対して XOR 演算すると、値は常に 0 になります。
0 0 -> 0 1 0 -> 1 0 1 -> 1 1 1 -> 0
メモリに書き込む場合、LOCK プレフィックスをサポートします。
rFLAGS
PF, ZF, SF は変更。CF, OF = 0。AF は未定義。
NOT reg/mem8 | F6 /2 NOT reg/mem16 | F7 /2 NOT reg/mem32 | F7 /2 NOT reg/mem64 | F7 /2
オペランドのビットを反転します。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
メモリに書き込む場合、LOCK プレフィックスをサポートします。
ビットシフト
SAL reg/mem8, 1 | D0 /4 SAL reg/mem8, CL | D2 /4 SAL reg/mem8, imm8 | C0 /4 ib SAL reg/mem16, 1 | D1 /4 SAL reg/mem16, CL | D3 /4 SAL reg/mem16, imm8 | C1 /4 ib SAL reg/mem32, 1 | D1 /4 SAL reg/mem32, CL | D3 /4 SAL reg/mem32, imm8 | C1 /4 ib SAL reg/mem64, 1 | D1 /4 SAL reg/mem64, CL | D3 /4 SAL reg/mem64, imm8 | C1 /4 ib (SHL の場合も同じ)
第1オペランドの値を、第2オペランドで指定されたビット数だけ、左 (←) にシフトします。
SAL は符号付き、SHL は符号なしという意味ですが、結果の値はどちらも同じになるので、オペコードは変わりません。
シフト後の最下位ビットは 0 になります。
CF フラグには、最後にシフトされて外に出た最上位ビットの値が入ります。
シフト数の値は、マスクされて 0〜31 の範囲に制限されます (64bit 値の場合は、0〜63)。
1 ビットシフトの場合、OF フラグは、シフト後の CF ビットと、結果の最上位ビットの XOR (元の最上位ビットと、その右のビットでの XOR) に設定されます。
シフト数が 2 以上の場合、OF フラグは不定になります。
シフト数が 0 の場合、フラグは変更されません。
SAL は符号付き、SHL は符号なしという意味ですが、結果の値はどちらも同じになるので、オペコードは変わりません。
シフト後の最下位ビットは 0 になります。
CF フラグには、最後にシフトされて外に出た最上位ビットの値が入ります。
シフト数の値は、マスクされて 0〜31 の範囲に制限されます (64bit 値の場合は、0〜63)。
1 ビットシフトの場合、OF フラグは、シフト後の CF ビットと、結果の最上位ビットの XOR (元の最上位ビットと、その右のビットでの XOR) に設定されます。
シフト数が 2 以上の場合、OF フラグは不定になります。
シフト数が 0 の場合、フラグは変更されません。
rFLAGS
CF, PF, ZF, SF, OF は変更。AF は未定義。
SHR reg/mem8, 1 | D0 /5 SHR reg/mem8, CL | D2 /5 SHR reg/mem8, imm8 | C0 /5 ib SHR reg/mem16, 1 | D1 /5 SHR reg/mem16, CL | D3 /5 SHR reg/mem16, imm8 | C1 /5 ib SHR reg/mem32, 1 | D1 /5 SHR reg/mem32, CL | D3 /5 SHR reg/mem32, imm8 | C1 /5 ib SHR reg/mem64, 1 | D1 /5 SHR reg/mem64, CL | D3 /5 SHR reg/mem64, imm8 | C1 /5 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ、右 (→) にシフトします。
シフト後の最上位ビットは 0 になります。
CF フラグには、最後にシフトされて外に出た最下位ビットの値が入ります。
1 ビットシフトの場合、OF フラグは、元の最上位ビットと同じ値になります。シフト数が 2 以上の場合、OF フラグは未定義です。
シフト数が 0 の場合、フラグは変更されません。
シフト後の最上位ビットは 0 になります。
CF フラグには、最後にシフトされて外に出た最下位ビットの値が入ります。
1 ビットシフトの場合、OF フラグは、元の最上位ビットと同じ値になります。シフト数が 2 以上の場合、OF フラグは未定義です。
シフト数が 0 の場合、フラグは変更されません。
rFLAGS
CF, PF, ZF, SF, OF は変更。AF は未定義。
SAR reg/mem8, 1 | D0 /7 SAR reg/mem8, CL | D2 /7 SAR reg/mem8, imm8 | C0 /7 ib SAR reg/mem16, 1 | D1 /7 SAR reg/mem16, CL | D3 /7 SAR reg/mem16, imm8 | C1 /7 ib SAR reg/mem32, 1 | D1 /7 SAR reg/mem32, CL | D3 /7 SAR reg/mem32, imm8 | C1 /7 ib SAR reg/mem64, 1 | D1 /7 SAR reg/mem64, CL | D3 /7 SAR reg/mem64, imm8 | C1 /7 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ、右 (→) にシフトします。
シフト後の最上位ビットは、元の符号ビット (最上位ビット) がコピーされます。
CF フラグには、最後にシフトされて外に出た最下位ビットの値が入ります。
1 ビットシフトの場合、OF フラグは 0 になります。シフト数が 2 以上の場合、OF フラグは未定義です。
シフト数が 0 の場合、フラグは変更されません。
この命令は、値を 2^N で割るのと同じですが、負の値の場合、その動作は IDIV 命令とは異なります。
たとえば、-11 (FFFFFFF5h) を右に 2 回シフトすると (-11 を 4 で割ると)、結果は FFFFFFFDh (-3) になります。
しかし、IDIV 命令で -11 を 4 で割ると、結果は -2 になります。
これを避けるには、値が負の場合、値に ((1 << N) - 1) [N=シフト数] を足してからシフトすると、IDIV と同じ結果になります。
シフト後の最上位ビットは、元の符号ビット (最上位ビット) がコピーされます。
CF フラグには、最後にシフトされて外に出た最下位ビットの値が入ります。
1 ビットシフトの場合、OF フラグは 0 になります。シフト数が 2 以上の場合、OF フラグは未定義です。
シフト数が 0 の場合、フラグは変更されません。
この命令は、値を 2^N で割るのと同じですが、負の値の場合、その動作は IDIV 命令とは異なります。
たとえば、-11 (FFFFFFF5h) を右に 2 回シフトすると (-11 を 4 で割ると)、結果は FFFFFFFDh (-3) になります。
しかし、IDIV 命令で -11 を 4 で割ると、結果は -2 になります。
これを避けるには、値が負の場合、値に ((1 << N) - 1) [N=シフト数] を足してからシフトすると、IDIV と同じ結果になります。
rFLAGS
CF, PF, ZF, SF, OF は変更。AF は未定義。
SHLD reg/mem16, reg16, imm8 | 0F A4 /r ib SHLD reg/mem16, reg16, CL | 0F A5 /r SHLD reg/mem32, reg32, imm8 | 0F A4 /r ib SHLD reg/mem32, reg32, CL | 0F A5 /r SHLD reg/mem64, reg64, imm8 | 0F A4 /r ib SHLD reg/mem64, reg64, CL | 0F A5 /r
第1オペランドの値を、第3オペランドで指定されたビット数だけ左 (←) にシフトし、最下位ビットの値は、第2オペランドの最上位ビットから順に右方向に読み込んでセットします。
第2オペランドの値は変更されません。
シフト数がオペランドサイズのビット数より大きい場合、結果の値は未定義になります。
CF には、最後に外に出たビットが設定されます。
シフト数が 0 の場合、フラグは変更されません。
シフト数が 1 の時、第1オペランドの符号が変化した場合は、OF フラグを 1 に設定します。
シフト数が 2 以上の場合、OF は未定義です。
第2オペランドの値は変更されません。
シフト数がオペランドサイズのビット数より大きい場合、結果の値は未定義になります。
CF には、最後に外に出たビットが設定されます。
シフト数が 0 の場合、フラグは変更されません。
シフト数が 1 の時、第1オペランドの符号が変化した場合は、OF フラグを 1 に設定します。
シフト数が 2 以上の場合、OF は未定義です。
rFLAGS
CF, PF, ZF, SF, OF は変更。AF は未定義。
SHRD reg/mem16, reg16, imm8 | 0F AC /r ib SHRD reg/mem16, reg16, CL | 0F AD /r SHRD reg/mem32, reg32, imm8 | 0F AC /r ib SHRD reg/mem32, reg32, CL | 0F AD /r SHRD reg/mem64, reg64, imm8 | 0F AC /r ib SHRD reg/mem64, reg64, CL | 0F AD /r
第1オペランドの値を、第3オペランドで指定されたビット数だけ右 (→) にシフトし、最上位ビットは、第2オペランドの最下位ビットから順に左方向に読み込んでセットします。
第2オペランドの値は変更されません。
CF には、最後に外に出たビットが設定されます。
シフト数が 0 の場合、フラグは変更されません。
シフト数が 1 の時、第1オペランドの符号が変わると、OF フラグが 1 に設定されます。
シフト数が 2 以上の場合、OF フラグは未定義です。
第2オペランドの値は変更されません。
CF には、最後に外に出たビットが設定されます。
シフト数が 0 の場合、フラグは変更されません。
シフト数が 1 の時、第1オペランドの符号が変わると、OF フラグが 1 に設定されます。
シフト数が 2 以上の場合、OF フラグは未定義です。
rFLAGS
CF, PF, ZF, SF, OF は変更。AF は未定義。
ビット回転
ROL reg/mem8, 1 | D0 /0 ROL reg/mem8, CL | D2 /0 ROL reg/mem8, imm8 | C0 /0 ib ROL reg/mem16, 1 | D1 /0 ROL reg/mem16, CL | D3 /0 ROL reg/mem16, imm8 | C1 /0 ib ROL reg/mem32, 1 | D1 /0 ROL reg/mem32, CL | D3 /0 ROL reg/mem32, imm8 | C1 /0 ib ROL reg/mem64, 1 | D1 /0 ROL reg/mem64, CL | D3 /0 ROL reg/mem64, imm8 | C1 /0 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ左に回転 (←) します。
外に出た最上位ビットは、最下位ビットに戻ってきます。
CF フラグは、最後に回転された最上位ビット (結果の最下位ビット) に設定されます。
1 ビット回転の場合、OF フラグは、回転後の CF ビットと、結果の最上位ビットの XOR (元の最上位ビットと、その右のビットの XOR) に設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合、フラグは影響を受けません。
外に出た最上位ビットは、最下位ビットに戻ってきます。
CF フラグは、最後に回転された最上位ビット (結果の最下位ビット) に設定されます。
1 ビット回転の場合、OF フラグは、回転後の CF ビットと、結果の最上位ビットの XOR (元の最上位ビットと、その右のビットの XOR) に設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合、フラグは影響を受けません。
rFLAGS
CF, OF
ROR reg/mem8, 1 | D0 /1 ROR reg/mem8, CL | D2 /1 ROR reg/mem8, imm8 | C0 /1 ib ROR reg/mem16, 1 | D1 /1 ROR reg/mem16, CL | D3 /1 ROR reg/mem16, imm8 | C1 /1 ib ROR reg/mem32, 1 | D1 /1 ROR reg/mem32, CL | D3 /1 ROR reg/mem32, imm8 | C1 /1 ib ROR reg/mem64, 1 | D1 /1 ROR reg/mem64, CL | D3 /1 ROR reg/mem64, imm8 | C1 /1 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ、右に回転 (→) します。
外に出た最下位ビットは、最上位ビットに戻ってきます。
回転後、CF フラグは、最後に回転された最下位ビット (結果の最上位ビット) に設定されます。
1 ビット回転の場合、OF フラグを、結果の最上位 2 ビットで XOR (元の最上位ビットと、元の最下位ビットの XOR) したものに設定します。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合、フラグは影響を受けません。
外に出た最下位ビットは、最上位ビットに戻ってきます。
回転後、CF フラグは、最後に回転された最下位ビット (結果の最上位ビット) に設定されます。
1 ビット回転の場合、OF フラグを、結果の最上位 2 ビットで XOR (元の最上位ビットと、元の最下位ビットの XOR) したものに設定します。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合、フラグは影響を受けません。
rFLAGS
CF, OF
RCL reg/mem8,1 | D0 /2 RCL reg/mem8, CL | D2 /2 RCL reg/mem8, imm8 | C0 /2 ib RCL reg/mem16, 1 | D1 /2 RCL reg/mem16, CL | D3 /2 RCL reg/mem16, imm8 | C1 /2 ib RCL reg/mem32, 1 | D1 /2 RCL reg/mem32, CL | D3 /2 RCL reg/mem32, imm8 | C1 /2 ib RCL reg/mem64, 1 | D1 /2 RCL reg/mem64, CL | D3 /2 RCL reg/mem64, imm8 | C1 /2 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ、CF フラグ付きで、左に回転 (←) します。
最上位ビットの左に、CF フラグの 1bit を置いて、全体を 9bit として回転するのと同じになります。
最初の最下位ビットには、現在の CF フラグの値が入ります。
1 ビット回転の場合、OF フラグは、回転後 の CF ビットと、結果の最上位ビットの XOR に設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合は、フラグは影響を受けません。
最上位ビットの左に、CF フラグの 1bit を置いて、全体を 9bit として回転するのと同じになります。
最初の最下位ビットには、現在の CF フラグの値が入ります。
1 ビット回転の場合、OF フラグは、回転後 の CF ビットと、結果の最上位ビットの XOR に設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合は、フラグは影響を受けません。
rFLAGS
CF, OF
RCR reg/mem8, 1 | D0 /3 RCR reg/mem8,CL | D2 /3 RCR reg/mem8,imm8 | C0 /3 ib RCR reg/mem16,1 | D1 /3 RCR reg/mem16,CL | D3 /3 RCR reg/mem16, imm8 | C1 /3 ib RCR reg/mem32,1 | D1 /3 RCR reg/mem32,CL | D3 /3 RCR reg/mem32, imm8 | C1 /3 ib RCR reg/mem64,1 | D1 /3 RCR reg/mem64,CL | D3 /3 RCR reg/mem64, imm8 | C1 /3 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ、CF フラグ付きで、右に回転 (→) します。
最下位ビットの右に、CF フラグの 1bit を置いて、全体を 9bit として回転するのと同じになります。
最初の最上位ビットには、現在の CF フラグの値が入ります。
1 ビット回転の場合、OF フラグは、結果の最上位 2 ビットを XOR したものに設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合は、フラグは影響を受けません。
最下位ビットの右に、CF フラグの 1bit を置いて、全体を 9bit として回転するのと同じになります。
最初の最上位ビットには、現在の CF フラグの値が入ります。
1 ビット回転の場合、OF フラグは、結果の最上位 2 ビットを XOR したものに設定されます。
回数が 2 以上の場合、OF フラグは未定義です。
回数が 0 の場合は、フラグは影響を受けません。
rFLAGS
CF, OF
ビット操作
BSF reg16, reg/mem16 | 0F BC /r BSF reg32, reg/mem32 | 0F BC /r BSF reg64, reg/mem64 | 0F BC /r
第2オペランド内から、ビットが 1 になっている最下位の位置を探します。
1 のビットが見つかった場合、ZF をクリアし、そのビット位置 (最下位から順に 0〜) を、第1オペランドに格納します。
第2オペランドの値が 0 の場合、ZF を 1 にします。
その場合、AMD プロセッサでは、第1オペランドの内容は変更されません。Intel プロセッサでは未定義になります。
1 のビットが見つかった場合、ZF をクリアし、そのビット位置 (最下位から順に 0〜) を、第1オペランドに格納します。
第2オペランドの値が 0 の場合、ZF を 1 にします。
その場合、AMD プロセッサでは、第1オペランドの内容は変更されません。Intel プロセッサでは未定義になります。
rFLAGS
ZF は変更。CF, PF, AF, SF, OF は未定義。
BSR reg16, reg/mem16 | 0F BD /r BSR reg32, reg/mem32 | 0F BD /r BSR reg64, reg/mem64 | 0F BD /r
第2オペランド内から、ビットが 1 になっている最上位の位置を探します。
1 のビットが見つかった場合、ZF をクリアし、そのビット位置 (最下位から順に 0〜) を、第1オペランドに格納します。
第2オペランドの値が 0 の場合、ZF を 1 にします。
その場合、AMD プロセッサでは、第1オペランドの内容は変更されません。Intel プロセッサでは未定義になります。
1 のビットが見つかった場合、ZF をクリアし、そのビット位置 (最下位から順に 0〜) を、第1オペランドに格納します。
第2オペランドの値が 0 の場合、ZF を 1 にします。
その場合、AMD プロセッサでは、第1オペランドの内容は変更されません。Intel プロセッサでは未定義になります。
rFLAGS
ZF は変更。CF, PF, AF, SF, OF は未定義。
POPCNT reg16, reg/mem16 | F3 0F B8 /r POPCNT reg32, reg/mem32 | F3 0F B8 /r POPCNT reg64, reg/mem64 | F3 0F B8 /r
第2オペランド内で、1 になっているビットの数をカウントし、結果を第1オペランドに格納します。
第2オペランドの値が 0 の場合、ZF フラグは 1 に設定され、第1オペランドに 0 がセットされます。それ以外の場合、ZF フラグはクリアされます。
CPUID(POPCNT): EAX = 0000_0001h > ECX(bit23)
第2オペランドの値が 0 の場合、ZF フラグは 1 に設定され、第1オペランドに 0 がセットされます。それ以外の場合、ZF フラグはクリアされます。
CPUID(POPCNT): EAX = 0000_0001h > ECX(bit23)
rFLAGS
ZF は変更。CF, PF, AF, SF, OF = 0。
LZCNT reg16, reg/mem16 | F3 0F BD /r LZCNT reg32, reg/mem32 | F3 0F BD /r LZCNT reg64, reg/mem64 | F3 0F BD /r
第2オペランド内で、最上位ビットから順に、0 になっているビットの数をカウントし、第1オペランドに格納します。
1 のビットに遭遇するか、最下位ビットに到達すると、停止します。
第2オペランドの値が 0 の場合、CF は 1 に設定され、第2オペランドのサイズのビット数が宛先に書き込まれます。それ以外の場合、CF はクリアされます。
最上位のビットが 1 の場合、ZF フラグは 1 に設定され、宛先に 0 が格納されます。それ以外の場合、ZF はクリアされます。
CPUID(LZCNT): EAX = 8000_0001h > ECX(bit5)
LZCNT は、Advanced Bit Manipulation (ABM) 命令です。
LZCNT 命令が使用できない場合、BSR 命令として解釈されます。
1 のビットに遭遇するか、最下位ビットに到達すると、停止します。
第2オペランドの値が 0 の場合、CF は 1 に設定され、第2オペランドのサイズのビット数が宛先に書き込まれます。それ以外の場合、CF はクリアされます。
最上位のビットが 1 の場合、ZF フラグは 1 に設定され、宛先に 0 が格納されます。それ以外の場合、ZF はクリアされます。
CPUID(LZCNT): EAX = 8000_0001h > ECX(bit5)
LZCNT は、Advanced Bit Manipulation (ABM) 命令です。
LZCNT 命令が使用できない場合、BSR 命令として解釈されます。
rFLAGS
CF, ZF は変更。PF, AF, SF, OF は未定義。
ほか
CRC32 reg32, reg/mem8 | F2 0F 38 F0 /r CRC32 reg32, reg/mem8 | F2 REX 0F 38 F0 /r CRC32 reg32, reg/mem16 | F2 0F 38 F1 /r CRC32 reg32, reg/mem32 | F2 0F 38 F1 /r CRC32 reg64, reg/mem8 | F2 REX.W 0F 38 F0 /r CRC32 reg64, reg/mem64 | F2 REX.W 0F 38 F1 /r
CRC32 の 1 ステップを実行します。
第1オペランドは、REX プレフィックスがあるかと、REX.W の値に応じて、32/64bit GPR の 32bit 値です。
[SSE4.2]
第1オペランドは、REX プレフィックスがあるかと、REX.W の値に応じて、32/64bit GPR の 32bit 値です。
- 第1オペランドの下位 32bit のバイト順が反転された後、第2オペランドのビットサイズ分、左にシフトされます。
- 第2オペランドのバイト順が反転され、32bit 左にシフトされます。
- ステップ 1 と 2 の結果が、XOR 演算されます。
- 結果の値を 11EDC6F41h で割り、剰余の 32bit 値のバイト順を反転して、宛先に書き込みます。
[SSE4.2]