アセンブリ言語を学習するときにオススメしたい書籍やサービス
コンピューターサイエンスの学習の一端で、OSのコードを読んだり、アセンブリ言語や機械語などハードウェアに近い低レイヤーの学習をしてきました。
今回は、アセンブリ言語を読んで解読するために、プログラムの動く仕組みやメモリの仕組みなどを学べる書籍、その学習で使ったサービスなどをご紹介していきます。
まずはCPUの知識を身につける
Webエンジニアとして開発の仕事をしていますが、レジスタやメモリを意識することなくコードを書ける言語が多いので、ほとんど意識することがありませんでした。
CPUに関して全く知識がありませんでした。
アセンブリ言語を読んでいくためには、まずCPUのレジスタ周りの知識がないと難しいです。
重要になるレジスタは具体的に、PCレジスタ(プログラムカウンタ。またはインストラクションポインタでIPと呼ばれたりする)、SP(スタックポインタ)、BP(ベースポインタ)などかなと思います。
スタックの操作やPCの操作などが出てきたりするので
- x86って何か
- RISCやCISCの違い
- リトルエンディアン、ビッグエンディアンの違い
- espレジスタとrspレジスタの違い
- レジスタの種類(汎用レジスタや浮動小数点用のXMMレジスタなど)
- スタックの仕組み(メモリ、LIFOなどについて)
などを知っていないとアセンブリ言語のコードを読み解くことは難しいと思いました。
初めはアセンブリ言語のコードをみてもさっぱり読めなかったので、まずはCPU周りの知識を学びました。
読んだ本はこちらです。
図解雑学 CPUの働きと高速化のしくみ (図解雑学シリーズ)
雑学シリーズは時系列で解説されていることが多く、初心者にもわかりやすいので個人的に好きなシリーズです。
4004とか8086、80286、PT/AT互換機なども書いてあっていままでよくわからなかった部分が理解できるようになりました。
入門書で学ぶ
この本で基本的な知識を身につけたあとは入門書で学びました。
それがこの本です。
プログラムの不思議を解く―実力派プログラマのための教養としてのアセンブラ入門
64ビットのアセンブラを解説しています。
「8ビットからやった方が簡単じゃない?」と言われましたが、今使っているマシンは64ビットが多いと思うので、実際に動かしてコードを確認できて読めたのが面白かったです。
もし仮に8ビットで学びたい場合は、このサイトを使うと良いと思います。
ブラウザで8ビットアセンブラを書いて実行することができます。
実際に動きを1つずつ追ってみる
次に、スタックで関数コールが行われたときに、各レジスタはどのように操作されるのか?を学びました。
それを学ぶのにピッタリなサイトがあります。
実際に1命令ずつ実行して、どのようにレジスタが操作されていくのかの動作を追うことができます。
関数コール時のスタック操作を理解したいときに、非常に助かりました。
C言語でアセンブリ言語のコンパイラを作る
そしてこのサイトでコンパイラの作り方を学びました。
コンパイラと低レイヤーを学びたいと思っていた僕にとって、ドンピシャのサイトでした。
EBNFや実装の方法などもわかりやすくてオススメです。
そして挑戦していること
unix v6のOSのコードを読んでいます。
ブートローダーとかシステムコールの部分はアセンブリ言語で書かれているので、アセンブリ言語を学んでいてよかったと思えました。
OSのコードはすごく難しいのでなかなか大変ですが、頑張りたいと思います。(巧妙に書かれているのと、相互参照的なのが多いので全体像をつかむまでが大変😓)
OSの学習についてはまた進んだら別途noteを書きたいと思います。
ここまで必要ないとは思いますが、アセンブリ言語に興味がでてきたので、この本を読み物として読んでみたいと思います。(しかし分厚いw)
この記事が気に入ったらサポートをしてみませんか?