我们可以使用运营商地址“&”内联GCC ARM组件?

时间:2013-02-13 11:19:19

标签: c gcc assembly arm

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

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

请检查此代码是否正确。

1 个答案:

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

修改:GCC手册包含大量信息,例如Gcc assembler contraintsMachine specificGeneral Info。互联网上有许多教程,例如ARM assembler cookbook,这是最好的教程之一。