这是什么意思?
sub esp, 20h
当我考虑堆栈如何向下发展时,我特别不明白。这是否意味着如果我的堆栈指针的值为10000h,它会将我的堆栈指针移动到10020h?
ps:如果堆栈向下增长,是否意味着它越大,地址越大?
编辑:我知道堆栈向下增长,我的问题是ESP是否指向10000h,如果减去50,它会变成99950h还是10050h?更新 @vhu建议的osdev wiki Stack文章很有帮助。
答案 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的更多信息,请参阅此处。
<小时/> 更新
如果上面的示例没有清楚地突出显示,ADD
和SUB
可以在ESP
注册本身上工作,因此:
MOV ESP,1000h
SUB ESP,10h
ESP的值为0FF0h。
答案 1 :(得分:1)
esp
只是一个寄存器(通常指向堆栈)。堆栈不。所以sub在这里和其他地方一样。在您的示例中,esp
变为0FFE0h。