コース目次 / 第1章
基本の文法 — レジスタと、基本命令
レジスタがCPUの手元にある高速な記憶場所であることを理解し、mov/add等の基本命令をIntel記法で読みます。汎用レジスタの名前と、64/32/16/8bit幅の表記を押さえます。
レジスタは、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章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。