【问题标题】:How to access r11 register of ARM Cortex M3 with inline assembler of C如何使用 C 的内联汇编程序访问 ARM Cortex M3 的 r11 寄存器
【发布时间】:2015-12-05 08:36:47
【问题描述】:

我尝试了下面的代码,但未能从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

[update] 解决方案,我们必须使用嵌入式汇编器:

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

【问题讨论】:

  • 你用的是什么工具链?例如,ARM 自己的编译器对内联汇编的支持与 GCC 不同。
  • ...什么版本?
  • 我使用的是 ARM 的 MDK-ARM 版本 4.72.1.0,带有 ARMCC 编译器。

标签: assembly arm cortex-m


【解决方案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 而不是内联汇编器

【讨论】:

  • 感谢@Clifford 的cmets。你能帮忙把我的代码转移到嵌入式汇编器中吗?我是 ARM 汇编程序的真正初学者。万分感谢。我已阅读您的嵌入式汇编器参考,但尚未找到解决方案。
  • 我想通了。感谢 Clifford 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多