栈(Stack)的用途广泛,通常用于存储局部变量/传递函数参数/保存函数返回地址等.
1. 栈
栈内存在进程中的作用如下:
- 暂时保存函数内的局部变量.
- 调用函数时传递参数.
- 保存函数返回后的地址.
1.1 栈的特征
一个进程中,栈顶指针(ESP)初始状态指向栈底端.执行PUSH
命令将数据压入栈时,栈顶指针就会上移到栈顶端.执行POP
命令从栈中弹出数据时,若栈为空,则栈顶指针重新移动到栈底端.向栈中压数据就像一层层砌砖,每向上砌一层,砖墙就增高一点儿.
1.2 栈操作示例
栈顶指针的值为19FF84
,观察右下角的栈长裤,可以看到ESP指向的地址及其值.
在代码窗口中按F7键(Step Into),执行401000
地址处的PUSH 100
命令.
可以看到ESP值变为19FF80
,比原来减少了4
个字节,并且当前栈顶指针指向19FF80
,该地址中保存着100
这个值.换言之,执行PUSH
命令时,数值100
被压入栈,ESP随之向上移动,即ESP的值减少了4
个字节.再次按F7(Step Into),执行401005
地址处的POP EAX
命令.
执行完POP EAX
命令后,ESP值又增加了4
个字节,变为19FF84
,栈又变为初始状态.换言之,从栈中弹出数据后,ESP随之向下移动.向栈压入数据从栈中弹出数据时,栈顶指针的变化情形如下:
- 向栈压入数据时,栈顶指针减小,向低地址移动;从栈中弹出数据时,栈顶指针增高,向高地址移动.