文档详情

《计算机组成原理与汇编语言》汇编--栈.ppt

发布:2017-07-24约1.73千字共24页下载文档
文本预览下载声明
本课件由汇编网()制作提供 栈 栈有两个基本的操作:入栈和出栈。 入栈:将一个新的元素放到栈顶; 出栈:从栈顶取出一个元素。 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。 栈的操作规则:LIFO (Last In First Out,后进先出) 栈 我们研究栈的角度: 栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。 可以用一个盒子和3本书来描述 栈的操作方式 CPU提供的栈机制 现今的CPU中都有栈的设计。 8086CPU提供相关的指令来以栈的方式访问内存空间。 这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。 CPU提供的栈机制 8086CPU提供入栈和出栈指令: PUSH(入栈) POP (出栈) push ax:将寄存器ax中的数据送入栈中; pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以字为单位进行的。 栈 下面举例说明,我们可以将10000H~1000FH这段内存当作栈来使用。 下面一段指令的执行过程: mov ax,0123H push ax mov bx,2266H push bx mov cx,1122H push cx pop ax pop bx pop cx 栈 指令序列的执行过程演示 注意:字型数据用两个单元存放,高地址单元放高 8 位,低地址单元放低8 位。 疑问 执行push和pop的时候,如何知道哪个单元是栈顶单元? 对于两个疑问的分析 回想: CPU如何指导当前要执行的指令所在的位置?  寄存器CS和IP中存放着当前指令的段地址和偏移地址。  8086CPU中,有两个寄存器: 段寄存器SS  存放栈顶的段地址 寄存器SP  存放栈顶的偏移地址 任意时刻,SS:SP指向栈顶元素。 push 指令的执行过程 push ax (1)SP=SP–2; (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。 push 指令的执行过程 pop 指令的执行过程 pop ax (1)将SS:SP指向的内存单元处的数据送入ax中; (2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。 pop 指令的执行过程 栈 问题: 如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=? 问题分析 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。 push、pop指令 问题 编程: (1)将10000H~1000FH 这段空间当作栈,初始状态是空的; (2)设置AX=001AH,BX=001BH; (3)将AX、BX中的数据入栈; (4)然后将AX、BX清零; (5)从栈中恢复AX、BX原来的内容。 问题分析 * * * 本课件由汇编网()制作提供 * * *
显示全部
相似文档