詳細は例えばP4マニュアルを参照してください.
記号の意味
mov reg, reg / mov [mem], reg / mov reg, [mem]
レジスタ間, メモリとレジスタ間の間のデータ転送に使います. メモリ間のデータ転送は出来ません. 右の値を左に代入します.
MASMとNASMとで表記が異なるので注意してください.
C表記 | MASM | NASM |
---|---|---|
int data = *mem; | mov reg32, dword ptr [mem] または mov reg32, dword ptr mem | mov reg32, [mem] |
int *ptr = mem; | mov reg32, offset mem | mov 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)になります.
例: