$sp 寄存器在函数开头不变
$sp register does not change at the beginning of the function
链接到:
我正在通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(更多详细信息见上面的 link)。
我必须为每个函数找到前面的 $sp,大多数函数都以以下指令开头:
addiu sp, sp, -80
我可以很容易地从操作码中得出前面的$sp。
问题是我发现即使使用堆栈也不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧换句话说永远不会更改 $sp。
在这种情况下如何重现之前的 $sp ?
优化代码可能会发生这种情况。
如果叶函数只修改临时寄存器,并且 returns 到其调用者代码中的 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。
链接到:
addiu sp, sp, -80
我可以很容易地从操作码中得出前面的$sp。 问题是我发现即使使用堆栈也不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧换句话说永远不会更改 $sp。 在这种情况下如何重现之前的 $sp ?
优化代码可能会发生这种情况。
如果叶函数只修改临时寄存器,并且 returns 到其调用者代码中的 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。