簡體   English   中英

標簽作為內聯匯編宏中的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM