这是我的 C 代码
void user_main(void)
{
u32 asd;
osGetSysCnt(&asd);
}
这是拆解
void user_main(void)
{
10040230: b507 push {r0, r1, r2, lr}
u32 asd;
osGetSysCnt(&asd);
10040232: a801 add r0, sp, #4
10040234: f000 f801 bl 1004023a <osGetSysCnt>
}
10040238: bd07 pop {r0, r1, r2, pc}
堆栈指针为什么要增加?这不会覆盖已经推送的寄存器吗?
不是,因为
sp
在反汇编代码中没有增加。目的
add
:该add
指令计算相对于 sp(堆栈指针)当前值的内存地址。此处,计算指向堆栈上变量位置的add r0, sp, #4
地址。结果地址存储在中,然后将其作为参数传递给。sp + 4
asd
r0
osGetSysCnt
是的。该
push
指令正在创建足以满足函数需求的堆栈框架。编译器不关心那里有什么,因为 ABI 指定这些寄存器不必保留。所以这push
并没有保留任何东西。为什么编译器使用
push
指令?它表示您正在启用大小优化进行编译(-Os
)。push
很短但很耗时。如果您将优化级别更改为优化速度(-Ofast
,, )-O2
,-O3
编译器将发出不同的代码:https://godbolt.org/z/7GY63r6vv