gpt4 book ai didi

c - 递归函数分配指针两次?

转载 作者:行者123 更新时间:2023-11-30 17:27:59 26 4
gpt4 key购买 nike

这是一个间接的家庭作业问题,这个问题不在作业中,但我仍然很好奇。我们得到以下函数:

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;
}

并告诉它编译为以下汇编代码:

silly:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
pushl %ebx
movl 8(%ebp),%ebx
testl %ebx,%ebx
jle .L3
addl $-8,%esp
leal -4(%ebp),%eax
pushl %eax
leal (%ebx,%ebx),%eax
pushl %eax
call silly
jmp .L4
.p2align 4,,7
.L3:
xorl %eax,%eax
movl %eax,-4(%ebp)
.L4:
movl -4(%ebp),%edx
addl %eax,%edx
movl 12(%ebp),%eax
addl %edx,%ebx
movl %ebx,(%eax)
movl -24(%ebp),%ebx
movl %edx,%eax
movl %ebp,%esp
popl %ebp
ret

编译后我注意到在-8(ebp)处,p似乎也被存储了。现在,p 也存储在 12(ebp) 中。为什么是这样?我找不到任何将 p 映射到 -8(ebp) 的显式代码。

编辑:我应该澄清这个问题,我在这里编译了这段代码:https://gist.github.com/jamiees2/dceaf1ba90b84ebbac0e使用gcc -Wall -m32 test2.c test2.s -o bla,然后使用gdb bla。我在傻b傻处设置了一个断点,然后运行x/x *((int*)($ebp+12))/x *(( int*)($ebp-8)) 分别给出相同的输出。我想知道这是为什么。它只是堆栈上的垃圾吗?还是有一些隐藏的功能?

最佳答案

传入参数n存储在8(%ebp)中。传入参数 p 存储在 12(%ebp) 中。您误解了汇编代码。

val 存储在 -4(%ebp) 处。 %ebx 的保存值存储在 -24(%ebp) 中。请注意,%ebx 在调用过程中会被保留。这就是为什么silly保存并恢复它,以及为什么它可以依赖%ebx在递归调用中继续包含n的值愚蠢

关于c - 递归函数分配指针两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com