我想使用branch
到一个特定的地址(没有标签)ARM assembly
,而无需修改LR
寄存器。因此,我选择B
而不是BL
或BX
。我希望在GCC inline asm
。
这是文档,这是我尝试过的内容:
#define JMP(addr) \
__asm__("b %0" \
: /*output*/ \
: /*input*/ \
"r" (addr) \
);
它是一个C宏,可以使用来调用address
。当我运行它时,出现以下错误:
error: undefined reference to 'r3'
该错误是由于使用"r"
。我仔细研究了一下,发现它可能是gcc 4.9。*版本的错误。
顺便说一句,我使用的Android/Linux Gcc 4.9 cross compiler
,上OSX
。另外,我不知道是否应该在上加载某些内容Rm
。
干杯!
编辑:我将宏更改为此,并且我仍然得到undefined reference to r3 and r4
:
#define JMP(addr) \
__asm__("LDR r5,=%0\n\t" \
"LDR r4,[r5]\n\t"\
"ADD r4,#1\n\t" \
"B r4" \
: /*output*/ \
: /*input*/ \
"r" (addr) \
: /*clobbered*/ \
"r4" ,"r5" \
);
说明:将变量的地址加载到r5,然后将该地址的值加载到r4。然后将LSB加1(ARM规范要求是mm?)。最后转到该地址。
您不能分支到寄存器,只能分支到标签。如果要跳转到寄存器中的地址,则需要将其移入PC寄存器(r15)。
#define JMP(addr) \
__asm__("mov pc,%0" \
: /*output*/ \
: /*input*/ \
"r" (addr) \
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句