C 为递归函数绘制堆栈框架
给定以下递归函数:C 为递归函数绘制堆栈框架,c,assembly,stack,C,Assembly,Stack,给定以下递归函数: int silly(int n, int *p) { int val, val2; if (n > 0) { val2 = silly(n << 1, &val); } else { val = val2 = 0; } *p = val + val2 + n; return val + val2; } 有没有人能帮我画出这个函数中使用的堆栈框架,指明程序值存储的位
int silly(int n, int *p)
{
int val, val2;
if (n > 0) {
val2 = silly(n << 1, &val);
} else {
val = val2 = 0;
}
*p = val + val2 + n;
return val + val2;
}
有没有人能帮我画出这个函数中使用的堆栈框架,指明程序值存储的位置和位置
%rsp
和%rbp
寄存器正好位于对的递归调用之前
愚蠢(
)?所以这里是最后的答案:
| |
+--------------------------------+
| |
+--------------------------------+
| ... |
+--------------------------------+
| return address | 12
+--------------------------------+
| return address | 8
+--------------------------------+
| %rbp | 4
+--------------------------------+
| %rbp | 0
+--------------------------------+
| val2 | -4
+--------------------------------+
| val | -8
+--------------------------------+
| | -12
+--------------------------------+
| | -16
+--------------------------------+
| n | -20
+--------------------------------+
| | -24
+--------------------------------+
| p | -28
+--------------------------------+
| p | -32
+--------------------------------+
协助,是的,为你做,不是。显示你的想法。提示1:看起来参数正在寄存器中传递。提示2:4个唯一的偏移量与
(%rbp)
一起使用,您有2个参数和2个局部变量。在x86/64中,前6个参数在寄存器中传递[即不在堆栈上],无论优化如何,都是如此。如果仔细观察,这就是前两个参数分别来自%edi
和%rsi
的原因。在下图中,翻转%rbp
和返回地址的顺序[它们是错误的]。这不是机器代码,而是汇编代码
| |
+--------------------------------+
| |
+--------------------------------+
| ... |
+--------------------------------+
| return address | 12
+--------------------------------+
| return address | 8
+--------------------------------+
| %rbp | 4
+--------------------------------+
| %rbp | 0
+--------------------------------+
| val2 | -4
+--------------------------------+
| val | -8
+--------------------------------+
| | -12
+--------------------------------+
| | -16
+--------------------------------+
| n | -20
+--------------------------------+
| | -24
+--------------------------------+
| p | -28
+--------------------------------+
| p | -32
+--------------------------------+