本文へスキップ
BecomeCoder

アセンブリ言語コース · 第2章 基本命令 · レッスン5

メモリを読み書きする ― [ ]

導入

レジスタだけでは箱が足りません。大量のデータはメモリに置き、必要なときにレジスタへ読み込みます。メモリのアクセスは角かっこ [ ] で表します。

説明

[レジスタ] は「そのレジスタが指すアドレスのメモリ」を意味します(ポインタの参照外しに相当)。

    mov     rax, [rdi]        ; rdi が指すメモリの値を rax に読み込む
    mov     [rdi], rax        ; rax の値を rdi が指すメモリへ書き込む
    mov     eax, [rdi + 4]    ; rdi + 4 バイト先を読む(配列の次の要素など)
    mov     eax, [rdi + rcx*4] ; rdi + rcx*4(4バイト配列の rcx 番目)
  • [rdi]rdi に入っているアドレスの中身にアクセスします。rdi 自身の値ではありません。
  • [rdi + 4] … アドレスをずらして、隣のデータへ。配列や構造体のアクセスに使います。
  • [base + index*scale] の形は、C の array[i] がそのまま機械語になったものです。

まとめ

「レジスタ = 値そのもの」「[レジスタ] = そのアドレスのメモリ」。この区別が、ポインタ理解の core です。次章では、cmpjmp で「分岐」と「ループ」を作ります。