为什么SUB esp, 4
例如在堆栈上分配4个字节而ADD esp, 4
正在解除分配?我的意思是,如果相反,那将更容易理解。我读到了堆栈,发现在大多数情况下它会向程序的0x00000000地址增长,但是,它从哪里开始?是否需要在需要时从操作系统中将内存动态分配给程序?
答案 0 :(得分:0)
首先是一些背景信息:
对于许多CPU类型,堆栈的方向由CPU类型给出。例如,在x86上,某些操作会自动将数据保存在堆栈中,而无需使用任何软件 - 例如硬件中断。有一些指令(如CALL或PUSH)也可以在堆栈上保存数据。这些操作修改堆栈指针,以便给出堆栈的方向。
但是有一些CPU(例如TMS320F28xxx),其中堆栈的方向是另一个方向。必须将值添加到堆栈指针以在这些CPU上分配内存。其他CPU(如旧的ARM变体,MIPS,PowerPC或SPARC)没有明确寻址堆栈的操作,因此所有堆栈操作必须在软件中完成。在这样的CPU上,软件理论上可以决定堆栈的方向。
现在回答你的问题:
在x86上,堆栈向下增长。这意味着当使用堆栈操作而未触及ESP上方的地址时,ESP下面的地址将被覆盖。
更改ESP的值时,使用堆栈操作时更改内存的位置。如果从ESP中减去一个值,那么旧ESP和新ESP之间的内存将被保护免于覆盖,因为堆栈操作将覆盖ESP下的内存。这意味着这个记忆现在是“你的”。向ESP添加值时,旧操作系统和新ESP之间的内存将被堆栈操作覆盖。这意味着该内存现在是“免费的”。
当ESP达到0x00000000时会发生什么?
实际上,堆栈可能只有一定的范围。也许在0x40001000到0x40002000的范围内。此范围取决于操作系统和正在运行的程序。如果ESP超出此范围,您将收到错误。在受保护模式下的x86 CPU上会出现异常;在微控制器上(这些设备上的寄存器名称不是“ESP”)你将覆盖没有为堆栈保留的内存,所以你可能会覆盖全局变量......