我想在不修改LR寄存器的情况下,使用ARM汇编将分支(branch)到特定地址(不是标签),因此我选择使用B而不是BL或BX。我希望在GCC内联汇编中完成这项任务。
这里是文档链接,以下是我尝试过的内容:
说明: 将变量的地址加载到r5,然后将该地址的值加载到r4。然后将LSB加1(根据ARM规范需要?)。最后跳转到该地址。
#define JMP(addr) \
__asm__("b %0" \
: /*output*/ \
: /*input*/ \
"r" (addr) \
);
这是一个C宏,可以用地址
调用。运行时出现以下错误:
error: undefined reference to 'r3'
该错误是由使用"r"
引起的。我稍微研究了一下,发现这可能是gcc 4.9.*版本中的一个bug。
顺便说一下,我正在使用Android/Linux Gcc 4.9交叉编译器
,在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规范需要?)。最后跳转到该地址。