アセンブリ
機械語と 1 対 1 に対応する、人間が読める表記。
mov %rdi, %rax # 第1引数を戻り値レジスタへ
add %rsi, %rax # 第2引数を足す
ret # 戻る機械語との関係#
原則として 1 行 = 1 命令。 アセンブラが機械語に変換する。 コンパイラと違い、 意味を変える最適化はしない(疑似命令の展開程度)。
なぜ今も読むのか#
書くことはほとんど無くても、読む場面はある。
| 場面 | 目的 |
|---|---|
| 性能解析 | コンパイラが何を生成したか確認する |
| デバッグ | 最適化で消えた変数を追う |
| リバースエンジニアリング | ソースが無いバイナリの解析 |
| 低レベル実装 | 起動処理、コンテキストスイッチ |
| 脆弱性解析 | 実際に何が起きるかの確認 |
「この if が分岐命令になるのか、
条件付き move になるのか」といった違いは、
アセンブリを見ないと分からない。
分岐予測を外す分岐か、そうでないかで性能が変わる。
呼び出し規約#
関数呼び出しでどのレジスタに何を置くかの取り決め。 ABI (Application Binary Interface) の一部。
System V AMD64 ABI(Linux、macOS)では
| 用途 | レジスタ |
|---|---|
| 整数引数 1〜6 | rdi, rsi, rdx, rcx, r8, r9 |
| 戻り値 | rax |
| 呼び出し先保存 | rbx, rbp, r12〜r15 |
規約が共通なので、 異なる言語で書かれた関数を相互に呼べる。 FFI が成立する基盤。
参考文献#
- Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/
- System V Application Binary Interface: AMD64 Architecture Processor Supplement. https://gitlab.com/x86-psABIs/x86-64-ABI