我有一段这样的代码:
#include<stdio.h>
main()
{
xxx(1234);
}
int xxx(int b)
{
int c;
c=b;
return c;
}
我使用 gdb 来显示 ESP 寄存器的值以及它是如何通过在xxx(1234);和c=b;line 处设置断点来工作的。
运行程序并在第一个断点处停止,使用i r espand x/x $esp。它表明 esp 指向例如:0xbbbbefff,并且该地址包含杂项值,例如:0xbb33bb33。继续到第二个断点,我重复上面的两个命令来检查地址 0xbbbbefff 的值,它显示 0x000004d2(十进制的 1234)。
我知道 ESP 指向堆栈的顶部,然后如果我们将一个值压入堆栈,它会移动到较低的地址并将该值放入该地址的内存中。例如,如果在第一个断点处 ESP 指向地址 0xbbbbefff,那么在第二个断点处,ESP 必须指向 0xbbbbefff-4=0xbbbbeffa 并包含 0x000004d2 ,而 0xbbbbefff 处的内存仍包含 0xbb33bb33 。但是我在 gdb 中看到 0xbbbbefff 中包含的 0x000004d2 值(调用 xxx 函数之前的上一个顶部堆栈)。
我对堆栈的理解有误吗?