簡體   English   中英

使用 gcc(加載寄存器文字)將 ARMv7-M 匯編代碼內聯到 c 中

[英]inline ARMv7-M assembly code into c using gcc (Load Register literal)

我希望能夠使用 LDR 文字指令來加載寄存器。

我有:

    extern uint32_t _vStackBase;
    extern uint32_t _vStackTop;

    __asm volatile
    (
        "   mov r10, #0x5a5a5a5a          \n"
        "   ldr r8, %[stackTop]           \n"
        "   ldr r7, %[stackBase]          \n"::
        [stackTop] "r"(&_vStackTop), [stackBase] "r"(&_vStackBase):
        "r7", "r8", "r7"
    );

產生的代碼是:

 216 ???? 484B          ldr r3, .L66+8
 217 ???? 494A          ldr r2, .L66+12
 218                    .syntax unified
 219                @ 98 "src/startup/startup.c" 1
 220 ???? 4FF05A3A     mov r10, #0x5a5a5a5a          
 221 ???? 5FF80480     ldr r8, r3           
 222 ???? 5FF80470     ldr r7, r2        

有兩個問題:編譯器不必要地使用寄存器 r2 和 r3。 我希望能夠做的是:

    ldr r8, .L66+8
    ldr r7, .L66+12
    [...]

但我可以處理這種低效率。

第二個也是更嚴重的問題是匯編器給出了這個錯誤:

Error: cannot represent T32_OFFSET_IMM relocation in this object file format

我怎樣才能得到我想要的?

編譯器不必要地使用寄存器 r2 和 r3。

那是因為您在這里要求注冊:

[stackTop] "r"(&_vStackTop), [stackBase] "r"(&_vStackBase):

要請求編譯器提供內存引用,請使用"m"而不是"r"

Error: cannot represent T32_OFFSET_IMM relocation in this object file format

由於您要求注冊,編譯器會用一個寄存器代替%[stackTop]導致ldr r8, r3 ldr指令的第二個操作數是內存引用,因為文件中沒有名為r3內存位置(或者它在另一個部分中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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