x86アセンブリ言語に関するメモ
x86系マイクロプロセッサの持つ主なレジスタ
レジスタ名 | 呼び名 | 主な機能 |
---|---|---|
EAX | アキュムレータ | 算術演算の結果を格納 |
EBX | ベースレジスタ | メモリアドレスを格納 |
ECX | カウントレジスタ | ループ回数をカウント |
EDX | データレジスタ | データを格納 |
ESI | ソースインデックス | データ転送元のメモリアドレスを格納 |
EDI | ディスティネーションインデックス | データ転送先のメモリアドレスを格納 |
EBP | ベースポインタ | データの格納領域のメモリアドレスを格納 |
ESP | スタックポインタ | スタック領域のメモリアドレスを格納 |
主な命令
命令 | 使用例 | 意味 | 詳細 |
---|---|---|---|
MOV | MOV EAX,ECX | EAX = ECX | ECXの値をEAXに格納 |
MOVZX | MOVZX_EAX,ECX | EAX = ECX | MOVのサイズが違うレジスタにコピーするとき用いる版 |
ADD | ADD EAX,ECX | EAX += ECX | EAXにECXを加算 |
SUB | SUB EAX,ECX | EAX -= ECX | EAXからECXを減算 |
MUL | MUL EAX,ECX | EAX *= ECX | EAXにECXを乗算 |
DIV | DIV EAX,ECX | EAX =EAX / ECX | EAXをECXで割って,商をEAXに,余りをEDXに格納 |
EDX = EAX % ECX | |||
INC | INC EAX | EAX++ | EAXに1を加算 |
DEC | DEC EAX | EAX-- | EAXに1を減算 |
XOR | XOR EAX,ECX | EAX = EAX ^ ECX | EAXとECXの各ビットごとに排他的論理和を取り,結果をEAXに格納 |
LEA | LEA EAX,[ECX+4] | EAX = ECX + 4 | ECX+4(アドレス値)をEAXに格納 |
CMP | CMP EAX,ECX | if(EAX==ECX)_ZF=1 | EAXとECXの値を比較してフラグに反映 |
else ZF = 0 | EAXとECXが等しければZF=1,EAXとECXが等しくなければ、ZF=0 | ||
TEST | TEST EAX,EAX | if(EAX==0) ZF = 1 | EAXの値を0と比較してフラグに反映 |
else ZF = 0 | EAXが0と等しければZF=1,EAXが0でなければZF=0 | ||
JE(JZ) | JE 041001000 | if(ZF == 1) | ZFが1なら041001000にジャンプ |
GOTO 041001000 | |||
JNE(JNZ) | JNE 041001000 | if(ZF == 0) | ZFが0なら041001000にジャンプ |
GOTO 041001000 | |||
JMP | JMP 041001000 | GOTO 041001000 | 無条件で041001000にジャンプ |
CALL | CALL lstrcmpW | lstrcmpW() | lstrcmpw関数の呼び出し |
PUSH | PUSH 00000001 | スタックへ00000001を格納 | |
POP | POP EAX | スタックからEAXへ値を取得 | |
NOP | NOP | 何もしない | |
SAR | SAR EAX | EAXを右にシフトする,すなわち2で割る | |
RET | RET | 処理を呼び出し元に戻す |
豆知識
XOR EAX,EAX は MOV EAX,0 と同様の働きをする。
dword ptr は、指定されたメモリアドレスから4バイトのデータを読み出すことを示す。
例えば、
MOV DWORD PTR SS:[EBP-8],1
の場合ベースポインタのアドレス-8から4バイトまでのデータに整数値1を格納している。