導入
まず、いつも書いているコードが「最終的にどうなるか」を見てみましょう。次の C のコードは、コンパイルするとアセンブリになります。
説明
C のコード:
int add(int a, int b) {
return a + b;
}
これを x86-64 のアセンブリにすると、およそ次のようになります(Intel 記法)。
add:
mov eax, edi ; 第1引数(a)を eax にコピー
add eax, esi ; eax に 第2引数(b) を足す
ret ; eax を戻り値として関数を終了
add:… ラベル。関数やジャンプ先の目印です(末尾のコロンが目印)。mov eax, edi…ediの値をeaxへコピーする命令。Intel 記法は命令 書き込み先, 読み込み元の順です。;から行末まではコメント。- 高級言語の1行が、複数の単純な命令に分解されているのが分かります。
説明(機械語との関係)
mov eax, edi は、実際には 89 f8 のようなバイト列(機械語)です。アセンブリは、この数値の羅列に mov のようなニーモニック(覚えやすい名前)を付けたものにすぎません。だから、アセンブリと機械語はほぼ1対1で対応します。