我想知道如何在内联汇编中加载带有标签值的寄存器。
我天真地尝试以这种方式这样做:
#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) \
: \
: \
);
关于c - 标签作为内联汇编宏中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021551/