我们可以使用运算符“&”内联GCC ARM汇编吗?

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

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

请检查此代码是否正确。

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

 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_regcore_reg->r0之间的关系。 至少"m"适用于某些版本的arm-xxx-gcc 。 对编译器生成的代码运行objdump --disassemble ,以validation它是否正在执行您想要的操作。

编辑: GCC手册有很多信息,例如Gcc汇编程序限制 , 机器特定和一般信息 。 互联网上有许多教程,例如ARM汇编程序食谱 ,这是最好的之一。