x86命令簡易表

詳細は例えばP4マニュアルを参照してください.


記号の意味


移動命令
mov reg, reg / mov [mem], reg / mov reg, [mem]

レジスタ間, メモリとレジスタ間の間のデータ転送に使います. メモリ間のデータ転送は出来ません. 右の値を左に代入します.

MASMとNASMとで表記が異なるので注意してください.

C表記MASMNASM
int data = *mem;mov reg32, dword ptr [mem]
または
mov reg32, dword ptr mem
mov reg32, [mem]
int *ptr = mem;mov reg32, offset memmov reg32, mem

movzx reg32, reg8 / movzx reg32, reg16 / movzx reg16, reg8

小さいほうのレジスタを大きいほうに 0 拡張して (unsignedで) 転送します.

movsx reg32, reg8 / movsx reg32, reg16 / movsx reg16, reg8

小さいほうのレジスタを大きいほうに符号拡張して (signedで) 転送します.

lea reg32, [reg32+reg32*C+offset] C = 1, 2, 4, 8

右のレジスタのアドレスを左に代入します. mov reg, mem と lea reg, [mem] は同じ意味ですが前者の方が命令長が小さいです.
lea eax, [eax+eax*4] とすると eax を 5 倍できます.

四則演算命令
add reg, reg / add reg, [mem] / add [mem], reg; sub も同様

足し算をします. 大抵の命令はメモリを引数にとることができます. 大抵の命令はメモリ上の演算も出来ます. 以下略.

imul regA, regB

符号付きで regA * regB を計算し下位 32bit を regA に代入します.

mul reg32

符号無しで eax * reg を計算し [edx:eax] に結果を代入します.

div reg32 / idiv reg32

div は符号無し, idiv は符号付きで [edx:eax] を reg32 にで割り, 商を eax に, 余りを edx に代入します.

inc reg / dec reg

inc は reg++;, dec は reg--; の意味です.

neg reg

reg の符号を変えたものを reg に代入します.

論理演算命令
and / or / xor / not

分かるでしょう.

比較命令
cmp regA, regB

regA - regB の結果を flag に残します.

test regA, regB

regA & regB の結果を flag に残します.

無条件分岐命令
jmp address

address に無条件に分岐します.

条件付き分岐命令
jcc; cc にはさまざまな条件があります.

mov 命令を除く殆どの命令は flag を変化させます. flagにはいろいろありますがとりあえず C(carry), Z(zero), S(sign) だけで十分です. それぞれ桁上がり/下がりがあったとき, 結果の値が0のとき, 結果の値が負のとき真(1)になります.

例:


御意見は光成滋生<herumi@nifty.com>までお願いします