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