04.栈

1. 栈

栈内存在进程中的作用如下:
(1)暂时保存函数内的局部变量。
(2)调用函数时传递参数。
(3)保存函数返回后的地址。
栈其实是一种数据结构,它按照FILO(FirstInLastOut,后进先出)的原则存储数据。

1.1. 栈的特征

Pasted image 20250311170849
一个进程中,栈顶指针(ESP)初始状态指向栈底端。执行PUSH命令将数据压人栈时,栈顶指针就会上移到栈顶端。执行POP命令从栈中弹出数据时,若栈为空,则栈顶指针重新移动到栈底端。
换言之,栈是一种由高地址向低地址扩展的数据结构,图中,栈是由下往上扩展的。
由于栈具有这种特征,所以我们常常说“栈是逆向扩展的”,向栈中压数据就像一层层砌砖,每向上砌一层,砖墙就增高一点儿。

1.2. 栈操作实例

调试器加载附件 Stack.exe
Pasted image 20250311173003
可以发现栈顶指针的值为 19FF74 ,下面也可以看到ESP指向的地址及其值
然后我们执行 PUSH 100 观察ESP值的变化
Pasted image 20250311173255
发现ESP变成了 19FF70 少了4个字节。并且当前栈顶指针指向 19FF70地址,该地址中保存着100这个值。
就是说 执行 PUSH 100 命令时, 数值100被压入栈 ESP随之向上移动。即ESP值减少了4个字节。

然后我们执行 POP EAX 命令
Pasted image 20250311173733
执行后,ESP的值又增加了4个字节,变回了 19FF74 ,栈又变成了原来的初始状态。 并且将原来存储在栈中的数值100 保存到了EAX寄存器中

向栈压入数据时,栈顶指针减小,向低地址移动;从栈中弹出数据时,栈顶指针增加,向高地址移动。
请记住:栈顶指针在初始状态下指向栈底。这就是栈的特征