3.6 栈
栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。
栈有两个基本的操作:
入栈和出栈。入栈就是将新的元素放在栈顶,出栈就是从栈顶去除一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的这种操作规则被称为:LIFO1 (Last In First out)。
3.7 CPU提供的栈机制
8086CPU最基本的两个入栈和出栈指令PUSH
和 POP
。push ax
表示将寄存器ax中的数据送入栈中,pop ax
表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为单位进行的。
存在相应的寄存器来存放栈顶的地址,8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。
任意时刻,SS:SP指向栈顶元素。
push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
^_^ push ax
的执行,由以下两步完成
- SP = SP - 2, SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
- 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP为0010H (指向栈的最高地址单元的下一位地址)。
将 10000H~1000FH这段空间当作栈段,SS=1000H,栈空间大小为16字节,栈最底部的字单元地址为1000:000E。任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=000EH。栈为空,就相当于栈中唯一的元素出栈,出栈后,SP = SP+2,SP原来为000EH,加2后SP=10H,所以,当栈为空的时候,SS=1000H,SP=10H。
换个角度看,任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。
^_^ pop ax
执行过程和push ax
刚好相反,由以下两步完成。
- 将SS:SP指向的内存单元处的数据送入ax中;
- SP=SP+2, SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
注意,当执行
pop
指令时,弹出的数据依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。