Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为递归函数绘制堆栈框架_C_Assembly_Stack - Fatal编程技术网

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
    +--------------------------------+