比較 | |
CMP | 比較 |
---|---|
TEST | AND 比較 |
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オペランドのサイズに符号拡張します。
第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オペランドの内容は変更されません。
第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 命令を実行します。
この命令を使う場合、メモリマップド 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 プレフィックスがサポートされています。
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 プレフィックスがサポートされています。
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 プレフィックスがサポートされています。
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)
条件が満たされない場合、宛先レジスタは変更されません。
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)
条件を満たさない場合、値を 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 になります。
この形式の命令は、現在のコードセグメント内のアドレスにジャンプするため、ニアジャンプと呼ばれます。
即値としてオフセットが指定されている場合、値は、この命令の次の位置からの、相対的な符号付きオフセット位置です。
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 セレクタにすることもできます。
オペランドで、ターゲットセレクタとオフセットの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 命令を使います。
条件を満たしていない場合は、そのまま次の位置を実行します。
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 に符号拡張されます。
それ以外の場合、そのまま次の位置が実行されます。
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 に符号拡張されます。
それ以外の場合、そのまま次の位置が実行されます。
カウントレジスタのサイズは、アドレスサイズ属性によって決まります (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 がポップされ、元の位置に戻ってきます。
この形式の場合、呼び出すプロシージャは、同じコードセグメントに配置されています。
オペランドが即値オフセットで指定されている場合、相対位置として、符号付きオフセット値が 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 セレクタを参照できます。
オペランドでは、ターゲットセレクタとオフセットを指定します。
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 オペランドサイズとして指定できるプレフィックスはありません。
この命令は、スタックから 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 に設定されます。
同じ 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 値をコピーしてプッシュします。
64bit モードでは、オペランドサイズはデフォルトで 64bit です。32bit オペランドサイズとして指定できるプレフィックスはありません。
第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
スタックフレームを解放します。
64bit モードでは、オペランドサイズのデフォルトは 64bit です。32bit オペランドサイズとして指定できるプレフィックスはありません。
;以下と同じ 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 プレフィックスをサポートします。
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 プレフィックスをサポートします。
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 プレフィックスをサポートしています。
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 プレフィックスをサポートします。
比較を実行するために、第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 プレフィックスをサポートします。
SCAS 命令は、明示的に ES:rDI でアドレス指定します。それ以外は、ES:rDI が使用されます。
REPE/REPZ/REPNE/REPNZ プレフィックスをサポートします。
rFLAGS
CF, PF, AF, ZF, SF, OF