導入
レジスタだけでは箱が足りません。大量のデータはメモリに置き、必要なときにレジスタへ読み込みます。メモリのアクセスは角かっこ [ ] で表します。
説明
[レジスタ] は「そのレジスタが指すアドレスのメモリ」を意味します(ポインタの参照外しに相当)。
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 です。次章では、cmp と jmp で「分岐」と「ループ」を作ります。