前書き
言い訳
本書はまだ執筆途中です.不完全な部分があることをお許しください.
しかしながら,誤りの指摘や改善のためのコメントは歓迎いたします. 本書の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 Desktopをインストールする (Apple Silicon Mac用のVirtualBoxは2023/12/6時点でベータ版です)
- Apple Silicon Macなら仮想マシンUTM/QEMUをインストールして, (仮想化ではなく)エミュレートでUbuntu Serverをインストールする
です.
Linux環境を導入する方法:
- WSL2 (Windows Subsystem for Linux 2)を使えるように設定する.
- VirtualBoxや VMWare Fusion などの仮想マシンをインストールして,その仮想マシン上にUbuntuなどのLinuxをインストールする. Apple Silicon Mac上では,Intel Linuxのイメージは動作不可(2024/3現在).
- UTM/QEMUの仮想マシンに, (仮想化ではなく)エミュレートでUbuntu ServerなどのLinuxをインストールする. 動作が遅いので,Ubuntu Desktop ではなく Ubuntu Server が良いです. Ubuntu Serverのコンソールではコピペもできないので,sshでホストマシンからログインできるようにすると便利. Apple Silicon Mac上で,Intel Linuxのイメージが動作可能.
- Dockerなどのコンテナ実行環境をインストールして,その上でUbuntuなどのLinuxをインストールする.既存のイメージを使っても良い.Apple Silicon Mac上のDockerで,Intel Linuxのイメージが動作可能です.
- オンライン環境(例えばrepl.it)を使う.
Linux環境の導入方法を書くと切りが無いので,皆さん自身でググって下さい.
私が使った Ubuntu 22.04 LTSにはgcc
などが未インストールなので,
以下のコマンドでインストールしました.
$ sudo apt install build-essential
$ sudo apt install gdb
本書のライセンス
Copyright (C) 2023 Katsuhiko Gondow
本書はクリエイティブ・コモンズ4.0表示(CC-BY-NC 4.0)で提供します.
本書の作成・公開環境
- マークダウン環境 mdbook
- お絵かきツール draw.io
- 公開環境 Github Pages
本書のお約束
メモリの図では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のパソコンを貸して下さい😁