如何使用C的内联汇编程序访问ARM Cortex M3的r11寄存器

时间:2015-12-05 08:36:48

标签: assembly arm cortex-m

我尝试了下面的代码,但未能在http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472f/Cihfhjhg.html

的以下引用后从r11读取正确的值
volatile int top_fp;
__asm
{
    mov top_fp, r11
}

r11的值是0x20009DCC top_fp的值是0x00000004

[更新]解决方案,我们必须使用嵌入式汇编程序:

__asm int getRegisterR11()
{
    mov r0,r11
    BX LR //return, must not omitted!!!
}

1 个答案:

答案 0 :(得分:1)

您发布的链接仅指lr(R13),sp(R14),pc(R5),用于旧版本ARM ADS的代码的遗留代码支持,不适用于通用寄存器。

在ARM的编译器中(也用于Keil的MDK-ARM):

  

内联汇编程序不提供对物理寄存器的直接访问   一个ARM处理器。如果ARM寄存器名称用作操作数   内联汇编程序指令它成为变量的引用   同名,而不是物理ARM寄存器。

(参考:Inline assembler and register access

ARM编译器中的内联汇编程序需要进行优化,例如它内置的C或C ++代码,因此编译器可能会生成与您在任何情况下编写的代码不同的代码。如果您希望完全按照编写的方式生成汇编代码,则必须使用embedded assembler而不是内联汇编程序