非機密扱い | ![]() | ARM DUI0472LJ | ||
| ||||
ホーム > コンパイラ固有の機能 > 名前付きレジスタ変数 |
コンパイラを使用すると、名前付きレジスタ変数を使用して、ARM アーキテクチャベースのプロセッサまたはコプロセッサのレジスタにアクセスできます。
register
type
var-name
__asm(
reg
);
タイプ
var-name
reg
表 10-19 ARM アーキテクチャベースのプロセッサで使用可能な名前付きレジスタ
レジスタ |
__asm の文字列 |
プロセッサ |
---|---|---|
APSR
|
"apsr"
|
すべてのプロセッサ |
CPSR
|
"cpsr"
|
Cortex-M シリーズプロセッサを除くすべてのプロセッサ |
BASEPRI
|
"basepri"
|
ARMv7-M プロセッサ |
BASEPRI_MAX
|
"basepri_max"
|
ARMv7-M プロセッサ |
CONTROL
|
"control"
|
ARMv6-M および ARMv7-M プロセッサ |
DSP
|
"dsp"
|
ARMv6-M および ARMv7-M プロセッサ |
EAPSR
|
"eapsr"
|
ARMv6-M および ARMv7-M プロセッサ |
EPSR
|
"epsr"
|
ARMv6-M および ARMv7-M プロセッサ |
FAULTMASK
|
"faultmask"
|
ARMv7-M プロセッサ |
IAPSR
|
"iapsr"
|
ARMv6-M および ARMv7-M プロセッサ |
IEPSR
|
"iepsr"
|
ARMv6-M および ARMv7-M プロセッサ |
IPSR
|
"ipsr"
|
ARMv6-M および ARMv7-M プロセッサ |
MSP
|
"msp"
|
ARMv6-M および ARMv7-M プロセッサ |
PRIMASK
|
"primask"
|
ARMv6-M および ARMv7-M プロセッサ |
PSP
|
"psp"
|
ARMv6-M および ARMv7-M プロセッサ |
PSR
|
"psr"
|
ARMv6-M および ARMv7-M プロセッサ |
r0 ~ r12
|
"r0" ~ "r12"
|
すべてのプロセッサ |
r13 または sp
|
"r13" または "sp"
|
すべてのプロセッサ |
r14 または lr
|
"r14" または "lr"
|
すべてのプロセッサ |
r15 または pc
|
"r15" または "pc"
|
すべてのプロセッサ |
SPSR
|
"spsr"
|
Cortex-M シリーズプロセッサを除くすべてのプロセッサ |
XPSR
|
"xpsr"
|
ARMv6-M および ARMv7-M プロセッサ |
表 10-20 浮動小数点ハードウェアを持つターゲットで使用可能な名前付きレジスタ
レジスタ | __asm の文字列 |
---|---|
FPSID
|
"fpsid"
|
FPSCR
|
"fpscr"
|
FPEXC
|
"fpexc"
|
FPINST
|
"fpinst"
|
FPINST2
|
"fpinst2"
|
FPSR
|
"fpsr"
|
MVFR0
|
"mvfr0"
|
MVFR1
|
"mvfr1"
|
r0
が必ず使用されます。これは、名前付きレジスタ変数として宣言されている場合でも当てはまります。r12
だけは例外ですが、リンカなどのツールでは、オブジェクトファイルでのレジスタの使用方法は変更されません。AAPCS では、r12
をインタープロシージャスクラッチレジスタとして予約しています。関数呼び出し間で値を保持する必要がある場合でも、r12
を名前付きレジスタ変数として宣言しないで下さい。apsr
は "apsr"
レジスタの名前付きレジスタ変数として宣言されています。register unsigned int apsr __asm("apsr"); apsr = ~(~apsr | 0x40);
MRS r0,APSR ; formerly CPSR BIC r0,r0,#0x40 MSR CPSR_c, r0
PMCR
は、コプロセッサ cp15
に関連付けられたレジスタ変数として宣言されています。MCR
または MRC
命令には、CRn = c9
、CRm = c12
、opcode1 = 0
、および opcode2 = 0
が使用されます。register unsigned int PMCR __asm("cp15:0:c9:c12:0"); __inline void __reset_cycle_counter(void) { PMCR = 4; }
__reset_cycle_counter PROC MOV r0,#4 MCR p15,#0x0,r0,c9,c12,#0 BX lr ENDP
cp15_control
は、コプロセッサレジスタにアクセスするためのレジスタ変数として宣言されています。この例では、CP15
を使用して MMU を有効にします。register unsigned int cp15_control __asm("cp15:0:c1:c0:0"); cp15_control |= 0x1;
MRC p15,#0x0,r0,c1,c0,#0 ORR r0,r0,#1 MCR p15,#0x0,r0,c1,c0,#0
_msp
、_control
、および _psp
がスタックポインタを設定するための名前付きレジスタ変数として宣言されています。register unsigned int _control __asm("control"); register unsigned int _msp __asm("msp"); register unsigned int _psp __asm("psp");void init(void) { _msp = 0x30000000; // set up Main Stack Pointer _control = _control | 3; // switch to User Mode with Process Stack _psp = 0x40000000; // set up Process Stack Pointer }
init MOV r0,#0x30000000 MSR MSP,r0 MRS r0,CONTROL ORR r0,r0,#3 MSR CONTROL,r0 MOV r0,#0x40000000 MSR PSP,r0 BX lr