3.6栈是一种具有特殊的访问方式的存储空间。他的特殊性就在于,最后进入这个空间的数据最先出去。
栈有两个基本的操作:入栈和出栈。
入栈:将一个新的元素放到栈顶。
出栈:从栈顶取出一个元素。
栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。
栈的操作规则:LIFO(后进先出Last In First Out)
PUSH(入栈)POP(出栈)
push ax 将寄存器AX中的数据送入栈中
pop ax 从栈顶取出数据送入ax
8086CPU的入栈和出栈操作都是以字为单位进行的
当栈中无元素的时候SP寄存器指向下一个……下面图
pop指令执行过程:
3.8栈顶越界问题
如何保证入栈,出栈时栈顶不会超出栈空间
当栈满的时候在使用push指令入栈,栈空的时候在使用pop指令出栈,都将发生栈顶超界问题
3.9push和pop指令
push和pop指令是可以在寄存器和内存之间传送数据的
栈空间也是内存空间的一部分,他只是一段以一种特殊方式进行访问的内存空间
指令格式:push 寄存器:将一个寄存器中的数据入栈
pop 寄存器:出栈,用一个寄存器接受出栈的数据
push 段寄存器:讲一个段寄存器中的数据入栈
pop 段寄存器:出栈,用一个段寄存器接收出栈的数据。
push内存单元:讲一个内存单元处的字入栈(栈操作都是以字为单位)
pop 内存单元: 出栈,用一个内存字单元接收出栈的数据如pop [2]
指令执行时,CPU要知道内存单元的地址,可以再push,pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得
push,pop等栈操作指令,修改的知识sp也就是说,栈顶的变化范围最大为:0~FFFFH
3.10栈段
我们可以将长度为N(N<=64k)的一组地址连续,地址为16的倍数的内存单元,当做栈来使用,从而定义了栈段