汎用命令 (比較など)

比較
CMP比較
TESTAND 比較
BTビットテスト
BTCビットテストと反転
BTRビットテストとクリア
BTSビットテストとセット
条件により値をセット
CMOVcc条件付き移動
SETcc条件により 0 or 1 にセット
ジャンプ
JMP (near)無条件ジャンプ (near)
JMP (far)無条件ジャンプ (far)
Jcc条件によりジャンプ
LOOP
LOOPE
LOOPNE
LOOPNZ
LOOPZ
ループ用のジャンプ
JCXZ
JECXZ
JRCXZ
rCX が 0 ならジャンプ
プロシージャ
CALL (near)プロシージャ呼び出し (near)
CALL (far)プロシージャ呼び出し (far)
RET (near)呼び出されたプロシージャから戻る
RETF (far)呼び出されたプロシージャから戻る (far)
ENTERスタックフレームの作成
LEAVEスタックフレームの削除
メモリのロード/ストア/比較
LODS
LODSB
LODSW
LODSD
LODSQ
メモリから rAX にロード
MOVS
MOVSB
MOVSW
MOVSD
MOVSQ
メモリ間で値をコピー
STOS
STOSB
STOSW
STOSD
STOSQ
rAX の値をメモリにセット
CMPS
CMPSB
CMPSW
CMPSD
CMPSQ
メモリ間の値の比較
SCAS
SCASB
SCASW
SCASD
SCASQ
メモリと rAX の値の比較
比較
CMP AL, imm8   | 3C ib
CMP AX, imm16  | 3D iw
CMP EAX, imm32 | 3D id
CMP RAX, imm32 | 3D id
CMP reg/mem8, imm8   | 80 /7 ib
CMP reg/mem16, imm16 | 81 /7 iw
CMP reg/mem32, imm32 | 81 /7 id
CMP reg/mem64, imm32 | 81 /7 id | 32->64bit 符号拡張
CMP reg/mem16, imm8  | 83 /7 ib | 8->16bit 符号拡張
CMP reg/mem32, imm8  | 83 /7 ib | 8->32bit 符号拡張
CMP reg/mem64, imm8  | 83 /7 ib | 8->64bit 符号拡張
CMP reg/mem8, reg8   | 38 /r
CMP reg/mem16, reg16 | 39 /r
CMP reg/mem32, reg32 | 39 /r
CMP reg/mem64, reg64 | 39 /r
CMP reg8, reg/mem8   | 3A /r
CMP reg16, reg/mem16 | 3B /r
CMP reg32, reg/mem32 | 3B /r
CMP reg64, reg/mem64 | 3B /r
2つのオペランドの値を比較し、結果に応じて、rFLAGS レジスタのフラグを変更します。

第1オペランドから第2オペランドを減算し、SUB 命令と同じ方法でフラグを設定しますが、第1オペランドの内容は変更されません。

第2オペランドが即値の場合、第1オペランドのサイズに符号拡張します。
rFLAGS
CF, PF, AF, ZF, SF, OF
TEST AL, imm8   | A8 ib
TEST AX, imm16  | A9 iw
TEST EAX, imm32 | A9 id
TEST RAX, imm32 | A9 id
TEST reg/mem8, imm8   | F6 /0 ib
TEST reg/mem16, imm16 | F7 /0 iw
TEST reg/mem32, imm32 | F7 /0 id
TEST reg/mem64, imm32 | F7 /0 id
TEST reg/mem8, reg8   | 84 /r
TEST reg/mem16, reg16 | 85 /r
TEST reg/mem32, reg32 | 85 /r
TEST reg/mem64, reg64 | 85 /r
2つのオペランドの値で、ビット単位の論理積 (AND) を実行し、結果に基づいて、rFLAGS レジスタのフラグを設定します。
第1オペランドの内容は変更されません。
rFLAGS
PF, ZF, SF は変更。CF, OF = 0。AF は未定義。
BT reg/mem16, reg16 | 0F A3 /r
BT reg/mem32, reg32 | 0F A3 /r
BT reg/mem64, reg64 | 0F A3 /r
BT reg/mem16, imm8  | 0F BA /4 ib
BT reg/mem32, imm8  | 0F BA /4 ib
BT reg/mem64, imm8  | 0F BA /4 ib
第1オペランドの値から、第2オペランドの値の位置で指定されたビットを取り出し、CF フラグにコピーします。

この命令を使う場合、メモリマップド I/O レジスタへの参照など、アドレス空間ホールに近いメモリ領域への参照を避けてください。
代わりに、MOV 命令を使用して値をロードした後、BT 命令を実行します。
rFLAGS
CF は変更。PF, AF, ZF, SF, OF は未定義。
BTC reg/mem16, reg16 | 0F BB /r
BTC reg/mem32, reg32 | 0F BB /r
BTC reg/mem64, reg64 | 0F BB /r
BTC reg/mem16, imm8  | 0F BA /7 ib
BTC reg/mem32, imm8  | 0F BA /7 ib
BTC reg/mem64, imm8  | 0F BA /7 ib
第1オペランドの値から、第2オペランドの値の位置で指定されたビットを CF にコピーし、その後、第1オペランドの指定ビットを反転します。

LOCK プレフィックスがサポートされています。
rFLAGS
CF は変更。PF, AF, ZF, SF, OF は未定義。
BTR reg/mem16, reg16 | 0F B3 /r
BTR reg/mem32, reg32 | 0F B3 /r
BTR reg/mem64, reg64 | 0F B3 /r
BTR reg/mem16, imm8  | 0F BA /6 ib
BTR reg/mem32, imm8  | 0F BA /6 ib
BTR reg/mem64, imm8  | 0F BA /6 ib
第1オペランドの値から、第2オペランドの値の位置で指定されたビットを CF にコピーし、その後、第1オペランドの指定ビットをクリアします。

LOCK プレフィックスがサポートされています。
rFLAGS
CF は変更。PF, AF, ZF, SF, OF は未定義。
BTS reg/mem16, reg16 | 0F AB /r
BTS reg/mem32, reg32 | 0F AB /r
BTS reg/mem64, reg64 | 0F AB /r
BTS reg/mem16, imm8  | 0F BA /5 ib
BTS reg/mem32, imm8  | 0F BA /5 ib
BTS reg/mem64, imm8  | 0F BA /5 ib
第1オペランドの値から、第2オペランドの値の位置で指定されたビットを CF にコピーし、その後、第1オペランドの指定ビットを 1 にセットします。

LOCK プレフィックスがサポートされています。
rFLAGS
CF は変更。PF, AF, ZF, SF, OF は未定義。
条件により値をセット
* オペランドはすべて以下で共通
reg16, reg/mem16
reg32, reg/mem32
reg64, reg/mem64

CMOVO   | 0F 40 /r | OF = 1
CMOVNO  | 0F 41 /r | OF = 0

CMOVB/CMOVC/CMOVNAE  | 0F 42 /r | CF = 1
CMOVNB/CMOVNC/CMOVAE | 0F 43 /r | CF = 0

CMOVZ/CMOVE   | 0F 44 /r | ZF = 1
CMOVNZ/CMOVNE | 0F 45 /r | ZF = 0

CMOVBE/CMOVNA | 0F 46 /r | CF = 1 or ZF = 1
CMOVNBE/CMOVA | 0F 47 /r | CF = 0 and ZF = 0

CMOVS   | 0F 48 /r | SF = 1
CMOVNS  | 0F 49 /r | SF = 0

CMOVP/CMOVPE  | 0F 4A /r | PF = 1
CMOVNP/CMOVPO | 0F 4B /r | PF = 0

CMOVL/CMOVNGE | 0F 4C /r | SF <> OF
CMOVNL/CMOVGE | 0F 4D /r | SF = OF

CMOVLE/CMOVNG | 0F 4E /r | ZF = 1 or SF <> OF
CMOVNLE/CMOVG | 0F 4F /r | ZF = 0 and SF = OF
rFLAGS レジスタのフラグの値に応じて、第2オペランドの値を、第1オペランドに条件付きで移動します。
条件が満たされない場合、宛先レジスタは変更されません。

64bit モードでは、宛先オペランドのサイズが 32bit の場合、結果が false であっても、宛先レジスタの上位 32bit をクリアします。
第2オペランドがメモリの場合は、結果が false であっても、メモリ関連の例外が発生する場合があります。

※x64 には含まれている。
CPUID(CMOV): EAX = 1 > EDX(bit15)
* オペランドはすべて以下で共通
reg/mem8

SETO   | 0F 90 /0 | OF = 1
SETNO  | 0F 91 /0 | OF = 0
SETB/SETC/SETNAE  | 0F 92 /0 | CF = 1
SETNB/SETNC/SETAE | 0F 93 /0 | CF = 0
SETZ/SETE    | 0F 94 /0 | ZF = 1
SETNZ/SETNE  | 0F 95 /0 | ZF = 0
SETBE/SETNA  | 0F 96 /0 | CF = 1 or ZF = 1
SETNBE/SETA  | 0F 97 /0 | CF = 0 and ZF = 0
SETS         | 0F 98 /0 | SF = 1
SETNS        | 0F 99 /0 | SF = 0
SETP/SETPE   | 0F 9A /0 | PF = 1
SETNP/SETPO  | 0F 9B /0 | PF = 0
SETL/SETNGE  | 0F 9C /0 | SF <> OF
SETNL/SETGE  | 0F 9D /0 | SF = OF
SETLE/SETNG  | 0F 9E /0 | ZF = 1 or SF <> OF
SETNLE/SETG  | 0F 9F /0 | ZF = 0 and SF = OF
rFLAGS レジスタのフラグをチェックし、指定された条件を満たしている場合、8bit オペランドの値を 1 にセットします。
条件を満たさない場合、値を 0 にクリアします。

論理値「true」を、1 ではなく、すべてのビットが 1 に設定された整数として扱いたい場合は、反対の条件の SETcc 命令を実行した後、その結果をデクリメントすると、実現できます。
(0 - 1 = -1。1 - 1 = 0)
ジャンプ
JMP rel8off   | EB cb
JMP rel16off  | E9 cw | x 64bit モード
JMP rel32off  | E9 cd
JMP reg/mem16 | FF /4 | x 64bit モード
JMP reg/mem32 | FF /4 | x 64bit モード
JMP reg/mem64 | FF /4
無条件に、次の命令の実行位置を、指定位置に移動します。

この形式の命令は、現在のコードセグメント内のアドレスにジャンプするため、ニアジャンプと呼ばれます。

即値としてオフセットが指定されている場合、値は、この命令の次の位置からの、相対的な符号付きオフセット位置です。
rIP にこのオフセット値が加算され、結果の値は、16/32/64 bit に切り捨てられます。

位置がレジスタまたはメモリで指定されている場合、値は、絶対位置として rIP にセットされます。

64bit モードの場合、オペランドサイズはデフォルトで 64bit になります。
JMP FAR pntr16:16 | EA cd | x 64bit モード
JMP FAR pntr16:32 | EA cp | x 64bit モード
JMP FAR mem16:16  | FF /5
JMP FAR mem16:32  | FF /5
無条件に、次の命令の実行位置を、指定位置に移動します。
オペランドで、ターゲットセレクタとオフセットの2つの値を指定します。

この形式の命令は、現在のコードセグメントの外側のアドレスにジャンプするため、ファージャンプと呼ばれます。

pntr*:* は、直接ファージャンプ。
mem*:* は、間接ファージャンプ。

64bit モードでは、間接ファージャンプのみが許可され、直接ファージャンプを実行すると、未定義のオペコード例外が生成されます。

すべての動作モードにおいて、命令で使用されるターゲットセレクタは、コードセレクタになります。
さらに、ターゲットセレクタは、プロテクトモードのコールゲート、またはレガシー保護モードのタスクゲートまたは TSS セレクタにすることもできます。

  • ターゲットはコードセグメント
    ターゲットの CS:rIP に移動します。
    CPL の変更は許可されません。
  • ターゲットはコールゲート
    実際のターゲットコードセグメントとオフセットを指定し、ターゲットの CS:rIP に移動します。
    rIP のサイズは、コールゲートのサイズに応じて、16/32/64bit になります。
    ロングモードでは、64bit コールゲートのみが許可され、64bit コードセグメントを指す必要があります。
    CPL の変更は許可されません。
  • ターゲットはタスクゲートまたは TSS
    レガシー・プロテクトモードの場合、タスクの切り替えが発生します。
    タスク切り替えは、ロングモードではサポートされません。
* は別名 (オペコードは同じ)

[OF = 1]
JO rel8off  | 70 cb
JO rel16off | 0F 80 cw
JO rel32off | 0F 80 cd

[OF = 0]
JNO rel8off  | 71 cb
JNO rel16off | 0F 81 cw
JNO rel32off | 0F 81 cd

[CF = 1]
JB rel8off  | 72 cb
JB rel16off | 0F 82 cw
JB rel32off | 0F 82 cd
* JC, JNAE

[CF = 0]
JNB rel8off  | 73 cb
JNB rel16off | 0F 83 cw
JNB rel32off | 0F 83 cd
* JNC, JAE

[ZF = 1]
JZ rel8off  | 74 cb
JZ rel16off | 0F 84 cw
JZ rel32off | 0F 84 cd
* JE

[ZF = 0]
JNZ rel8off  | 75 cb
JNZ rel16off | 0F 85 cw
JNZ rel32off | 0F 85 cd
* JNE

[CF = 1 or ZF = 1]
JBE rel8off  | 76 cb
JBE rel16off | 0F 86 cw
JBE rel32off | 0F 86 cd
* JNA

[CF = 0 and ZF = 0]
JNBE rel8off  | 77 cb
JNBE rel16off | 0F 87 cw
JNBE rel32off | 0F 87 cd
* JA

[SF = 1]
JS rel8off  | 78 cb
JS rel16off | 0F 88 cw
JS rel32off | 0F 88 cd

[SF = 0]
JNS rel8off  | 79 cb
JNS rel16off | 0F 89 cw
JNS rel32off | 0F 89 cd

[PF = 1]
JP rel8off  | 7A cb
JP rel16off | 0F 8A cw
JP rel32off | 0F 8A cd
* JPE

[PF = 0]
JNP rel8off  | 7B cb
JNP rel16off | 0F 8B cw
JNP rel32off | 0F 8B cd
* JPO

[SF <> OF]
JL rel8off  | 7C cb
JL rel16off | 0F 8C cw
JL rel32off | 0F 8C cd
* JNGE

[SF = OF]
JNL rel8off  | 7D cb
JNL rel16off | 0F 8D cw
JNL rel32off | 0F 8D cd
* JGE

[ZF = 1 or SF <> OF]
JLE rel8off  | 7E cb
JLE rel16off | 0F 8E cw
JLE rel32off | 0F 8E cd
* JNG

[ZF = 0 and SF = OF]
JNLE rel8off  | 7F cb
JNLE rel16off | 0F 8F cw
JNLE rel32off | 0F 8F cd
* JG
rFLAGS レジスタのフラグをチェックし、条件を満たしている場合は、指定された相対位置の移動先にジャンプします。
条件を満たしていない場合は、そのまま次の位置を実行します。

64bit モードでは、オペランドサイズはデフォルトで 64bit になります。また、オフセット値は 64bit に符号拡張されます。

これらの命令は、ファージャンプを実行できません。代わりに、反対の条件の Jcc と JMP 命令を使います。
LOOP rel8off   | E2 cb
LOOPE rel8off  | E1 cb | ZF = 1
LOOPZ rel8off  | E1 cb | ZF = 1
LOOPNE rel8off | E0 cb | ZF = 0
LOOPNZ rel8off | E0 cb | ZF = 0
カウントレジスタ (rCX) を 1 だけデクリメントし、rCX が 0 ではなく、かつ、ZF フラグが指定された条件を満たしている場合、指定された相対オフセット位置にジャンプします。
それ以外の場合、そのまま次の位置が実行されます。

LOOP 命令は、ZF フラグをチェックしません。
LOOPE/LOOPZ 命令は、rCX が 0 でなく、ZF フラグが 1 の場合、ジャンプします。
LOOPNE/LOOPNZ 命令は、rCX が 0 でなく、ZF フラグが 0 の場合、ジャンプします。

LOOPcc 命令自体は、ZF フラグの状態を変更しません。

カウントレジスタのサイズは、アドレスサイズ属性によって決まります (67h プレフィックス)。
64bit モードでは、ECX か RCX しか使用できません。

64bit モードでは、オペランドサイズはデフォルトで 64bit になります。また、オフセット値は 64bit に符号拡張されます。
JCXZ rel8off  | E3 cb | CX (64bit モードでは無効)
JECXZ rel8off | E3 cb | ECX
JRCXZ rel8off | E3 cb | RCX (64bit モードのみ)
カウントレジスタ (rCX) が 0 の場合、指定された 8bit の相対オフセット位置にジャンプします。
それ以外の場合、そのまま次の位置が実行されます。

カウントレジスタのサイズは、アドレスサイズ属性によって決まります (67h プレフィックス)。
64bit モードでは ECX か RCX しか使用できません。

64bit モードでは、オペランドサイズは、デフォルトで 64bit になります。また、オフセット値は 64bit に符号拡張されます。
プロシージャ
CALL rel16off  | E8 iw | x 64bit モード
CALL rel32off  | E8 id
CALL reg/mem16 | FF /2 | x 64bit モード
CALL reg/mem32 | FF /2 | x 64bit モード
CALL reg/mem64 | FF /2
この命令の次の位置のオフセット値 (戻ってくる時の位置) をスタックにプッシュした後、指定アドレスのプロシージャに制御を移します。

この形式の場合、呼び出すプロシージャは、同じコードセグメントに配置されています。

オペランドが即値オフセットで指定されている場合、相対位置として、符号付きオフセット値が rIP に加算され、16/32/64bit に切り捨てられます。
オペランドがレジスタ/メモリで指定されている場合、絶対位置として、rIP に値がセットされます。

rIP のサイズと、スタックに PUSH するサイズは、命令のオペランドサイズによって異なります。

64bit モードの場合、オペランドサイズはデフォルトで 64bit になります。32bit オペランドサイズを使用するためのプレフィックスはありません。

呼び出したプロシージャで RET が実行されると、スタックから rIP がポップされ、元の位置に戻ってきます。
CALL FAR pntr16:16 | 9A cd | x 64bit モード
CALL FAR pntr16:32 | 9A cp | x 64bit モード
CALL FAR mem16:16  | FF /3
CALL FAR mem16:32  | FF /3
戻ってくる時の情報をスタックにプッシュし、指定アドレスのプロシージャに制御を移します。
オペランドでは、ターゲットセレクタとオフセットを指定します。

64bit モードでは、間接ファーコールのみが許可されます。
直接ファーコールを実行すると、未定義のオペコード例外が生成されます。

命令で使用されるターゲットセレクタは、すべての動作モードでコードセレクタにすることができます。
さらに、ターゲットセレクタは、プロテクトモードのコールゲート、またはレガシー・プロテクトモードのタスクゲートまたは TSS セレクタを参照できます。

  • ターゲットはコードセレクタ
    次の命令位置の CS:rIP が、スタックにプッシュされます。
    次に、ターゲットの CS:rIP からコードが実行されます。
    CPL の変更は許可されません。
  • ターゲットはコールゲート
    実際のターゲットコードセグメントとオフセットを指定します。
    コールゲートを使用すると、同じまたはそれ以上の特権コードの呼び出しが可能になります。

    ターゲットセグメントが、現在のコードセグメントと同じ CPL にある場合、次の命令位置の CS:rIP がスタックにプッシュされます。
    CALL (Far) が特権レベルを変更すると、TSS からの内部レベルのスタックポインタを使用して、スタック切り替えが発生し、次の命令位置の CS:rIP が、新しいスタックにプッシュされます。
    レガシーモードで、コールゲートの param-count フィールドがゼロ以外の場合、最大 31 個のオペランドが、呼び出し元のスタックから新しいスタックにコピーされます。
    最後に、呼び出し元の SS:rSP が、新しいスタックにプッシュされます。

    ロングモードでは、64bit コードセグメントを指す必要がある、64bit コールゲートのみが許可されます。
  • ターゲットがタスクゲートまたは TSS
    モードがレガシー・プロテクトモードの場合、タスクの切り替えが発生します。
    タスク切り替えは、ロングモードではサポートされません。
RET | C3
RET imm16 | C2 iw
CALL (near) 命令によって呼び出されたプロシージャから戻ります。
この命令は、スタックから rIP をポップします。

RET 命令は、rSP に加算するための、即値オペランドを受け入れることができます。
これにより、不要になった引数をスキップできます。

64bit モードでは、オペランドサイズはデフォルトで 64bit です。32bit オペランドサイズとして指定できるプレフィックスはありません。
RETF | CB
RETF imm16 | CA iw
CALL (far) 命令によって呼び出されたプロシージャから戻ります。
同じ CPL または、より権限の低い CPL に戻ることができます。

この命令は、CS と rIP を、スタックからポップします。
新しいコードセグメントの特権が、現在のコードセグメントよりも低い場合、スタックポインタには、即値オペランド (存在する場合) のバイト数が加算されます。
その後、新しい SS と rSP も、スタックからポップされます。

すべての POP サイズは、オペランドサイズによって決まります。

CPL が変更されると、新しい CPL でアクセスできないデータセグメント (DS、ES、FS、GS) のデータセグメントセレクタは、NULL に設定されます。
ENTER imm16, 0    | C8 iw 00
ENTER imm16, 1    | C8 iw 01
ENTER imm16, imm8 | C8 iw ib
スタックフレームを作成します。
第1オペランドは、rSP から減算するサイズ (ローカル変数として割り当てるサイズ) を指定します。
第2オペランドは、ネストレベルを指定します (0〜31。自動的に 5 bit でマスクされる)。

rBP は常にプッシュされます。
ネストレベルが 1 の場合、PUSH rBP の後に、PUSH rSP が行われます。
ネストレベルが 2 以上の場合、スタックから各レベルの rBP 値をコピーしてプッシュします。

; level = 0 時は以下と同じ
push rBP
mov rBP, rSP
sub rSP, N

64bit モードでは、オペランドサイズはデフォルトで 64bit です。32bit オペランドサイズとして指定できるプレフィックスはありません。
LEAVE | C9
スタックフレームを解放します。

;以下と同じ
mov rSP, rBP
pop rBP

64bit モードでは、オペランドサイズのデフォルトは 64bit です。32bit オペランドサイズとして指定できるプレフィックスはありません。
メモリのロード/ストア/比較
LODS mem8  | AC
LODS mem16 | AD
LODS mem32 | AD
LODS mem64 | AD
LODSB | AC
LODSW | AD
LODSD | AD
LODSQ | AD
DS:rSI が指すメモリ位置から、オペランドサイズに応じて 1,2,4,8 byte の値を読み込んで、AL/AX/EAX/RAX レジスタにコピーし、rSI の値を DF フラグに応じて加算/減算します。

LODS 命令では、明示的に seg:rSI (seg はデフォルトで DS) でアドレスを指定します。
その他の命令では、DS:rSI が使用されます (セグメントプレフィックスは許可されません)。

REP プレフィックスをサポートします。
MOVS mem8, mem8   | A4
MOVS mem16, mem16 | A5
MOVS mem32, mem32 | A5
MOVS mem64, mem64 | A5
MOVSB | A4
MOVSW | A5
MOVSD | A5
MOVSQ | A5
DS:rSI が指すメモリ位置から、1,2,4,8 byte 単位で、ES:rDI が指すメモリ位置に値をコピーし、DF フラグの設定に従って、rSI と rDI レジスタの値を加算または減算します。

MOVS 命令では、明示的にメモリ位置を指定します。
第1オペランドは seg:rSI (seg はデフォルトで DS)、第2オペランドは常に ES:rDI として、アドレス指定します。

オペランドがない形式では、DS:rSI と ES:rDI が指定されます (セグメントプレフィックスは許可されません)。

REP プレフィックスをサポートします。
STOS mem8  | AA
STOS mem16 | AB
STOS mem32 | AB
STOS mem64 | AB
STOSB | AA
STOSW | AB
STOSD | AB
STOSQ | AB
AL/AX/EAX/RAX レジスタの値を、ES:rDI が指すメモリ位置にコピーし、rDI の値を、DF フラグに応じて加算/減算します。

REP プレフィックスをサポートしています。
CMPS mem8, mem8   | A6
CMPS mem16, mem16 | A7
CMPS mem32, mem32 | A7
CMPS mem64, mem64 | A7
CMPSB | A6
CMPSW | A7
CMPSD | A7
CMPSQ | A7
rSI と rDI レジスタが指す2つのメモリ位置の 1,2,4,8 byte の値を比較して、rFLAGS のフラグを設定し、DF フラグに応じて、rSI と rDI の値を加算/減算します。

比較を実行するために、第1オペランドから第2オペランドの値を減算し、SUB 命令と同じ方法でフラグを設定しますが、第1オペランドの内容は変更されません。

CMPS 命令では、明示的にメモリ位置を指定します。
第1オペランドは seg:rSI (seg はデフォルトで DS)、第2オペランドは常に ES:rDI でアドレス指定します。
それ以外の命令では、DS:rSI と ES:rDI が指定されます。

REPE/REPZ/REPNE/REPNZ プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF
SCAS mem8  | AE
SCAS mem16 | AF
SCAS mem32 | AF
SCAS mem64 | AF
SCASB | AE
SCASW | AF
SCASD | AF
SCASQ | AF
ES:rDI が示すメモリ位置の 1,2,4,8 byte 値と、AL/AX/EAX/RAX レジスタの値を比較して、rFLAGS のフラグを設定し、DF フラグに従って、rDI の値を加算/減算します。

SCAS 命令は、明示的に ES:rDI でアドレス指定します。それ以外は、ES:rDI が使用されます。

REPE/REPZ/REPNE/REPNZ プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF