名前付きレジスタ変数

コンパイラを使用すると、名前付きレジスタ変数を使用して、ARM アーキテクチャベースのプロセッサまたはコプロセッサのレジスタにアクセスできます。

Show/hide構文

register type var-name __asm(reg);

各項目には以下の意味があります。

type

名前付きレジスタ変数の型を指定します。

レジスタに名前を付ける際、同サイズであればいずれの型でも、名前付きレジスタ変数の宣言に使用できます。型は構造体でも可能ですが、ビッフィールドのレイアウトはエンディアン方式の影響を受けます。

var-name

名前付きレジスタ変数の名前を指定します。

reg

ARM アーキテクチャベースのプロセッサ上のレジスタ名を示す文字列を指定します。コプロセッサレジスタの場合は、変数の使用方法に合わせて、コプロセッサを識別する文字列構文を指定します。

ARM アーキテクチャベースのプロセッサの名前付きレジスタ変数とともに使用できるレジスタをTable 26 に示します。

Table 26. ARM アーキテクチャベースのプロセッサで使用可能な名前付きレジスタ

レジスタ__asm の文字列プロセッサ
APSR"apsr"すべてのプロセッサ
CPSR"cpsr"すべてのプロセッサ
BASEPRI"basepri"Cortex-M3、Cortex-M4
BASEPRI_MAX"basepri_max"Cortex-M3、Cortex-M4
CONTROL"control"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
DSP"dsp"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
EAPSR"eapsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
EPSR"epsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
FAULTMASK"faultmask"Cortex-M3、Cortex-M4
IAPSR"iapsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
IEPSR"iepsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
IPSR"ipsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
MSP"msp"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
PRIMASK"primask"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
PSP"psp"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
PSR"psr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4
r0r12"r0""r12"すべてのプロセッサ
r13 または sp"r13" または "sp"すべてのプロセッサ
r14 または lr"r14" または "lr"すべてのプロセッサ
r15 または pc"r15" または "pc"すべてのプロセッサ
SPSR

"spsr"

Cortex-M シリーズプロセッサを除くすべてのプロセッサ
XPSR"xpsr"Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4

浮動小数点ハードウェアを持つターゲットでは、Table 27 のレジスタも名前付きレジスタ変数とともに使用可能です。

Table 27. 浮動小数点ハードウェアを持つターゲットで使用可能な名前付きレジスタ

レジスタ__asm の文字列
FPSID"fpsid"
FPSCR"fpscr"
FPEXC"fpexc"
FPINST"fpinst"
FPINST2"fpinst2"
FPSR"fpsr"
MVFR0"mvfr0"
MVFR1"mvfr1"

Note

レジスタの中には一部のアーキテクチャで利用できないものもあります。

Show/hide使用法

名前付きレジスタ変数はグローバル変数として宣言できます。一部の名前付きレジスタ変数だけをローカル変数として宣言することができます。般に、VFP レジスタやコアレジスタをローカル変数として宣言することはしません。R0 などの caller-save レジスタはローカル変数として宣言しないで下さい。

Show/hide

Example 12 では、"apsr" レジスタの名前付きレジスタ変数として apsr が宣言されています。

Example 12. APSR の名前付きレジスタ変数

register unsigned int apsr __asm("apsr");
apsr = ~(~apsr | 0x40);

この場合、以下の命令シーケンスが生成されます。

MRS r0,APSR ; 以前は CPSR
BIC r0,r0,#0x40
MSR CPSR_c, r0

Example 13 では、コプロセッサ cp15 に関連付けられたレジスタ変数として PMCR が宣言されています。MCR または MRC 命令には、CRn = c9CRm = c12opcode1 = 0、および opcode2 = 0 が使用されます。

Example 13. コプロセッサレジスタの名前付きレジスタ変数

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

Example 14 では、コプロセッサレジスタにアクセスするためのレジスタ変数として cp15_control が宣言されています。この例では、CP15 を使用して MMU を有効にします。

Example 14. コプロセッサレジスタの名前付きレジスタ変数で 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

Example 15 は Cortex-M3 の例です。スタックポインタを設定するための名前付きレジスタ変数として、_msp_control、および _psp が宣言されています。

Example 15. Cortex-M3 で名前付きレジスタ変数を使用してスタックポインタを設定する例

register unsigned int _control __asm("control");
register unsigned int _msp     __asm("msp");
register unsigned int _psp     __asm("psp");void init(void)
{
  _msp = 0x30000000;        // メインスタックポインタを設定
  _control = _control | 3;  // プロセススタックでユーザモードに切り替え
  _psp = 0x40000000;        // プロセススタックポインタを設定
}

この場合、以下の命令シーケンスが生成されます。

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

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711