XINU
00-arm32bit

ARM (32bit)の基本情報

Cortex-A8 (BeageleBone Black の CPU)テクニカルリファレンス

ARM 32bit レジスタ

レジスタ 別名 役割
r0 a1 汎用レジスタ(引数の受け渡し、関数の返り値に使用)
r1 a2 汎用レジスタ(引数の受け渡し、関数の返り値に使用)
r2 a3 汎用レジスタ(引数の受け渡し、関数の返り値に使用)
r3 a4 汎用レジスタ(引数の受け渡し、関数の返り値に使用)
r4 v1 汎用レジスタ
r5 v2 汎用レジスタ
r6 v3 汎用レジスタ
r7 v4 汎用レジスタ
r8 v5 汎用レジスタ
r9 sb 汎用レジスタ(静的データセグメントのベースアドレス)
r10 sl 汎用レジスタ (スタックリミット)
r11 fp 汎用レジスタ(フレームポインタ)
r12 ip プロシージャ内呼び出しスクラッチレジスタ
r13 sp スタックポインタ
r14 lr リンクレジスタ(リターンアドレス)
r15 pc プログラムカウンタ
cpsr - カレントプログラムステータスレジスタ

cpsr(カレントプログラムステータスレジスタ)

cpsr は、プロセッサの演算結果や動作モード・割り込み設定状態を保持するレジスタである。

Bit 名称 役割
31 N 演算結果が負の場合に設定される
30 Z 演算結果が 0 の場合に設定される
29 C 演算結果がキャリーアウトの場合に設定される
28 V 演算結果がオーバフローの場合に設定される
27 Q 飽和が発生した事を示す(自動クリアされない)
26〜25 IT Thumb IT (If-Then)命令用のステータスを示す
24 J プロセッサが Jazelle(※1) 状態かどうかを示す
23〜20 予約 予約された Bit。
19〜16 GE[3:0] 演算結果が〇〇以上の場合に設定される(SIMD 命令で使用される)
15〜10 IT[7:2] Thumb IT (If-Then)命令の状態を示す
9 E ロード/ストア命令のエンディアン形式を設定する
(0:リトルエンディアン、1:ビックエンディアン)
8 A 非同期アボートマスクする場合に設定される
7 I IRQ をマスクする場合に設定される
6 F FIQ をマスクする場合に設定される
5 T Thumb 命令の状態を示す
4〜0 M モード領域

※1 Java 仮想マシンによるバイトコード実行時にハードウェアアクセラレーションの
  アーキテクチャサポートを提供する。Jazelle-DBX と Jazelle-RCT がある。

コプロセッサ

プロセッサキャッシュや MMU の操作などでは、コプロセッサとコプロセッサ用レジスタを使用する。
コプロセッサは 16 個存在する。CP0〜9、CP12、CP13 はシステム独自の外部コプロセッサとして使用できる。
その他のコプロセッサは、下表に示す通り、予め役割を定められている。

コプロセッサ 役割
CP10 VFP(Vector Floating Point、単精度の浮動小数点)制御
CP11 VFP(Vector Floating Point、倍精度の浮動小数点)制御
CP14 デバッグおよび ETM(Embedded Trace Macrocell、実行命令履歴)制御
CP15 システム制御

ARM 32bit 命令

命令 役割
and 論理積を取る
orr 論理和を取る。
bic ビットをクリアする。
push レジスタ値をメモリに保存する
pop レジスタ値をメモリから復元する
mrs ステータスレジスタから汎用レジスタに値を移す
msr 汎用レジスタからステータスレジスタに値を移す
mrc コプロセッサから汎用レジスタに値を移す
mcr 汎用レジスタからコプロセッサに値を移す
mov レジスタからレジスタに値を移動する
str レジスタからメモリに値を移動する
ldr レジスタからレジスタに値を読み込む
b PC 値にオフセットを加えたメモリアドレス(ラベル先)に分岐する。
bl ラベル先へ分岐し、次の命令アドレスを r14(lr)にコピーする(※2)
cpsie I:IRQ 割り込みを許可、F:FIQ 割り込みを許可
cpsid I:IRQ 割り込みを禁止、F:FIQ 割り込みを禁止

※2 指定の番地へ分岐する前に戻りアドレスを R14=LR に保存するため、
   lr の内容を pc に書き込むと(MOV PC,LR)、元に戻る。

IRQ/FIQ 割り込み

FIQは高い優先度の高速割り込みであり、IRQ は通常優先度の割り込みである。
FIQは、プロセッサが状態を保存しなくて良いハードウェアのために存在し、 割り込み要求の処理中に「IRQ」および「その他の FIQ ハンドラ」を無効にする事によって
優先順位を付けている。FIQ ハンドラ処理中に他の割り込みは発生しない。

cpsr の I ビットが 0 および IRQ 端子が有効になった場合、IRQ 割り込み例外が発生する。
cpsr の F ビットが 0 および FIQ 端子が有効になった場合、FIQ 割り込み例外が発生する。

インラインアセンブラ

C 言語コード中でアセンブラを使用でき、インラインアセンブラ使用時に用いる命令は下表の通りである。

命令 役割
asm インラインアセンブラの仕様を意味する(※3)
volatile コードの最適化を抑制する。

構文は、asm(アセンブラコード :出力オペランド :入力オペランド :上書きされるレジスタリスト)という形式で、
":"以降の指定は全てオプションである。記載例は以下の通りである。

int func(int *a)
{
int result = 0;
asm volatile (
"mov r1, #99;"
"str r1, [%1];"
"mov %0, #88;"
: "=r"(result) /* 出力オペランド。"=r"の後に(C言語の変数名)を記載する */
: "r"(a) /* 入力オペランド・"=r"の後に(C言語の変数名)を記載する */
: /* オプションなので無記載でも良い。記載する場合は"r2"、"r3"...と記載する。*/
); /* 補足:%n部分(nは正の数値)が入出力オペランド。数値は定義順で振られる。 */
return ret;
}