ARM Cortex-M3 的 IAR 编译器提供内联汇编。如何将特定函数的地址存储到堆栈上的某个位置?
C代码会这样
void tick();
void bar()
{
int x;
// modify a value on stack
(&x)[4] = &tick;
}
虽然这通常有效,但编译器在发布版本中对其进行了优化。我试图用内联汇编对其进行编码
void bar()
{
int x;
asm("ldr r0,%0" : : "i" (&tick));
asm("str r0,[sp+#0x10];
}
ldr
IAR 编译器不接受该指令。问题是这条指令需要一个带有寄存器和偏移量的寻址模式。函数的实际地址tick
存储在函数后面,ldr
指令仅保存到保存实际地址的内存位置的偏移量。反汇编类似这样:
ldr r0,??tick_address
str r0,[sp+#0x10]
bx lr ; return
??tick_address dd tick
如何tick
立即获取寄存器的地址以将其用于堆栈操作?