前書き

言い訳

本書はまだ執筆途中です.不完全な部分があることをお許しください.

しかしながら,誤りの指摘や改善のためのコメントは歓迎いたします. 本書のGithubリポジトリはこちらです.

本書の目的

本書は筆者(権藤克彦)が東京工業大学情報工学系で 長年担当したアセンブリ言語の授業の資料をオンライン資料として まとめ直したものです. Intel x86-64,Linux,GNUアセンブラを前提として「アセンブリ言語とは何か」 「具体的にどうプログラミングすればいいのか」を分かりやすくお伝えすることが目的です.

ただし,本書では以下は扱っていません.

  • 浮動小数点命令
  • (デバイスドライバの実装に必要な)I/O命令
  • (OSの実装に必要な)特権命令
  • MMX/SSE/AVXなどの拡張命令

いや,書いてもいいのですが分量が膨大になるので面倒くさいんです. もしOS自作に興味があるなら書籍ゼロからのOS自作入門を強くお勧めします.

本書で使う環境

本書では以下の環境を使用しています.皆さんの環境がLinuxであれば多少違っても大丈夫なはずです.

  • Ubuntu 22.04 LTS (OS)
  • GNU gcc-11.3.0 (コンパイラ)
  • GNU binutils-2.38 (バイナリ・ユーティリティ,GNUアセンブラasを含む)
  • GNU gdb-12.1 (デバッガ)

デバッガはアセンブリ言語の実行結果を確認するために便利ですので,ぜひ準備して下さい.

しかし,WindowsやmacOSの場合は,本書の内容と大きく異なってしまいます. アセンブリ言語は環境への依存度が高く,そのため移植性がとても低いからです.

皆さんのパソコンがWindowsやmacOSだった場合,Linux環境を導入する方法として以下のようないろいろな方法があります.筆者のお勧めは

  • WindowsならWSL2を使う
  • Intel Macなら仮想マシンVirtualBoxをインストールして,Ubuntuをインストールする (Apple Silicon Mac用のVirtualBoxは2023/12/6時点でベータ版です)

です.

Linux環境を導入する方法:

  • WSL2 (Windows Subsystem for Linux 2)を使えるように設定する
  • VirtualBoxVMWare Fusion などの仮想マシンをインストールして,その仮想マシン上にUbuntuなどのLinuxをインストールする.
  • Dockerなどのコンテナ実行環境をインストールして,その上でUbuntuなどのLinuxをインストールする.既存のイメージを使っても良い.Apple Silicon Mac上のDockerで,Intel Linuxのイメージが動作可能です.
  • オンライン環境(例えばrepl.it)を使う.

Linux環境の導入方法を書くと切りが無いので,皆さん自身でググって下さい.

私が使った Ubuntu 22.04 LTSにはgccなどが未インストールなので, 以下のコマンドでインストールしました.

$ sudo apt install build-essential

本書のライセンス

Copyright (C) 2023 Katsuhiko Gondow

本書はクリエイティブ・コモンズ4.0表示(CC-BY-NC 4.0)で提供します.

本書の作成・公開環境

本書のお約束

メモリの図では0番地が常に上

本書ではメモリの図を書く時,必ず0番地(低位アドレス)が上, 高位アドレスが下になるようにします.

その結果,本書の図では「スタックは上に成長」,「ヒープは下に成長」することになります (メモリレイアウト).

❶❷などの黒丸数字は説明用

実行結果中の❶や❷などの黒丸数字は,説明のために私が追加したものです. 実行結果の出力ではありません. 例えば,以下が例で,fileコマンドの出力例です. 本文中の説明と実行結果のどこが対応しているのかを明示するために使います.

$ file add5.o
add5.o: ❶ELF 64-bit ❷LSB ❸relocatable, x86-64, ❹version 1 (SYSV), ❺not stripped

Practical Binary Analysis という書籍がこうしていて便利なので真似させてもらっています.

一部を隠してます.

「細かい説明」「演習問題の答え」などはdetailsタグを使って隠しています. 最初は読み飛ばして構いません.読む場合は▶ボタンを押して下さい.

←このボタン(またはこの行)を押してみて下さい

これが隠されていた内容です.

一部の図はタブ表示にしています

一部の図はタブ切り替えでパラパラ漫画のように表示しています. 一度に全部を表示するとゴチャゴチャする場合などに使います. 以下はタブ表示の例です.

サンプルコードがあります

サンプルコード には2種類のファイルがあります.

  • *.s アセンブリコード
  • *.txt gdbのコマンド列が書かれたファイル

これらのファイルとデバッガgdbを使って機械語命令を実行・確認する方法は, こちらに説明があります. (サンプルコードの準備,めっちゃ大変だったので活用して頂けるととても嬉しいです).

(説明せず)擬似コードを使っている部分があります

例えば,mov命令の説明では movq %rax, %rbxの動作の説明として,%rbx = %raxと書いています. %rbx = %raxはアセンブリ言語でも無くC言語でも無い, C言語風の擬似コード(psuedo code)です. 「%raxレジスタの値を%rbxレジスタに格納する」という動作を 簡潔に表現する手段として使わせて下さい.

本書のお断り

2023/10/5現在,日本語検索に対応しました.

「ですます」調と「だである」調がまざってる

すみません,自覚してますがとりあえず放置です. 後で統一するかも知れませんし,しないかも知れません.

サンプルコードのインデントがおかしい

すみません,インデントしたコードブロック中でmdbookの#include機能を使うと 表示が狂ってしまうため,意図的にインデントしていない箇所が多々あります.

Todo

  • Intel CET対応のtigerlakeでサンプルコードを試していない.

    デフォルトのビルドで(endbr64が無い)サンプルコードがこけるとまずい どなたか tigerlakeのパソコンを貸して下さい😁