第5章 栈

栈(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命令.
PUSH命令

执行完POP EAX命令后,ESP值又增加了4个字节,变为19FF84,栈又变为初始状态.换言之,从栈中弹出数据后,ESP随之向下移动.向栈压入数据从栈中弹出数据时,栈顶指针的变化情形如下:

  • 向栈压入数据时,栈顶指针减小,向低地址移动;从栈中弹出数据时,栈顶指针增高,向高地址移动.