次のテーブルはARM7TDMIの各モードで利用可能なレジスタの一覧です。
全部で37個の32bitレジスタがあり、そのうち31個は汎用レジスタ(Rxx)で6個はステータスレジスタです(xPSR)。
いくつかのレジスタはバンク方式であることに注意してください。例をあげると、それぞれのモードはそれぞれ独自のR14レジスタを持っています。
もちろん、バンク方式でないレジスタもあります。例えばR0はどのモードも共有しています。
System | User FIQ | Supervisor | Abort | IRQ | Undefined |
---|---|---|---|---|---|
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8_fiq | R8 | R8 | R8 | R8 |
R9 | R9_fiq | R9 | R9 | R9 | R9 |
R10 | R10_fiq | R10 | R10 | R10 | R10 |
R11 | R11_fiq | R11 | R11 | R11 | R11 |
R12 | R12_fiq | R12 | R12 | R12 | R12 |
R13 | R13_fiq | R13_svc | R13_abt | R13_irq | R13_und |
R14 | R14_fiq | R14_svc | R14_abt | R14_irq | R14_und |
R15 | R15 | R15 | R15 | R15 | R15 |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
-- | SPSR_fiq | SPSR_svc | SPSR_abt | SPSR_irq | SPSR_und |
これらの13個のレジスタは、さまざまな目的に使用可能です。
基本的には、それぞれのレジスタの機能や性能は同じで、演算用の「高速アキュムレータ」やメモリアドレス指定用の「ポインタレジスタ」のような特殊な用途に限定されたレジスタはありません。
ただし、THUMBモードではR0~R7(Loレジスタ)のみ自由にアクセスでき、R8~R12(Hiレジスタ)は一部の命令でしかアクセスできません。
このレジスタはTHUMBモードではスタックポインタ(SP)として使用されます。
ARMモードでは、R13ではなく他のレジスタをスタックポインタとして使用したり、R13を汎用レジスタとして使用したりすることができます。
上のテーブルからわかるように、各モードには個別のR13レジスタがあり、(SPとして使用されている場合は)各モードの例外ハンドラは独自のスタックを使用することができます。
このレジスタはリンクレジスタ(LR)として使用されます。リンク付き分岐命令(BL)でサブルーチンを呼び出すと、そのリターン先のアドレス(PCの古い値)がこのレジスタに保存されます。
サブルーチンをネストして呼び出す場合、LRレジスタは各モードに1つしかないので、リターンアドレスを手動でプッシュする必要があります。
また、例外が呼ばれた場合も同様で、PCは新しいモードのLRに保存されます。
ARMモードでは、上記のLRレジスタとしての使用が不要であれば、R14を汎用レジスタとして使用することも可能になっています。
R15は常にプログラムカウンタ(PC)として利用されます。
R15から読み出しを行ったとき、パイプライン処理のため基本的に$+nn
の値が返されることに注意してください。(つまり今実行している命令のアドレス($
)よりR15のほうが進んでいます)
$+nn
のnn
はARMモードかTHUMBモードかによって変わります。
PSRは Program Status Registers
の略です。 CPSRは Current PSR
, SPSRは Saved PSR
の略です。
CPSRは現在のフラグやCPUの制御ビットが格納されています。
例外が起こると、古いCPSRが例外のモードに応じたSPSRに退避されます。(PCがLRに退避されるのに似ています。)
各Bitの内容やSPSRについての詳細はこちらを参照してください。