1

我们可以使用运算符“&”内联 GCC ARM 程序集的地址吗?如果是,那么我有一个结构 core_regx,我需要将该结构的成员 r0 的地址传递到下面提到的代码中:

asm volatile("ldr r3, [%0,#0]":: "r" (&(core_reg->r0)));

请检查此代码是否正确。

4

1 回答 1

1

是的,你当然可以使用&。但是,我建议您的汇编器说明符可能有一些问题和更好的选择。

asm volatile("ldr r3, %0":: "m" (core_reg->r0) : "r3");

您绝对应该将r3添加到 clobber 列表中。此外,说明"m"符可能更好。如果core_reg已经在 中r0,编译器可以使用r0成员的偏移量并生成代码,例如,

       add r0, r0, #12    ; assuming r0 is core_reg.
       ldr r3, [r0]

core_reg编译器知道和之间的关系core_reg->r0。至少"m"适用于某些版本的arm-xxx-gcc. 在编译器生成的代码上运行objdump --disassemble以验证它正在执行您想要的操作。

编辑: GCC 手册有很多信息,例如Gcc assembler constraintsMachine specificGeneral Info。网上有很多教程,比如ARM assembler cookbook,是最好的之一。

于 2013-02-13T14:46:04.303 回答