[英]Labels as Values in Inline Assembly Macros
我想知道如何在內聯匯編中加載帶有標簽值的寄存器。
我試圖以這種方式天真地這樣做:
#define inline_macro(a) \
asm volatile("1: movw %[rega], #:lower16:1b\n" \
" movt %[rega], #:upper16:1b\n" \
: [rega] "+r" (a) \
: \
: \
);
int main(void){
register int i asm("r2");
register void* value asm("r1");
i++;
i += 2;
inline_macro(value);
return i;
}
但是,對象轉儲顯示正在生成的以下匯編代碼:
00000000 <main>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e1a03002 mov r3, r2
c: e2833001 add r3, r3, #1
10: e1a02003 mov r2, r3
14: e1a03002 mov r3, r2
18: e2833002 add r3, r3, #2
1c: e1a02003 mov r2, r3
00000020 <.L11>:
20: e3001000 movw r1, #0
24: e3401000 movt r1, #0
28: e1a03002 mov r3, r2
2c: e1a00003 mov r0, r3
30: e24bd000 sub sp, fp, #0
34: e49db004 pop {fp} ; (ldr fp, [sp], #4)
38: e12fff1e bx lr
我想要的是將值0x20加載到寄存器r1中。
實際上,有一條完整的指令將標簽的地址放入寄存器: ADR
。
由於它是在PC上通過算術工作的,因此它完全獨立於位置並且沒有無限范圍,但是在這里似乎都不是問題-利用匯編程序的“當前指令”偽標簽.
,問題中的示例變為:
#define inline_macro(a) \
asm volatile("adr %[rega], . \n" \
: [rega] "=r" (a) \
: \
: \
);
我不知道arm asm,但是您要獲取movw
指令的地址嗎? ARM真的需要兩個單獨的16位mov
指令嗎?
看起來您在反匯編.o
,在該鏈接器中,鏈接器沒有將符號引用替換為其實際值,並且您看到0
作為占位符。
由於我認為您的代碼不依賴於寄存器的舊值,因此應將其用作僅寫輸出操作數( =r
),而不應將其用作讀寫操作數( +r
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.