理由の一つは、ここ数ヶ月は暇さえあれば本の原稿を書いていたからです。
本のタイトルはちょっと長いですが
『自作エミュレータで学ぶx86アーキテクチャ コンピュータが動く仕組みを徹底理解!』
ということになりました。
8月28日に出版予定でございます。
2015年8月23日更新:
Kindle 版が 2,152円+税で予約開始したようです。
自作エミュレータで学ぶx86アーキテクチャ コンピュータが動く仕組みを徹底理解!
共著の方(d-kamiさん)のブログでも紹介されています。
というわけで本を出版します - マイペースなプログラミング日記
タイトルの通り、この本はx86 CPUの機械語を実行するエミュレータソフトウェアを作りながらx86アーキテクチャを学んでいこうという本です。例えば
inc [ebp-4]
を機械語に変換するとff 45 fc
になり、それぞれがオペコード、ModR/M、ディスプレースメントに対応することを学びます。ModR/Mの中も実はビット単位で意味があり、Mod、REG、R/Mに分かれているんだよという話もします。2015年8月25日更新:
本書で作るエミュレータは x86 の中でも一部の機能を実装したとてもシンプルなものです。一言で表せば、オペランドサイズが 32 ビットのリアルモードエミュレータです。リアルモードの全命令を実装しているわけではありませんし、セグメント機構など高度な機能も実装しませんが、それでも C 言語で書いたプログラムを動かすことができるくらいの機能は持っています。人によっては物足りなく感じる方もいらっしゃると思いますが、本書は C 言語を学び終えたくらいの人が次に読む本を想定していますのでご了承ください。
CPUに閉じることなく、CPUとその周りとの関連も扱っています。x86 CPUはメインメモリにスタック構造を作ります。C言語入門した直後だとそもそもスタックを知らないかもしれませんので、一般的なスタックの話から始めて実際にメモリ上に作られるスタックフレームの話まで書いています。また、メモリより外の世界としてI/Oの話も扱います。CPUはI/Oを介して外界に繋がらなければ役立つ仕事はできません。エミュレータに
in
/out
命令とキャラクタデバイスを実装し、実際にキーボード入力とディスプレイ出力を行えるようにしてみます。最後の章では、実機でプログラムを実行する方法も説明しています。USBメモリのブートセクタに自作の機械語を書き込み、パソコンを起動させ、OSの力を借りずにプログラムを実行させます。BIOSの文字表示機能を使って、色付きの文字列を画面に表示させるのがゴールです。
1章では、皆さんが知ってるであろうC言語が、実際にCPUで実行されるときにどのような機械語になるか、バイナリを逆アセンブルしたりしながら学びます。16進数とか2の補数もここで学びます。
— 雲中の蛇使い (@uchan_nos) 2015, 8月 11
2章では、C言語の中でもポインタに絞って機械語やアセンブリ言語との関連を見ていきます。通常の変数とポインタ変数は、アセンブリの世界ではほとんど同じなんだということを学びます。関数ポインタが出てくるのもこの章です。
— 雲中の蛇使い (@uchan_nos) 2015, 8月 11
3章が中核となる章で、CPUが命令を実行する過程やModR/M、フラグレジスタの話をします。分岐命令とスタックフレームも説明します。leave命令をエミュレータに実装し終わるとC言語で書いたプログラムを動かせるようになります。
— 雲中の蛇使い (@uchan_nos) 2015, 8月 11
4章では、BIOSやブートセクタの説明をして、実機起動に向けて知識を付けます。最後に本物のUSBメモリにブートセクタを書き込んで起動してみます。
— 雲中の蛇使い (@uchan_nos) 2015, 8月 11
この本はC言語の入門書を読み終わったくらいのレベルの人が読めることを目指して書いているため、C言語プログラミングで入門の次に知ると良さそうな事柄、例えばファイル分割の方法とか、printfで色付きの文字列を出力する方法なども扱っています。1章分のページをまるまる使って、アセンブリ言語の視点からポインタを学び直すので、C言語のポインタで躓いてしまった人にも何らかのひらめきを与えられる可能性があります。
また、本書を通してx86エミュレータというある程度の規模のソフトウェアを作りあげる経験を通して、読者のプログラミング能力を養おうという裏の目標もあったりします。手軽にx86の機械語を実行できる環境を作るという(ある意味)実用的なゴールを持ってプログラミングを行うことで、学習のための学習より効果の高いプログラミング練習になるでしょう。
お近くの書店で目についた際にチラ見していただければ幸いです。
最後に目次情報を載せておきます。
最後に目次情報を載せておきます。
Chapter 1: C言語とアセンブリ言語
- 1.1. C言語から機械語へ
- 1.2. 機械語とアセンブリ言語
- 1.3. 機械語に飛び込む
- 1.4. アセンブリ言語を少し詳しく
- 1.5. 基本のmov命令
- 1.6. インクリメント専用のinc命令
- 1.7. 16進数入門
- 1.8. 2の補数入門
Chapter 2: ポインタとアセンブリ言語
- 2.1. レジスタ
- 2.2. メモリ
- 2.3. 初めてのエミュレータ
- 2.4. ポインタの復習
- 2.5. ポインタに飛び込む
- 2.6. 構造体とポインタ
- 2.7. 不完全型とポインタ
- 2.8. 関数ポインタ
Chapter 3: CPUがプログラムを実行する仕組み
- 3.1. プログラムの配置
- 3.2. エミュレータのorg対応
- 3.3. プログラムの実行
- 3.4. エミュレータのModR/M対応
- 3.5. 無条件分岐命令
- 3.6. call命令とスタック
- 3.7. エミュレータのcall対応
- 3.8. ローカル変数とスタック
- 3.9. フラグレジスタと条件分岐命令
- 3.10. エミュレータの条件分岐命令対応
- 3.11. プログラムの繰り返し
- 3.12. デバイスアクセス
Chapter 4: BIOSの仕組みと実機起動
- 4.1. BIOS
- 4.2. BIOSの実装
- 4.3. 割り込み
- 4.4. ブートセクタ
- 4.5. PBRを見てみよう
- 4.6. 実機で動かしてみよう
0 件のコメント:
コメントを投稿