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