IT

アセンブリの勉強法 (2/2)

この記事はアセンブリの勉強法の2/2の記事です。

前回の記事(1/2)はこちら

アセンブリおすすめ本その1:コンピュータハイジャッキング(前回)

アセンブリおすすめ本その2:低レベルプログラミング(今回)

f:id:rustacean:20181126213656p:plain

低レベルプログラミングという本は前回ご紹介したコンピュータハイジャッキングの次に読むべきだと個人的に思っている本です。アセンブリの知識を更に次のレベルに進めてくれますし、発売が2018年1月なので新しい情報が得られます。

この本の目的

この本で身につく知識は次のものがあると前書きに書かれています。

  • アセンブリ言語で自由自在に書くことができる。
  • Intel 64のプログラミングモデルを理解する。
  • C11で、保守が用意で堅牢なコードを書ける。
  • コンパイルのプロセスを理解し、アセンブリリストを解読できる。
  • コンパイルされたアセンブリコードのエラーをデバッグできる。
  • 適切な計算モデルを使うことで、プログラムの複雑さを大きく減らせる。
  • 性能が重視されるコードを書ける。

この内容の通り、それなりにレベルが高い本です。

そしてすごくおもしろい本です!

想定読者

この本の前書きには想定読者として、「プログラミングを学ぶ学生から、中程度から高程度のプログラマ、そしてプログラミングに取り憑かれたマニアまで」と書かれています。中程度のプログラマでもかなり読み応えがある本ですので、本当の初心者には難しいです。

一方で、アセンブリ言語を少し理解しているならば、自分のアセンブリの知識を中上級者にするためにこの本はぴったりな選択肢です。

前提知識

個人的には、次の知識がないと厳しいと感じました。

  • 1つ以上のシステムプログラミング言語(C, C++, Rustなど)の理解

本書の内容については後でも書きますが、コンピュータアーキテクチャについての基礎的な説明はわずか20ページだけであり、その次からはアセンブリ言語について重めの説明が始まります。そのため、システムプログラミング言語でヒープやスタックなどをある程度意識してプログラムを書いた経験がないとアセンブリ言語が何をしようとしているのかいまいち理解できない可能性があります。

  • レジスタとシステムコールの基本的な理解

レジスタとシステムコールについては、この本を最初に読んだときにいまいちパッとしませんでした。具体的には、機械語が2進数(あるいは16進数)の連続であるとして、それがどうやってCPU内で処理されるのか、ということです。

それはオペコード(命令)+オペランド(引数)の繰り返しです。ざっくり解説すると、個々のオペコード(16進数)は後に取る引数(=オペランド)のバイト数(=長さ)が決まっていて、オペランドが終われば次の数字はオペコードで、その次はそのオペコードに対応するオペランドが来て…という規則で数字を「命令(オペコード)」と「引数(オペランド)」に変えて実行しています。

これらの知識が少しはないと難しい可能性があります。もし知らなければ、前回ご紹介したコンピュータハイジャッキング等を読んで知識を埋めることをおすすめします。

本の構成

第1部 アセンブリ言語とコンピュータアーキテクチャ

  • 第1章 コンピュータアーキテクチャの基礎
  • 第2章 アセンブリ言語
  • 第3章 レガシー
  • 第4章 仮想メモリ
  • 第5章 コンパイル処理のパイプライン
  • 第6章 割り込みとシステムコール
  • 第7章 計算モデル

第2部 プログラミング言語C

  • 第8章 基礎
  • 第9章 型システム
  • 第10章 コードの構造
  • 第11章 メモリ
  • 第12章 構文と意味と実際
  • 第13章 良いコードを書くには

第3部 Cとアセンブラの間

  • 第14章 変換処理の詳細
  • 第15章 共有オブジェクトとコードモデル
  • 第16章 性能
  • 第17章 マルチスレッド

第4部 付録

  • 第18章 付録A:gdbを使う
  • 第19章 付録B:makeを使う
  • 第20章 付録C:システムコール
  • 第21章 付録D:性能テストの情報
  • 第22章 付録E:参考文献

参考:https://www.shoeisha.co.jp/book/detail/9784798155036

参考資料

  • 本書で使われている環境のVMやソースコードはこのGitHubリポジトリにあります。前回も述べましたが、アセンブリは実行環境によって挙動が大きく変わってしまうことがあるので最初はVMを使うことを推奨します。
  • 正誤表がHPから見られます。