ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

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個以上の引数を渡すと効率が悪い。その場合、構造体を使う方が効率的。