コース目次 / 第1章

基本の文法 — レジスタと、基本命令

レジスタがCPUの手元にある高速な記憶場所であることを理解し、mov/add等の基本命令をIntel記法で読みます。汎用レジスタの名前と、64/32/16/8bit幅の表記を押さえます。

第1章 / 全5章目安 約9分この章のゴール: レジスタの役割と基本命令の読み方を理解する

レジスタは、CPU の中に直接ある、ごく少数の記憶場所です。メモリ(sec-c で見た、番地の付いた広大な空間)へのアクセスより、桁違いに高速です。CPU が計算するときは、まずメモリからレジスタに値を運び、レジスタの上で計算します。

主なレジスタ

x86-64 には、こういった汎用レジスタがあります。

レジスタ よくある使われ方
rax 計算結果・関数の戻り値
rdi, rsi, rdx, rcx, r8, r9 関数の引数(次章で詳しく)
rsp スタックポインタ(スタックの先端を指す)
rbp ベースポインタ(現在の関数フレームの基準)

名前の頭の r は 64bit 幅を示します。同じレジスタでも、幅によって呼び方が変わります——rax(64bit)・eax(下位32bit)・ax(下位16bit)・al(下位8bit)。int を扱う C コードでは、しばしば eax(32bit幅)が使われます。

最初の命令 — mov

もっとも頻出する命令が mov(move、移動)です。

mov eax, 5      ; eax に 5 を代入
mov ebx, eax    ; ebx に eax の値をコピー

Intel 記法では、mov 行き先, 元 の順——右から左へコピーします(数学の代入 eax = 5 と同じ向き)。C言語の x = y; と同じ感覚で読めます。

計算の命令

add eax, ebx    ; eax = eax + ebx
sub eax, 1      ; eax = eax - 1

これも同じ形——命令 行き先, 元で、行き先のレジスタ自身を書き換えます。add eax, ebx は「eax に ebx を足して、結果を eax に戻す」という意味です。

メモリを、レジスタ経由で読み書きする

角括弧 [...] は、「そのアドレスの中身」を表します。sec-c の *p(ポインタの指す先)と同じ発想です。

mov eax, [rbp-0x4]     ; rbp-0x4 番地の中身を eax に読み込む
mov [rbp-0x4], eax     ; eax の値を rbp-0x4 番地に書き込む

[rbp-0x4] は「rbp レジスタの値から4を引いたアドレス」を指します。関数のローカル変数は、多くの場合この rbp を基準にした相対アドレスで表されます。次章のスタックフレームで、この理由が分かります。

持ち帰る一言

mov 行き先, 元 は、右から左へのコピー。 角括弧はメモリの中身を指す。レジスタには幅違いの呼び方(rax/eax/ax/al)がある。この最小限の語彙で、次章から実際のプログラムのアセンブリを読み始めます。

こうなっていればOK

卒業まであと3章です。

この章はまだ完了していません。