我想branch
使用ARM assembly
而不是標籤,而不需要修改LR
寄存器。所以我用B
而不是BL
或BX
。 我想要在GCC inline asm
中完成。使用GCC內聯ARM asm分支到地址
Here是文檔,這裏是我已經試過:
#define JMP(addr) \
__asm__("b %0" \
: /*output*/ \
: /*input*/ \
"r" (addr) \
);
它是一個C宏,可以用一個address
被調用。當我運行它,我得到以下錯誤:
error: undefined reference to 'r3'
的錯誤是因爲"r"
使用的。我仔細研究了一下,發現它可能是gcc 4.9。*版本上的一個bug。
順便說一下,我正在使用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規範要求的emm)?最後轉到那個地址。
「LDR僞指令裝載的寄存器與任一:一個32位常數值或地址」。所以在你的情況下編譯器認爲rX是一個符號。 – auselen