前情提要:栈
要理解栈回溯,就要首先理解栈是如何运行的
下面看一段非常简单的代码
uint32_t funB(uint32_t b)
{
return b-1;
}
void funA(uint32_t a)
{
uint32_t b = funB(a);
}
int main(void)
{
board_init();
funA(3);
while (1) {
}
return 0;
}
这段代码的逻辑非常简单,调用链也很清晰,在main函数中调用funA,funA中调用funB,main函数的汇编代码如下所示
int main(void)
{
8000648c: 1141 add sp,sp,-16
8000648e: c606 sw ra,12(sp)
80006490: c422 sw s0,8(sp)
80006492: 0800 add s0,sp,16
board_init();
80006494: b16fe0ef jal 800047aa <board_init>
funA(3);
80006498: 450d li a0,3
8000649a: b7dfd0ef jal 80004016 <funA>
可以看到,当main函数执行时,首先向上开辟了一块栈空间,然后将ra,s0压栈,随后才是用户所写的代码逻辑,对这里用到的两个寄存器进行说明:
-ra:保存了返回地址,当执行jal时,会将下一条指令的地址保存至ra
-s0:又叫fp,frame point,栈帧指针,是回溯需要用到的重要寄存器

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



