1

链接到:如何获取调用堆栈回溯?(GCC,MIPS,无帧指针) 我通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(更多详细信息在上面的链接中)。我必须为每个函数找到以前的 $sp,大多数函数都以以下指令开头:

addiu sp, sp, -80

我可以很容易地从操作码中总结出之前的 $sp 。问题是我发现即使它们使用堆栈也永远不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧,换句话说,永远不会更改 $sp。在这种情况下如何重现以前的 $sp ?

4

1 回答 1

0

优化代码可能会发生这种情况。

如果叶函数只修改临时寄存器,并在其调用者代码中返回返回语句,则无需$ra更改,也不需要该函数的堆栈帧。例子:

int caller(....) {
  int a, b, c;
  ...
  c = leaf(a,b);
  return c;
}
int leaf(int a, int b) {
  return a + b;
}

另请参阅尾调用

于 2017-08-30T18:59:15.417 回答