所以我正在学习系统期中,并且类似课程的旧期中出现了这个问题,C和汇编代码如下:
int gcd(int a, int b)
{
if(!b)
{
return a;
}
return gcd(b, a%b);
}
0x08048394 <+0>: push %ebp
0x08048395 <+1>: mov %esp,%ebp
0x08048397 <+3>: sub $0x10,%esp
0x0804839a <+6>: mov 0x8(%ebp),%eax
0x0804839d <+9>: mov 0xc(%ebp),%ecx
0x080483a0 <+12>: test %ecx,%ecx
0x080483a2 <+14>: je 0x80483b7 <gcd+35>
0x080483a4 <+16>: mov %eax,%edx
0x080483a6 <+18>: sar $0x1f,%edx
0x080483a9 <+21>: idiv %ecx
0x080483ab <+23>: mov %edx,0x4(%esp)
0x080483af <+27>: mov %ecx,(%esp)
0x080483b2 <+30>: call 0x8048394 <gcd>
0x080483b7 <+35>: leave
0x080483b8 <+36>: ret
他们告诉我们 %esp 的起始值为 0xffff1000,并告诉我们 gcd(213, 18) 将导致:gcd(213, 18)、gcd(18, 15)、gcd(15, 3) 和 gcd (3, 0)。然后他们在执行 gcd(15, 3) 的返回指令之前询问 %esp 的值是多少。
解决方案说它是0xffff0fcc。我不太明白为什么。这是我的推理:
我们将 0x10 减去 3 次,调用 gcd(18, 15) 和 gcd(15, 3),它们结合起来我们应该从堆栈中减去 0x30 和 0x8。那么我们不应该在 0xffff0fc8 吗?然后,在我们返回之后,我们再次添加 0x4,这样 $esp 就是 0xffff0fcc,但不是之前?