アセンブリ言語を記述する上で最低限必要な用語について説明します.
アセンブリ言語は一般的に次のような形式で記述します. 基本的に1行1命令です. マルチステートメントはしません.
[ラベル:] [オペコード [オペランド1 [オペランド2 [オペランド3]]]]
オペランドに書かれた数値がそのまま使われるとき, その数値を即値といいます. 8/16/32bitの整数を指定できます.
例:
mov eax, 2 ; eax = 2;
add bx, 0xFFFF ; bx += 0xFFFF;
コード上で指定したメモリのアドレスを参照するときにも利用します.
buf dd 123 ; int buf = 123; 相当
; NASMでは次のように記述します.
mov eax, buf ; eax = &buf;
; MASMでは次のように記述します.
mov eax, offset buf
ラベルへのジャンプ先にも使います.
.loop:
mov eax, 3
jmp .loop ; goto .loop; 相当
この場合, 書かれた命令のアドレスとloopのアドレスの差がjmp命令のオペランドになります.
メモリ上に書かれた値を参照するには次のように書きます.
buf dd 123 ; int buf = 123;
buf2 dw 64 ; short buf2 = 64;
; NASMでは次のように記述します.
mov eax, [buf] ; eax = buf;
mov ax, [buf2] ; ax = buf2;
; MASMでは次のように記述します.
mov eax, dword ptr [buf]
mov ax, word ptr [buf2]
; 次のように省略できます.
; NASMの即値表記と意味が逆転するので注意してください.
mov eax, buf
mov ax, buf2
メモリやレジスタに入った値を利用してジャンプすることも出来ます. 間接ジャンプといいます.
buf dd 0x12345678
.lp:
mov eax, .lp
jmp [eax] ; .pにジャンプ
jmp buf ; bufの中身のアドレス(0x12345678)にジャンプ