凡例
reg*は*bitレジスタを指す。
何が対応するかは下表参照。
何が対応するかは下表参照。
レジスタ | A | B | C | D | S | D |
reg8(byte) | AL,AH | BL,BH | CL,CH | DL,DH | - | - |
reg16(word = 2バイト) | AX | BX | CX | DX | SI | DI |
reg32(dword = 4バイト) | EAX | EBX | ECX | EDX | ESI | EDI |
imm*は*bit即値を指す。( imm8は8ビット即値、すなわち0x00~0xFF )
reg32/imm32といった表記がされるが、この場合reg32かimm32のどちらかが扱える。
memはメモリを指す。( [0x004B5B4C]等 )
memに含まれうる要素として
memに含まれうる要素として
- 相対オフセット(imm32)
- ベースレジスタ(reg32)
- インデックスレジスタ(reg32)
- スケール(2,4,8のみ)
が存在する。
一部のオペコードにおいてmemに[ベース+インデックス*スケール+オフセット]が扱える場合、memの代わりにmemAを表記する。
またmemにはreg32も扱える。([EAX]等、memAも同様)
一部のオペコードにおいてmemに[ベース+インデックス*スケール+オフセット]が扱える場合、memの代わりにmemAを表記する。
またmemにはreg32も扱える。([EAX]等、memAも同様)
ptrの前に置かれる*にはbyte, word, dwordのどれかが入る。
オペコードに置かれる*には、E, NE, Sなどが入る。
詳しくは"x86 条件"で検索。
オペコードに置かれる*には、E, NE, Sなどが入る。
詳しくは"x86 条件"で検索。
一覧
Intel記法を掲載
オペコード | オペランド | 説明 | 注意事項 | 例 |
---|---|---|---|---|
MOV | reg,reg/imm | 代入 | immのサイズはregのサイズを越さない regのサイズは要合致 |
MOV ECX,0x00000010 (ECXに0x00000010を代入) MOV EAX,EBX (EBXの内容をEAXにコピー) |
MOV | reg,[memA] | memAにある値をレジスタにコピー | [memA]は読み取り属性が無いと例外落ち | MOV ESI,[0x004B5B4C] (0x004B5B4Cにある値をESIにコピー) MOV EAX,[ESI+ECX*4+0x0000B750] (ESI+ECX*4+0x0000B750にある値をEAXにコピー) |
MOV | * ptr [memA],reg/imm | レジスタの値か即値 をmemAにコピー | [memA]は書き込み属性が無いと例外落ち *とreg/immのサイズは要合致 |
MOV DWORD PTR [0x004B48E8],EAX (EAXの内容を[0x004B48E8]にコピー) MOV BYTE PTR [EAX],0x01 (EAXの内容が指すメモリに1を代入) |
CMOV* | reg,reg/[memA] | 条件が合えば レジスタかmemAにある値 をレジスタにコピー | [memA]は読み取り属性が無いと例外落ち regのサイズは要合致 |
CMOVE EAX,[ESI](ゼロフラグが立っているなら[ESI]にある値をEAXにコピー) |
XOR | reg,reg | レジスタ間排他的論理和 | regのサイズは要合致 | XOR EAX,EAX (EAXをEAXで排他的論理和をかける = EAXを0x00000000にする) |
AND | * ptr [memA],reg/imm | memAにある値を レジスタの値か即値 で論理積をかける | [memA]は書き込み属性が無いと例外落ち *とreg/immのサイズは要合致 |
AND DWORD PTR [EAX+0x00000E24],0x00 ([EAX+0x00000E24]を0x00で論理積をかける) |
ADD | reg,reg/imm | 加算 | immのサイズはregのサイズを越さない regのサイズは要合致 |
ADD ESP,0x04 (スタックポインタに0x04を足す) ADD EAX,ECX (EAXにECXを足す) |
ADD | reg,[memA] | レジスタにmemAにある値を加算 | [memA]は読み取り属性が無いと例外落ち | ADD ESI,[EAX+0x20] (EAX+0x20にある値をESIに加算) |
ADD | * ptr [memA],reg/imm | memAにある値に レジスタの値か即値 を加算 | [memA]は書き込み属性が無いと例外落ち | ADD DWORD PTR [EAX+0x60],0x11111111 (EAX+0x60にある値に0x11111111を加算) |
SUB | reg,reg/imm | 減算 | immのサイズはregのサイズを越さない regのサイズは要合致 |
SUB ESP,0x18 (ESPから0x18を引く) |
SUB | reg,[memA] | レジスタからmemAにある値を減算 | [memA]は読み取り属性が無いと例外落ち | |
SUB | * ptr [memA],reg/imm | memAにある値から レジスタの値か即値 を減算 | [memA]は書き込み属性が無いと例外落ち | |
INC | reg | レジスタの値に1を足す | INC ECX (ECXに1を足す) | |
INC | * ptr [memA] | memAにある値に1を足す | [memA]は読み取り属性が無いと例外落ち | INC BYTE PTR [0x0041F87A] (0x0041F87Aにある値に1を足す) |
DEC | reg | レジスタの値から1を引く | DEC ECX (ECXに1を足す) | |
DEC | * ptr [memA] | memAにある値から1を引く | [memA]は読み取り属性が無いと例外落ち | DEC BYTE PTR [0x0041F87A] (0x0041F87Aにある値から1を引く) |
NEG | reg | レジスタの値を正負逆にする(=-1を掛ける) | NEG EAX (EAXの値に-1を掛ける) | |
NEG | * ptr [memA] | memAにある値を正負逆にする(=-1を掛ける) | [memA]は書き込み属性が無いと例外落ち | NEG DWORD PTR [ESI+40] (ESI+40にある値に-1を掛ける) |
NOT | reg | レジスタの値の各ビットを反転する | NOT DL (DLの各ビットを反転する) | |
NOT | * ptr [memA] | memAにある値の各ビットを反転する | [memA]は書き込み属性が無いと例外落ち | NOT DWORD PTR [ESP] (ESPにある値の各ビットを反転する) |
TEST | reg,reg | レジスタ間で論理積をかけ、結果に応じてフラグを設定 主にJZ(=JE)と併用 |
regのサイズは要合致 | TEST EAX,EAX (EAXが0x00000000ならゼロフラグを立てる 条件により他のフラグも立つ) |
CMP | reg,reg/imm | レジスタを レジスタの値か即値 で減算し、結果に応じてフラグを設定 主に条件ジャンプと併用 |
immのサイズはregのサイズを越さない regのサイズは要合致 |
CMP CL,0x01 (CLが0x01ならゼロフラグを立てる 条件により他のフラグも立つ) |
CMP | * ptr [memA],reg/imm | memAにある値を レジスタの値か即値 で減算し、結果に応じてフラグを設定 主に条件ジャンプと併用 |
immのサイズは[memA]のサイズを越さない [memA]は読み取り属性が無いと例外落ち |
CMP WORD PTR [0x004B6000],0xFFFF (0x004B6000にある値が0xFFFFならゼロフラグを立てる 条件により他のフラグも立つ) |
JMP | reg/imm | レジスタの値に絶対ジャンプ、もしくは即値に相対ジャンプする | JMP 0x004B4000 (0x004B4000に相対ジャンプする) | |
JMP | (* ptr)[memA] | memAにある値に絶対ジャンプする | [memA]は読み取り属性が無いと例外落ち | |
J* | imm | 条件が合えば即値に相対ジャンプする 詳しくは"条件ジャンプ"で検索 |
違うオペコードでも同じ処理をするものがある 例:JNGEとJL、JAEとJNB等 |
JZ 0x004B4000 (ゼロフラグが立っているなら0x004B4000のアドレスに相対ジャンプする) |
PUSHAD | EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDIをスタックにプッシュする | PUSHAD (汎用レジスタをスタックに退避させる) | ||
PUSHFD | フラグ(フラグレジスタ)をスタックにプッシュする | PUSHFD (フラグレジスタをスタックに退避させる) | ||
POPAD | EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDIをスタックからポップする | POPAD (退避させた汎用レジスタをスタックから戻す) | ||
POPFD | フラグ(フラグレジスタ)をスタックからポップする | POPFD (退避させたフラグレジスタをスタックから戻す) | ||
PUSH | reg/imm | レジスタの値か即値をスタックにプッシュする | PUSH EAX (EAXを続くCALLに引数を渡すためにスタックにプッシュする) | |
PUSH | * ptr [memA] | memAにある値をスタックにプッシュする | [memA]は読み取り属性が無いと例外落ち | |
CALL | reg/imm | レジスタの値に絶対コール、もしくは即値に相対コールする | CALL [0x0049F0D0] (0x0049F0D0にあるアドレスをコールする) | |
CALL | (* ptr)[memA] | memAにある値に絶対コールする | [memA]は読み取り属性が無いと例外落ち | |
POP | reg/imm | レジスタの値をスタックからポップする | POP EAX (EAXをスタックからポップする) | |
POP | * ptr [memA] | スタックからポップした値をmemAに代入する | [memA]は書き込み属性が無いと例外落ち | |
RET | [ESP]のアドレスにリターンする | RET (コード実行後の処理に復帰する) | ||
NOP | ? | 何もしない、アセンブラによってオペランドが扱える場合がある | NOP (1バイトの何もしない処理として空きを確保する) |