已关联至:How to get a call stack backtrace?(GCC,MIPS,no frame pointer) 我通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(在上面的链接中有更多细节)。 我必须找到每个函数的前一个$ sp,大多数函数都以下面的指令开头:
addiu sp, sp, -80
我可以很容易地从操作码中得出先前的$ sp。 问题是我发现函数永远不会改变$ sp,即使它们使用堆栈,看起来调用这种函数的函数在堆栈上使用相同的激活框架换句话说永远不会改变$ sp。 在这种情况下,如何重现之前的$ sp?
答案 0 :(得分:0)
优化代码可能会发生这种情况。
如果leaf函数只修改临时寄存器,并返回其调用者代码中的return语句,则不需要更改$ra
,也不需要该功能的堆栈框架。例如:
int caller(....) {
int a, b, c;
...
c = leaf(a,b);
return c;
}
int leaf(int a, int b) {
return a + b;
}
另见tail calls。