ARMの勉強メモ
r13はスタックポインタ(sp)
r14はリンクレジスタ (lr)
r15はプログラムカウンタ(pc)
メモリマップのアドレス0x0000_0000はベクタテーブル用に予約されている。
(一部のプロセッサに0xffff_0000にするオプションもある)
32bit命令のサブセットを16bit命令にエンコードしたThumb命令セットがある。
r8-12はMOV、ADD、CMP命令のみアクセス可能。
cpsr、spsrを変更するのはThumbでは無理。Thumbステートにはコプロセッサ命令もない。
可能な限りintやlongの32bitデータ型を使用する。
ただし255+1で0にラップアラウンドさせたい場合などを除く。
charやshortを使うと値の範囲を減らすAND命令が増える。
関数の引数も、charやshortを使うとキャストするために命令が増える。
8bit値を一つ渡す場合でも、関数の引数・戻り値はintを使用するほうが効率的。
符号付きより符号なしの方が除算が速い。
0までカウントダウンするループにすると終了値を保持する必要がなくなる。
符号なしのループカウンタを用いて条件はi != 0にする。
1回以上実行されるとわかっている場合はforよりdo-whileの方がループオーバーヘッドが小さい。
関数の引数はr0,r1,r2,r3に渡される。それ以降の引数はスタック。
関数の戻り値はr0。
C++の場合、オブジェクトのメソッド呼び出しでの最初の引数はthisポインタ。
Cで5個以上、C++で4個以上の引数を渡すと効率が悪い。その場合、構造体を使う方が効率的。