演算命令
加減乗除の四則演算を行う算術演算、ビットごとの論理演算をレジスタ間、レジスタ・メモリ間で行う命令があります。x86系CPUの特徴として、演算命令は「 A = A + B 」 という形式(Aに結果が返る) となります。他の種類のCPU(ARM、PowerPC)のように「 C = A + B 」のような動作(A、Bは変化しない)を 1 命令で行うことはできません。
加減算
加算と減算のそれぞれにキャリーフラグを利用して多倍長演算をするための命令があるため、4種類となります。
プリフィックス | オペコード | オペランド | 説明 | |||
---|---|---|---|---|---|---|
ADD | ADC | SUB | SBB | |||
- | 04 ib | 14 ib | 2C ib | 1C ib | AL, imm8 | AL とimm8 を演算して AL に代入する。 |
- | 05 iw | 15 iw | 2D iw | 1D iw | AX, imm16 | AX と imm16 を演算して AX に代入する。 |
- | 05 id | 15 id | 2D id | 1D id | EAX, imm32 | EAX と imm32 を演算して EAX に代入する。 |
REX.W | 05 id | 15 id | 2D id | 1D id | RAX, imm32 | RAX と 64 ビットに符号拡張した imm32 を演算して RAX に代入する。 |
- | 80 /0 ib | 80 /2 ib | 80 /5 ib | 80 /3 ib | r/m8, imm8 | r/m8 と imm8 を演算して r/m8 に代入する。 |
REX | 80 /0 ib | 80 /2 ib | 80 /5 ib | 80 /3 ib | r/m8, imm8 | r/m64 と符号拡張した imm8 を演算して r/m64 に代入する。 |
- | 81 /0 iw | 81 /2 iw | 81 /5 iw | 81 /3 iw | r/m16, imm16 | imm16 と r/m16 を演算して r/m16 に代入する。 |
- | 81 /0 id | 81 /2 id | 81 /5 id | 81 /3 id | r/m32, imm32 | imm32 と r/m32 を演算して r/m32 に代入する。 |
REX.W | 81 /0 id | 81 /2 id | 81 /5 id | 81 /3 id | r/m64, imm32 | r/m64 と 64 ビットに符号拡張した imm32 を演算して r/m64 に代入する。 |
- | 83 /0 ib | 83 /2 ib | 83 /5 ib | 83 /3 ib | r/m16, imm8 | r/m16 と符号拡張 imm8 を演算して r/m16 に代入する。 |
- | 83 /0 ib | 83 /2 ib | 83 /5 ib | 83 /3 ib | r/m32, imm8 | r/m32 と符号拡張 imm8 を演算して r/m32 に代入する。 |
REX.W | 83 /0 ib | 83 /2 ib | 83 /5 ib | 83 /3 ib | r/m64, imm8 | r/m64 と符号拡張 imm8 を演算して r/m64 に代入する。 |
- | 00 /r | 10 /r | 28 /r | 18 /r | r/m8, r8 | r/m8 と r8 を演算して r/m8 に代入する。 |
REX | 00 /r | 10 /r | 28 /r | 18 /r | r/m8, r8 | r/m8 と r8 を演算して r/m8 に代入する。 |
- | 01 /r | 11 /r | 29 /r | 19 /r | r/m16, r16 | r/m16 と r16 を演算して r/m16 に代入する。 |
- | 01 /r | 11 /r | 29 /r | 19 /r | r/m32, r32 | r/m32 と r32 を演算して r/m32 に代入する。 |
REX.W | 01 /r | 11 /r | 29 /r | 19 /r | r/m64, r64 | r/m64 と r64 を演算して r/m64 に代入する。 |
- | 02 /r | 12 /r | 2A /r | 1A /r | r8, r/m8 | r8 と r/m8 を演算して r8 に代入する。 |
REX | 02 /r | 12 /r | 2A /r | 1A /r | r8, r/m8 | r8 と r/m8 を演算して r8 に代入する。 |
- | 03 /r | 13 /r | 2B /r | 1B /r | r16, r/m16 | r16 と r/m16 を演算して r16 に代入する。 |
- | 03 /r | 13 /r | 2B /r | 1B /r | r32, r/m32 | r32 と r/m32 を演算して r32 に代入する。 |
REX.W | 03 /r | 13 /r | 2B /r | 1B /r | r64, r/m64 | r64 と r/m64 を演算して r64 に代入する。 |
フラグの変化 : 実行の結果によって変化する。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | ? | ? | ? | ? | ? |
ADD
レジスタとレジスタ、またはレジスタとメモリの加算を行います。
表記 : ADD OP1, OP2 動作 : OP1 = OP1 + OP2; 例 : ADD rax, 0x200
ADC
レジスタとレジスタ、レジスタと定数、レジスタまたはレジスタとメモリの加算を行います。キャリーフラグも同時に加算します。多倍長の加算に使用します。
表記 : ADC OP1, OP2 動作 : OP1 = OP1 + OP2 + CF; 例 : ADC rax, 0x200
SUB
レジスタからレジスタ、レジスタから定数、またはレジスタとメモリの間の減算を行います。
表記 : SUB OP1, OP2 動作 : OP1 = OP1 - OP2; 例 : SUB rax, 0x200
SBB
レジスタからレジスタ、レジスタから定数、またはレジスタとメモリの間の減算を行います。キャリーフラグ(ボロー)も同時に減算します。多倍長の減算に使用します。
表記 : SBB OP1, OP2 動作 : OP1 = OP1 - OP2 - CF; 例 : SBB rax, 0x200
INC
レジスタまたはメモリに 1 を加算する専用命令が用意されています。64ビットモードでは 1バイトの命令形式は使用できません。
表記 : INC OP1 動作 : OP1 = OP1 + 1
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | FE /0 | INC r/m8 | r/m バイトに 1 を加える。 |
REX | FE /0 | INC r/m8 | r/m バイトに 1 を加える。 |
- | FF /0 | INC r/m16 | r/m ワードに 1 を加える。 |
- | FF /0 | INC r/m32 | r/m ダブルワードに 1 を加える。 |
REX.W | FF /0 | INC r/m64 | r/m クワッドワードに 1 を加える。 |
フラグの変化 : CFは変化しない。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | ? | ? | ? | - | ? |
DEC
レジスタまたはメモリから 1 を減算する専用命令が用意されています。64ビットモードでは 1バイトの命令形式は使用できません。
表記 : DEC OP1 動作 : OP1 = OP1 - 1
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | FE /1 | DEC r/m8 | r/m8 から 1 を引く。 |
REX | FE /1 | DEC r/m8 | r/m8 から 1 を引く。 |
- | FF /1 | DEC r/m16 | r/m16 から 1 を引く。 |
- | FF /1 | DEC r/m32 | r/m32 から 1 を引く。 |
REX.W | FF /1 | DEC r/m64 | r/m64 から 1 を引く。 |
フラグの変化 : CFは変化しない。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | ? | ? | ? | - | ? |
NEG
レジスタまたはメモリの 2 の補数を求め、結果を戻します。
表記 : NEG OP1 動作 : OP1 = - OP1
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | F6 /3 | NEG r/m8 | r/m8 の 2 の補数を求め r/m8 に代入 |
REX | F6 /3 | NEG r/m8 | r/m8 の 2 の補数を求め r/m8 に代入 |
- | F7 /3 | NEG r/m16 | r/m16 の 2 の補数を求め r/m16 に代入 |
- | F7 /3 | NEG r/m32 | r/m32 の 2 の補数を求め r/m32 に代入 |
REX.W | F7 /3 | NEG r/m64 | r/m64 の 2 の補数を求め r/m64 に代入 |
フラグの変化 : ソースオペランドが0の場合、CFは0となる。それ以外はCFは1に設定される。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | ? | ? | ? | ? | ? |
ビット毎の論理演算
同じ命令フォーマットでビット毎の論理積、論理和、排他的論理和の3種類があります。
論理積 AND | 論理和 OR | 排他的論理和 XOR |
---|---|---|
両方が真で真 | どちらか真で真 | 異なれば真 |
0 and 0 = 0 | 0 or 0 = 0 | 0 xor 0 = 0 |
0 and 1 = 0 | 0 or 1 = 1 | 0 xor 1 = 1 |
1 and 0 = 0 | 1 or 0 = 1 | 1 xor 0 = 1 |
1 and 1 = 1 | 1 or 1 = 1 | 1 xor 1 = 0 |
論理演算の上記の性質を利用して特定のビットを取り出したり、特定のビットを 1 にセットしたり、特定のビットを 0 にクリアすることができます。
プリフィックス | オペコード | オペランド | 説明 | ||
---|---|---|---|---|---|
AND | OR | XOR | |||
- | 24 ib | 0C ib | 34 ib | AL, imm8 | AL とimm8 をビット毎の論理演算して AL に代入する。 |
66 | 25 iw | 0D iw | 35 iw | AX, imm16 | AX と imm16 をビット毎の論理演算して AX に代入する。 |
- | 25 id | 0D id | 35 id | EAX, imm32 | EAX と imm32 をビット毎の論理演算して EAX に代入する。 |
REX.W | 25 id | 0D id | 35 id | RAX, imm32 | RAX と 64 ビットに符号拡張した imm32 をビット毎の2 論理演算して RAX に代入する。 |
- | 80 /4 ib | 80 /1 ib | 80 /6 ib | r/m8, imm8 | r/m8 と imm8 をビット毎の論理演算して r/m8 に代入する。 |
REX | 80 /4 ib | 80 /1 ib | 80 /6 ib | r/m8, imm8 | r/m64 と符号拡張した imm8 をビット毎の論理演算して r/m64 に代入する。 |
66 | 81 /4 iw | 81 /1 iw | 81 /6 iw | r/m16, imm16 | imm16 と r/m16 をビット毎の論理演算して r/m16 に代入する。 |
- | 81 /4 id | 81 /1 id | 81 /6 id | r/m32, imm32 | imm32 と r/m32 をビット毎の論理演算して r/m32 に代入する。 |
REX.W | 81 /4 id | 81 /1 id | 81 /6 id | r/m64, imm32 | r/m64 と 64 ビットに符号拡張した imm32 をビット毎の 論理演算して r/m64 に代入する。 |
66 | 83 /4 ib | 83 /1 ib | 83 /6 ib | r/m16, imm8 | r/m16 と符号拡張 imm8 をビット毎の論理演算して r/m16 に代入する。 |
- | 83 /4 ib | 83 /1 ib | 83 /6 ib | r/m32, imm8 | r/m32 と符号拡張 imm8 をビット毎の論理演算して r/m32 に代入する。 |
REX.W | 83 /4 ib | 83 /1 ib | 83 /6 ib | r/m64, imm8 | r/m64 と符号拡張 imm8 をビット毎の論理演算して r/m64 に代入する。 |
- | 20 /r | 08 /r | 30 /r | r/m8, r8 | r/m8 と r8 をビット毎の論理演算して r/m8 に代入する。 |
REX | 20 /r | 08 /r | 30 /r | r/m8, r8 | r/m8 と r8 をビット毎の論理演算して r/m8 に代入する。 |
66 | 21 /r | 09 /r | 31 /r | r/m16, r16 | r/m16 と r16 をビット毎の論理演算して r/m16 に代入する。 |
- | 21 /r | 09 /r | 31 /r | r/m32, r32 | r/m32 と r32 をビット毎の論理演算して r/m32 に代入する。 |
REX.W | 21 /r | 09 /r | 31 /r | r/m64, r64 | r/m64 と r64 をビット毎の論理演算して r/m64 に代入する。 |
- | 22 /r | 0A /r | 32 /r | r8, r/m8 | r8 と r/m8 をビット毎の論理演算して r8 に代入する。 |
REX | 22 /r | 0A /r | 32 /r | r8, r/m8 | r8 と r/m8 をビット毎の論理演算して r8 に代入する。 |
66 | 23 /r | 0B /r | 33 /r | r16, r/m16 | r16 と r/m16 をビット毎の論理演算して r16 に代入する。 |
- | 23 /r | 0B /r | 33 /r | r32, r/m32 | r32 と r/m32 をビット毎の論理演算して r32 に代入する。 |
REX.W | 23 /r | 0B /r | 33 /r | r64, r/m64 | r64 と r/m64 をビット毎の論理演算して r64 に代入する。 |
フラグの変化 : AFの変化は未定義。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | 0 | ? | ? | u | 0 | ? |
AND
第1オペランドのレジスタと第2オペランドのレジスタ/メモリ/定数間でビット毎の論理積をとり、結果を第1オペランドのレジスタに返します。
例 AX の内容 1100110110100101 BX の内容 0000000011111111 AND AX,BX の結果 0000000010000101
この例では AX レジスタの16ビットの数値に対して下位8ビットに 1 が入っている BX レジスタのビットごとの論理積を計算しています。演算結果は AX に返りますが、元の値の下位8ビットを取り出しています。このように AND はビットマスクとして用いられます。
例 AX の内容 1100110110100101 BX の内容 1111111111111011 OR AX,BX の結果 1100110110100001
逆に特定のビットを0に変更するには、変更するビットのみ 0 でそれ以外を 1 としたビットパターンで AND します。
表記 : AND OP1, OP2 動作 : OP1 = OP1 & OP2; 例 : AND rax, 0x200
OR
第1オペランドのレジスタと第2オペランドのレジスタ/メモリ/定数間でビット毎の論理和をとり、結果を第1オペランドのレジスタに返します。
例 AX の内容 0000000000001111 BX の内容 1000000000000000 OR AX,BX の結果 1000000000001111
この例では AX レジスタの16ビットの数値に対して最上ビットに 1 が入っている BX レジスタのビットごとの論理和を計算しています。演算結果は AX に返りますが、元の値の最上位ビットのみを1に変更しています。
表記 : OR OP1, OP2 動作 : OP1 = OP1 | OP2; 例 : OR RAX, 0x200
XOR
第1オペランドのレジスタと第2オペランドのレジスタ/メモリ/定数間でビット毎の排他的論理和をとり、結果を第1オペランドのレジスタに返します。 XOR は 2 回繰り返すと元に戻る性質があります。
例 AX の内容 1100110110100101 AX の内容 1100110110100101 XOR AX,AX の結果 0000000000000000
上記のように XOR は同じもの同士のビット毎の排他的論理和をとると 0 となることを利用して、レジスタに 0 を代入する目的で多用されます。
命令 | 生成されるコード |
---|---|
mov rax, 0 | 48 B8 00 00 00 00 00 00 00 00 |
mov eax, 0 | B8 00 00 00 00 |
xor eax, eax | 31 C0 |
rax レジスタに 0 を代入するために転送命令使用すると10バイトの命令となり、XOR を使った場合は 2 バイトまで小さくなります。XOR で RAX ではなく EAX レジスタを使用した理由は、x86-64 の 64ビットモードでは 32ビットレジスタに対して代入や演算を行うと64ビットレジスタの上位32ビットに 0 が設定されるため同じ動作となります。したがって、2番目の mov 命令も RAX は 0 になります。
表記 : XOR OP1, OP2 動作 : OP1 = OP1 xor OP2; 例 : XOR rax, rax
NOT
各ビットを反転(1の補数)させる命令です。1 と XOR してもビット反転が可能です。
表記 : NOT OP1 動作 : OP1 = ~ OP1
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | F6 /2 | NOT r/m8 | r/m8 の各ビットを反転する。 |
REX | F6 /2 | NOT r/m8 | r/m8 の各ビットを反転する。 |
66 | F7 /2 | NOT r/m16 | r/m16 の各ビットを反転する。 |
- | F7 /2 | NOT r/m32 | r/m32 の各ビットを反転する。 |
REX.W | F7 /2 | NOT r/m64 | r/m64 の各ビットを反転する。 |
フラグの変化 : フラグは変化しない。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | - | - | - | - | - | - |
乗除算
符号付きと無符号の乗除算が4種類用意されています。結果が 128bit ととなる 64bit 同士の乗算、128bit ÷ 64bit で商と剰余(ともに64ビットまで)を求めることができる除算が可能です。
MUL
第1 オペランドと rAX の符号なし整数の乗算を行います。加算の場合の桁あふれは1ビットまでなので キャリーフラグですみますが、乗算の場合は、ビット数が最大2倍になります。 x86-64では rDX に上位のビットが返ります。下位のビットは rAX に返ります。 ただし、8ビット同士の乗算は16ビットの AX レジスタに結果が返ります。 乗算の一方は常に rAX レジスタが使われ、上位桁が rDX に返るため、元の rDX の内容が失われることに注意が必要です。
表記 : MUL OP1 動作 : rDX:rAX = rAX * OP1
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | F6 /4 | MUL r/m8 | 符号なし乗算(AX ← AL * r/m8) |
REX | F6 /4 | MUL r/m8 | 符号なし乗算(AX ← AL * r/m8) |
66 | F7 /4 | MUL r/m16 | 符号なし乗算(DX:AX ← AX * r/m16) |
- | F7 /4 | MUL r/m32 | 符号なし乗算(EDX:EAX ← EAX * r/m32) |
REX.W | F7 /4 | MUL r/m64 | 符号なし乗算(RDX:RAX ← RAX * r/m64) |
フラグの変化 : 乗算結果の上位ビットが 0 ならばOFとCFは 0、上位が 0でなければ1に設定される。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | u | u | u | ? | u |
IMUL
符号付きの乗算を行う IDIV は数値が2の補数で表現されたものとして乗算を行います。 MULと異なってオペランドが1つのもの、2つのもの、3つのものの 3 形式があります。
オペランドが1つの場合は MUL と同様に第1 オペランドと rAX の符号付整数の乗算を行います。 rDX に上位のビットが返ります。下位のビットは rAX に返ります。
オペランドが 2つの場合と 3つの場合は定数を乗算することができます。 オペランドが 3つの場合はレジスタまたはメモリと定数の乗算を行います。 オペランドが 3つの形式では定数の乗算に限定しているため、結果を返すレジスタとレジスタまたはメモリ、 定数の3つのオペランドをModR/Mバイトを使って表現することができます。 オペランドが1つの場合と異なり、上位ビットは切り捨てられるため演算後にフラグを見てオーバーフローの チェックをする必要があります。また、下位ビットは数値が符号付、符号無しで変化しないため、 上位ビットを切り捨てる場合は、IMULのオペランドが 2つと3つの形式を MUL (符号なし数)として使用できます。 IMUL の命令フォーマットが MUL より多い理由はここにあります。
表記 : IMUL OP1 動作 : rDX:rAX = rAX * OP1
プリフィックス | オペコード | 命令 | 説明 | メモ |
---|---|---|---|---|
- | F6 /5 | IMUL r/m8 | AX← AL * r/m8 | MULと同じ形式 |
REX | F6 /5 | IMUL r/m8 | AX← AL * r/m8 | |
66 | F7 /5 | IMUL r/m16 | DX:AX ← AX * r/m16 | |
- | F7 /5 | IMUL r/m32 | EDX:EAX ← EAX * r/m32 | |
REX.W | F7 /5 | IMUL r/m64 | RDX:RAX ← RAX * r/m64 | |
66 | 0F AF /r | IMUL r16, r/m16 | r16← r16 * r/m16 | 上位ビット切捨て 符号なしでも使用可 |
- | 0F AF /r | IMUL r32, r/m32 | r32← r32 * r/m32 | |
REX.W | 0F AF /r | IMUL r64, r/m64 | r64← r64 * r/m64 | |
66 | 6B /r ib | IMUL r16, r/m16, imm8 | r16← r/m16 * 符号拡張8ビット定数 | |
- | 6B /r ib | IMUL r32, r/m32, imm8 | r32← r/m32 * 符号拡張8ビット定数 | |
REX.W | 6B /r ib | IMUL r64, r/m64, imm8 | r64← r/m64 * 符号拡張8ビット定数 | |
66 | 6B /r ib | IMUL r16, imm8 | r16← r16 * 符号拡張8ビット定数 | |
- | 6B /r ib | IMUL r32, imm8 | r32← r32 * 符号拡張8ビット定数 | |
REX.W | 6B /r ib | IMUL r64, imm8 | r64← r64 * 符号拡張8ビット定数 | |
66 | 69 /r iw | IMUL r16, r/m16, imm16 | r16← r/m16 * 16ビット定数 | |
- | 69 /r id | IMUL r32, r/m32, imm32 | r32← r/m32 * 32ビット定数 | |
REX.W | 69 /r id | IMUL r64, r/m64, imm32 | r64← r/m64 * 32ビット定数 | |
66 | 69 /r iw | IMUL r16, imm16 | r16← r/m16 * 16ビット定数 | |
- | 69 /r id | IMUL r32, imm32 | r32← r/m32 * 32ビット定数 | |
REX.W | 69 /r id | IMUL r64, imm32 | r64← r/m64 * 32ビット定数 |
フラグの変化 : 1 オペランド形式の場合、乗算結果の上位ビットが 0 ならばOFとCFは 0、上位が 0でなければ1に設定される。 2 および 3 オペランド形式では、切捨てが発生していない場合ば OF と CF は 0、切り捨てられた場合は OF と CF は 1 に設定されます。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | u | u | u | ? | u |
DIV
符号なし除算を行う命令です。MULと対応して rDX:rAX を第1オペランドで除算します。 結果(商)は rAX に返り、余りは rDX に設定されます。 余りの絶対値は除数(割る数)より小さくなり、商は 0 に向かって切り捨てられます。 除算の場合は結果が rAX に収まらない場合が発生します。0で除算した場合も同じですが、エラーとなって例外が発生します。
表記 : DIV OP1 動作 : rAX = rDX:rAX / OP1 rDX = 余り
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | F6 /6 | DIV r/m8 | AX をr/m8 で符号なし除算する。結果は AL ← 商、AH← 剰余 |
REX | F6 /6 | DIV r/m8 | AX をr/m8 で符号なし除算する。結果 AL ← 商、AH← 剰余 |
66 | F7 /6 | DIV r/m16 | DX:AX をr/m16 で符号なし除算する。結果は AX ←商、DX ← 剰余 |
- | F7 /6 | DIV r/m32 | EDX:EAX をr/m32 で符号なし除算する。結果は EAX ←商、EDX ← 剰余 |
REX.W | F7 /6 | DIV r/m64 | RDX:RAX をr/m64 で符号なし除算する。結果は RAX ←商、RDX ← 剰余 |
フラグの変化 : OF、SF、ZF、AF、CF、PFともに未定義です。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | u | u | u | u | u | u |
IDIV
符号付除算を行う命令です。rDX:rAX を第1オペランドで除算します。結果(商)は rAX に返り、余りは rDX に設定されます。 余りの符号は被除数(割られる数)と同じで、余りの絶対値は除数(割る数)より小さくなります。商は0に向かって切り捨てられます。 除算の場合は結果が rAX に収まらない場合が発生します。0で除算した場合も同じですが、エラーとなって例外が発生します。
表記 : DIV OP1 動作 : rAX = rDX:rAX / OP1 rDX = 余り
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | F6 /7 | IDIV r/m8 | AX をr/m8 で符号付き除算する。結果は AL ← 商、AH ← 剰余 |
REX | F6 /7 | IDIV r/m8 | AX をr/m8 で符号付き除算する。結果は AL ← 商、AH ← 剰余 |
66 | F7 /7 | IDIV r/m16 | DX:AX をr/m16 で符号付き除算する。結果は AX ← 商、DX ← 剰余 |
- | F7 /7 | IDIV r/m32 | EDX:EAX をr/m32 で符号付き除算する。結果は EAX ←商、EDX ← 剰余 |
REX.W | F7 /7 | IDIV r/m64 | RDX:RAX をr/m64 で符号付き除算する。結果は RAX ←商、RDX ← 剰余 |
フラグの変化 : OF、SF、ZF、AF、CF、PFともに未定義です。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | u | u | u | u | u | u |
比較命令
レジスタとレジスタ、レジスタとメモリ内容、レジスタと定数を比較して、結果をフラグに反映させ命令です。フラグレジスタの変化は、SUB、AND命令と同じですが、演算結果を返さないため、オペランドのレジスタやメモリは変化しません。
CMP
レジスタとレジスタ、レジスタとメモリ内容、レジスタと定数を比較して、結果をフラグに反映させます。 内部的には左側のオペランドから右のオペランドを減算しますが、減算結果は返しません。
通常、後に条件分岐命令、条件転送命令、SETcc命令が続きます。
表記 : CMP OP1, OP2 動作 : OP1 - OP2 (フラグのみ変化)
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | 3C ib | CMP AL, imm8 | imm8 をAL と比較する。 |
66 | 3D iw | CMP AX, imm16 | imm16 をAX と比較する。 |
- | 3D id | CMP EAX, imm32 | imm32 をEAX と比較する。 |
REX.W | 3D id | CMP RAX, imm32 | 64 ビットに符号拡張されたimm32 をRAX と比較する。 |
- | 80 /7 ib | CMP r/m8, imm8 | imm8 をr/m8 と比較する。 |
REX | 80 /7 ib | CMP r/m8, imm8 | imm8 をr/m8 と比較する。 |
66 | 81 /7 iw | CMP r/m16, imm16 | imm16 をr/m16 と比較する。 |
- | 81 /7 id | CMP r/m32, imm32 | imm32 をr/m32 と比較する。 |
REX.W | 81 /7 id | CMP r/m64, imm32 | 64 ビットに符号拡張されたimm32 をr/m64 と比較する。 |
66 | 83 /7 ib | CMP r/m16, imm8 | imm8 をr/m16 と比較する。 |
- | 83 /7 ib | CMP r/m32, imm8 | imm8 をr/m32 と比較する。 |
REX.W | 83 /7 ib | CMP r/m64, imm8 | imm8 をr/m64 と比較する。 |
- | 38 /r | CMP r/m8, r8 | r8 をr/m8 と比較する。 |
REX | 38 /r | CMP r/m8, r8 | r8 をr/m8 と比較する。 |
66 | 39 /r | CMP r/m16, r16 | r16 をr/m16 と比較する。 |
- | 39 /r | CMP r/m32, r32 | r32 をr/m32 と比較する。 |
REX.W | 39 /r | CMP r/m64, r64 | r64 をr/m64 と比較する。 |
- | 3A /r | CMP r8, r/m8 | r/m8 をr8 と比較する。 |
REX | 3A /r | CMP r8, r/m8 | r/m8 をr8 と比較する。 |
66 | 3B /r | CMP r16, r/m16 | r/m16 をr16 と比較する。 |
- | 3B /r | CMP r32, r/m32 | r/m32 をr32 と比較する。 |
REX.W | 3B /r | CMP r64, r/m64 | r/m64 をr64 と比較する。 |
フラグの変化 : 実行の結果によって変化する。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | ? | ? | ? | ? | ? | ? |
TEST
レジスタとレジスタ、レジスタとメモリ内容、またはレジスタと定数の論理積をとり、結果をフラグに反映させます。 演算結果は返しません。
通常、後に条件分岐命令、条件転送命令、SETcc命令が続きます。
表記 : TEST OP1, OP2 動作 : OP1 and OP2 (フラグのみ変化)
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | A8 ib | TEST AL, imm8 | imm8 とAL の論理積の結果でSF、ZF、PF を設定する。 |
66 | A9 iw | TEST AX, imm16 | imm16 とAX の論理積の結果でSF、ZF、PF を設定する。 |
- | A9 id | TEST EAX, imm32 | imm32 とEAX の論理積の結果でSF、ZF、PF を設定する。 |
REX.W | A9 id | TEST RAX, imm32 | 64 ビットに符号拡張されたimm32 とRAX の論理積の結果でSF、ZF、PF を設定する。 |
- | F6 /0 ib | TEST r/m8, imm8 | imm8 とr/m8 の論理積の結果でSF、ZF、PF を設定する。 |
REX | F6 /0 ib | TEST r/m8, imm8 | imm8 とr/m8 の論理積の結果でSF、ZF、PF を設定する。 |
66 | F7 /0 iw | TEST r/m16, imm16 | imm16 とr/m16 の論理積の結果でSF、ZF、PF を設定する。 |
- | F7 /0 id | TEST r/m32, imm32 | imm32 とr/m32 の論理積の結果でSF、ZF、PF を設定する。 |
REX.W | F7 /0 id | TEST r/m64, imm32 | 64 ビットに符号拡張されたimm32 とr/m64 の論理積の結果でSF、ZF、PF を設定する。 |
- | 84 /r | TEST r/m8, r8 | r8 とr/m8 の論理積の結果でSF、ZF、PF を設定する。 |
REX | 84 /r | TEST r/m8, r8 | r8 とr/m8 の論理積の結果でSF、ZF、PF を設定する。 |
66 | 85 /r | TEST r/m16, r16 | r16 とr/m16 の論理積の結果でSF、ZF、PF を設定する。 |
- | 85 /r | TEST r/m32, r32 | r32 とr/m32 の論理積の結果でSF、ZF、PF を設定する。 |
REX.W | 85 /r | TEST r/m64, r64 | r64 とr/m64 の論理積の結果でSF、ZF、PF を設定する。 |
フラグの変化 : OF と CF は 0 クリア、SF、ZF、PF は実行の結果によって変化します。
フラグ | OF | SF | ZF | AF | CF | PF |
---|---|---|---|---|---|---|
実行後 | 0 | ? | ? | ? | 0 | ? |