来源:互联网 发布:管家婆打印软件 编辑:程序博客网 时间:2024/05/20 16:40

栈主要是用来临时存放函数的返回地址的(存放主函数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。

                  

0 0
原创粉丝点击