演算命令

加減乗除の四則演算を行う算術演算、ビットごとの論理演算をレジスタ間、レジスタ・メモリ間で行う命令があります。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 ?

続く...


このページの目次