前回、唐突にアセンブラ言語から入ったわけであるが、アセンブラ言語で注意しなければいけない点はなんだろうか?
よく言われていることだが、アセンブラは抽象度が低い。
C++ はいうに及ばず、比較的低レイヤーの操作を得意とする C でも普通にコーディングする際にはハードを意識する必要はほとんどない。
この事情は 1-1 からでも伺えるであろう。
CPU のアーキテクチャが x86-64 であっても arm であっても、(当たり前だが)C のコードは一緒でいい。アーキテクチャの違いをコンパイラーが吸収してしまからだ。
ところが、アセンブラは、命令セットなどは基本的には CPU に依存するため、CPU の仕様が頭に入ってないとまとまったプログラムを組むのは難しい。
つまり、汎用性のあるアセンブリ言語というものは存在せず、
・arm に対応したアセンブリ言語
・x86_64 に対応したアセンブリ言語
がそれぞれ存在している、というのが実態なのだ。
幸運なことに MacOS に入っている clang はアーキテクチャを指定することで、x86_64 向け・arm 向けのアセンブラを出力できるので、arm 向けのアセンブラ出力から arm のアーキテクチャを探っていくことにする。
なお、一口に arm といっても、型番によって微妙に違いがある。
例えば、v7 までは 32bit CPU だが、v8 は 64bit である。
ここでは Mac を前提にしているので、特に断らない限り cortex シリーズを前提に話を進めていく。