栈主要是用来临时存放函数的返回地址的(存放主函数eg:main()函数调用其它函数时临时存储当前寄存器的值,以便于恢复)
push 入栈 push ax : 将寄存器ax中的数据送入栈中
pop 出栈 pop ax : 从栈顶取出数据送入寄存器ax中
8086CPU的入栈和出栈操作都是以字为单位进行的
question: CPU如何知道当前要执行的指令所在的位置?
answer:寄存器CS和IP中存放着当前指令的段地址和偏移地址。
8086CPU中有两个寄存器:
段寄存器SS:存放栈顶的段地址
寄存器SP: 存放栈顶的偏移地址
任意时刻,SS:SP指向栈顶元素。
8086CPU提供的栈操作机制:
push与pop指令的格式 : 栈操作以字为单位
1.寄存器:eg: push ax 将寄存器(ax)中的数据入栈
pop bx 用一个寄存器(bx)接收出栈的数据
2.段寄存器:eg: push ds 将一个段寄存器(ds)中的数据入栈
pop es 用一个段寄存器(接收)出栈的数据
3.内存单元: eg: push [0] 将一个内存单元处的字入栈 ( 段地址由CPU从DS中取得)
pop [2] 用一个内存字单元接收出栈的数据 ( 段地址由CPU从DS中取得)
question:将10000H -- 1FFFFH这段内存单元空间当做栈段,初始状态是空的,此时,SS = 1000H,SP = ?
analysis:栈空间大小为64k,栈最底部的字单元地址为 1000:FFFE。
任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP = FFFEH;可是当栈为空,相当于栈中唯一的元素出栈,
出栈后SP = SP + 2;SP原来为FFFEH,加2后SP = 0(由于64k的栈空间已经溢出了);所以当栈为空的时候,SS = 1000H,SP = 0000H。