基本用語

アセンブリ言語を記述する上で最低限必要な用語について説明します.


命令

アセンブリ言語は一般的に次のような形式で記述します. 基本的に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)にジャンプ

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