链接到:如何获取调用堆栈回溯?(GCC,MIPS,无帧指针) 我通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(更多详细信息在上面的链接中)。我必须为每个函数找到以前的 $sp,大多数函数都以以下指令开头:
addiu sp, sp, -80
我可以很容易地从操作码中总结出之前的 $sp 。问题是我发现即使它们使用堆栈也永远不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧,换句话说,永远不会更改 $sp。在这种情况下如何重现以前的 $sp ?
链接到:如何获取调用堆栈回溯?(GCC,MIPS,无帧指针) 我通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(更多详细信息在上面的链接中)。我必须为每个函数找到以前的 $sp,大多数函数都以以下指令开头:
addiu sp, sp, -80
我可以很容易地从操作码中总结出之前的 $sp 。问题是我发现即使它们使用堆栈也永远不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧,换句话说,永远不会更改 $sp。在这种情况下如何重现以前的 $sp ?
优化代码可能会发生这种情况。
如果叶函数只修改临时寄存器,并在其调用者代码中返回返回语句,则无需$ra
更改,也不需要该函数的堆栈帧。例子:
int caller(....) {
int a, b, c;
...
c = leaf(a,b);
return c;
}
int leaf(int a, int b) {
return a + b;
}
另请参阅尾调用。