SummerWind

Web, Photography, Space Development

Programming with 64-Bit ARM Assembly Language

少し前に Programming with 64-Bit ARM Assembly Language という本を読んだ。以前 CPU とは何かを人に説明しようとした時に、最終的には全加算器とか半加算器といった論理回路で論理演算が行われるというのは分かるけど、実際にコードを実行して CPU で処理されるまでの過程ってどうなってるんだっけ?なにも分からん…となり、アセンブリプログラミングをやってみようと思ったのがきっかけだった。

アセンブリプログラミングを勉強するにあたって AArch64 (Arm64) をターゲットに選んだのは、単純に今使っているマシンが M1 チップの Mac であるのと、x86 系よりも命令がシンプルで分かりやすそうだったから。とはいえ Arm も最近の命令セットはそれなりに複雑で RISC と CISC みたいな分類はあまり有効でないらしい。命令セットなどの説明は Arm の公式サイトにあるドキュメントを参照すればいいのだけど、アセンブリプログラミングをすること自体が初めてだったので、体系的な説明が欲しくて本を探してみたらよさそうなのが見つかったのだった。

この本ではプログラムのロードやレジスタの利用、命令の実行、メモリレイアウト、システムコールの呼び出しなど、ちょうどプログラムの実行から CPU で処理されるところまでに関わる仕組みや概念が一通り説明されており、まさに知りたいことを理解するのにピッタリの内容だった。サンプルコードも充実しており、実際に手元で動かして試せるのもとても良い。

掲載されているサンプルコードは Linux 向けに書かれているので、macOS で試すにはコードを一部修正する必要があるのは注意 (特に LDR 命令がそのまま使えないのがなかなか辛い)。最初は修正方法がさっぱり分からなかったものの、調べてみると作者の解説記事や実際に M1 Mac で試した人のリポジトリが公開されていたのを見つけたので、そこに掲載されている情報をありがたく使わせてもらった。特にリポジトリには macOS ではこうする必要があるという説明がちゃんと書かれていてとても助けられた。

アセンブリで特定 CPU 向けに処理を高速化するコードをスラスラ書けるという状態にはほど遠いけど、CPU についての理解は深まったのが良かった。この本を読み進めていると今度は OS もなにも分からん…となったので、次は OS の仕組みについても調べてみようと思う。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。