我正在尝试对 ARM C 代码使用内联汇编。我的“main.c”代码如下所示:
...
void jump()
{
__asm
{
B 0x15000
}
}
INT32 main(void)
{
...
Write val1 into register 1
jump();
Write val2 into register 2
...
}
当我运行这段代码时,我希望它val1
被写入寄存器 1,然后跳转到地址0x15000
发生并且寄存器 2 中没有写入任何内容。但是当我查看寄存器 1 和寄存器 2 时,它们都被写入了val1
and val2
。所以似乎jump()
没有发生。我错过了什么吗?
更新 1
正如评论中所建议的,我创建了一个最小的可重现示例,即:
void jump()
{
__asm
{
B 0x15000
}
}
int main(void)
{
int i, j, k;
i = 1;
jump();
j = 2;
k = i + j;
return 128;
}
当我编译它时,armcc --asm main.c
我得到这个main.s
:
ARM
REQUIRE8
PRESERVE8
AREA ||.text||, CODE, READONLY, ALIGN=2
jump PROC
BX lr
ENDP
main PROC
MOV r0,#0x80
BX lr
ENDP
AREA ||.arm_vfe_header||, DATA, READONLY, NOALLOC, ALIGN=2
DCD 0x00000000
所以看起来 jump() 被优化了?那是什么,我该如何预防?
更新 2
我什至尝试volatile
在函数名称之前添加:
volatile void jump()
{
__asm
{
B 0x15000
}
}
但它没有帮助,jump()
功能被优化了。