栈内存在进程中的作用如下:
(1)暂时保存函数内的局部变量。
(2)调用函数时传递参数。
(3)保存函数返回后的地址。
栈其实是一种数据结构,它按照FILO(FirstInLastOut,后进先出)的原则存储数据。
一个进程中,栈顶指针(ESP)初始状态指向栈底端。执行PUSH命令将数据压人栈时,栈顶指针就会上移到栈顶端。执行POP命令从栈中弹出数据时,若栈为空,则栈顶指针重新移动到栈底端。
换言之,栈是一种由高地址向低地址扩展的数据结构,图中,栈是由下往上扩展的。
由于栈具有这种特征,所以我们常常说“栈是逆向扩展的”,向栈中压数据就像一层层砌砖,每向上砌一层,砖墙就增高一点儿。
调试器加载附件 Stack.exe
可以发现栈顶指针的值为 19FF74 ,下面也可以看到ESP指向的地址及其值
然后我们执行 PUSH 100
观察ESP值的变化
发现ESP变成了 19FF70 少了4个字节。并且当前栈顶指针指向 19FF70地址,该地址中保存着100这个值。
就是说 执行 PUSH 100
命令时, 数值100被压入栈 ESP随之向上移动。即ESP值减少了4个字节。
然后我们执行 POP EAX
命令
执行后,ESP的值又增加了4个字节,变回了 19FF74 ,栈又变成了原来的初始状态。 并且将原来存储在栈中的数值100 保存到了EAX寄存器中
向栈压入数据时,栈顶指针减小,向低地址移动;从栈中弹出数据时,栈顶指针增加,向高地址移动。
请记住:栈顶指针在初始状态下指向栈底。这就是栈的特征