如何使用 C 的内联汇编程序访问 ARM Cortex M3 的 r11 寄存器
How to access r11 register of ARM Cortex M3 with inline assembler of C
我试过下面的代码,但未能从 r11 中读取正确的值 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472f/Cihfhjhg.html
volatile int top_fp;
__asm
{
mov top_fp, r11
}
r11 的值为 0x20009DCC top_fp 的值为 0x00000004
[update] 解决方案,我们必须使用嵌入式汇编器:
__asm int getRegisterR11()
{
mov r0,r11
BX LR //return, must not omitted!!!
}
您发布的link仅指lr(R13)、sp(R14)、pc(R5)用于旧版本ARM ADS代码的遗留代码支持,不适用于通用寄存器。
在ARM的编译器中(也用在Keil的MDK-ARM):
The inline assembler provides no direct access to the physical registers
of an ARM processor. If an ARM register name is used as an operand in
an inline assembler instruction it becomes a reference to a variable
of the same name, and not the physical ARM register.
(参考:Inline assembler and register access)
ARM 编译器中的内联汇编程序需要像内联的 C 或 C++ 代码一样进行优化,因此编译器生成的代码可能与您在任何情况下编写的代码不同。如果您希望汇编代码完全按照您编写的那样生成,则必须使用 embedded assembler 而不是 内联汇编程序
我试过下面的代码,但未能从 r11 中读取正确的值 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472f/Cihfhjhg.html
volatile int top_fp;
__asm
{
mov top_fp, r11
}
r11 的值为 0x20009DCC top_fp 的值为 0x00000004
[update] 解决方案,我们必须使用嵌入式汇编器:
__asm int getRegisterR11()
{
mov r0,r11
BX LR //return, must not omitted!!!
}
您发布的link仅指lr(R13)、sp(R14)、pc(R5)用于旧版本ARM ADS代码的遗留代码支持,不适用于通用寄存器。
在ARM的编译器中(也用在Keil的MDK-ARM):
The inline assembler provides no direct access to the physical registers of an ARM processor. If an ARM register name is used as an operand in an inline assembler instruction it becomes a reference to a variable of the same name, and not the physical ARM register.
(参考:Inline assembler and register access)
ARM 编译器中的内联汇编程序需要像内联的 C 或 C++ 代码一样进行优化,因此编译器生成的代码可能与您在任何情况下编写的代码不同。如果您希望汇编代码完全按照您编写的那样生成,则必须使用 embedded assembler 而不是 内联汇编程序