堆栈向下增长意味着什么?什么是SUB ESP,20h在做什么?

时间:2014-05-07 09:26:53

标签: assembly x86 stack callstack

这是什么意思?

sub esp, 20h

当我考虑堆栈如何向下发展时,我特别不明白。这是否意味着如果我的堆栈指针的值为10000h,它会将我的堆栈指针移动到10020h?

ps:如果堆栈向下增长,是否意味着它越大,地址越大?

编辑:我知道堆栈向下增长,我的问题是ESP是否指向10000h,如果减去50,它会变成99950h还是10050h?

更新 @vhu建议的osdev wiki Stack文章很有帮助。

2 个答案:

答案 0 :(得分:4)

Stack是Last-In / First-Out构造,其中' top'由ESP跟踪。在x86堆栈上'增长'自上而下,意味着它被初始化为特定值并且指向“顶部”'当事物被添加到堆栈时,堆栈会降低(较低的值)

举个例子,开头你的Stack可以是:

     +----+
FFFF | 00 | <--- ESP
FFFE | 00 |
FFFD | 00 |
FFFC | 00 |
FFFB | 00 |
FFFA | 00 |
     +----+

如果您使用SUB ESP, 2,您基本上会从堆栈中保留用于本地变量的空间:

     +----+
FFFF | xx |
FFFE | xx | 
FFFD | 00 | <--- ESP
FFFC | 00 |
FFFB | 00 |
FFFA | 00 |
     +----+

此时地址FFFF和FFFE可用作局部变量。当然,这些都需要在完成后从堆栈中删除。这可以使用ADD ESP,2或作为返回RET 2的一部分来完成。

由于ESP总是与顶级&#39;相关在堆栈中,您需要使用其他寄存器来跟踪局部变量,例如EBP

有关stack的更多信息,请参阅此处。

<小时/> 更新

如果上面的示例没有清楚地突出显示,ADDSUB可以在ESP 注册本身上工作,因此:

MOV ESP,1000h
SUB ESP,10h

ESP的值为0FF0h。

答案 1 :(得分:1)

esp只是一个寄存器(通常指向堆栈)。堆栈。所以sub在这里和其他地方一样。在您的示例中,esp变为0FFE0h。