アセンブリ

アセンブリ

執筆済 コンピュータ

機械語と 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 が成立する基盤。

参考文献#

ノート一覧を閉じる