我们可以使用操作符"&“的地址在GCC臂组件中吗?如果是,那么我有一个结构core_regx,我需要将该结构的成员r0的地址传递到下面提到的代码中:
asm volatile("ldr r3, [%0,#0]":: "r" (&(core_reg->r0)));
请检查此代码是否正确。
发布于 2013-02-13 14:46:04
是的,你当然可以使用&。但是,我建议您的汇编说明符可能会有一些问题和更好的选择。
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
之间的关系。至少在arm-xxx-gcc
的某些版本上,"m"
可以很好地工作。在编译器生成的代码上运行objdump --disassemble
,以验证它是否在执行您想要的操作。
编辑: GCC手册有很多信息,比如Gcc assembler contraints,Machine specific和General Info。互联网上有很多教程,比如ARM assembler cookbook,它是最好的教程之一。
https://stackoverflow.com/questions/14852314
复制