esp寄存器如何移动?

时间:2016-02-15 13:13:26

标签: assembly x86 gdb stack stack-pointer

我有一段这样的代码:

#include<stdio.h>

main()
{
   xxx(1234);
}

int xxx(int b)
{
   int c;
   c=b;
   return c;
}

我使用gdb通过在xxx(1234);c=b;行创建断点来显示ESP寄存器的值以及它的工作方式。

运行程序并在第一个断点处停止,使用i r espx/x $esp。它显示esp指向例如:0xbbbbefff并且该地址包含杂项值,例如:0xbb33bb33。继续到第二个断点我重复上面的两个命令来检查地址0xbbbbefff的值,它显示0x000004d2(十进制1234)。

我知道ESP指向堆栈顶部,然后如果我们将值推入堆栈,它会移动到较低地址并将值放入该地址的内存中。例如,如果在第一个断点ESP指向地址0xbbbbefff,那么在第二个断点ESP必须指向某处,如0xbbbbefff-4 = 0xbbbbeffa并包含0x000004d2,而0xbbbbefff处的内存仍包含0xbb33bb33。但我在gdb中看到0xbbbbefff中包含的0x000004d2值(在调用xxx函数之前的前一个顶层堆栈)。

我对堆栈的理解有误吗?

0 个答案:

没有答案