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