8086汇编-17寄存器(内存访问)05

#pragma once
/* 17-寄存器(内存访问)05

  pop 指令的执行过程
    pop ax
        (1)将SS:SP指向的内存单元处的数据送入ax中;
        (2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

    
    注意:
        出栈后,SS:SP指向新的栈顶 1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在 ,但是,它已不在栈中。
        当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。


  栈顶超界的问题
    SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶。

    可是,如何能够保证在入栈、出栈时,栈顶不会超出栈空间?

    当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。当然,栈满的时候push,也会push 进数据的,只是push 到外面了,去覆盖其他位置的数据了,这个位置有可能是我们程序的内存,也有可
能是其他程序的内存,总之是非常危险的,栈空的时候使用pop 指令出栈的话,也是可以的,只是SP进行改变了,并且把其他位置的数据给到我们的寄存器,也有可能引发一系列的问题.

    栈顶超界是危险的。

    栈顶超界是危险的:
       因为我们既然将一段空间安排为栈 ,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。(毕竟一个计算机系统并不是只有我们自
己的程序在运行)

    但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。(但如果是刻意的……那么……呵呵……)

    我们当然希望CPU 可以帮我们解决这个问题,

    比如说在CPU中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围 ,然后 ,CPU 在执行push指令的时候靠检测栈顶上限寄存器,在执行pop 指令的时候靠检测栈顶下限寄存器保证不会超界。

    实际情况:8086CPU中并没有这样的寄存器。

    8086CPU不保证对栈的操作不会超界。 这就是说, 8086CPU 只知道栈顶在何处(由SS:SP指示),而不知道读者安排的栈空间有多大。这点就好像 ,CPU 只知道当前要执行的指令在何处(由CS:SP指示)而不知道读者要执行的
指令有多少。

    从这两点我们可以看出8086CPU的工作机理,只考虑当前的情况:
        当前栈顶在何处;
        当前要执行的指令是哪一条。

        结论:
            我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;

            执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。

  push、pop指令
    push和pop指令是可以在寄存器和内存之间传送数据的。

    push和pop指令的格式


  栈与内存
    栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。


  push、pop指令
    push和pop指令的格式(1)
        push 寄存器:将一个寄存器中的数据入栈
        pop寄存器:出栈,用一个寄存器接收出栈的数据

    例如:push ax
          pop bx

    push和pop指令的格式(2)
        push 段寄存器:将一个段寄存器中的数据入栈
        pop段寄存器:出栈,用一个段寄存器接收出栈的数据
            这里就说明了push 和 pop 可以对段寄存器进行操作赋值!!!

        例如:push ds
              pop es
    
    push和pop指令的格式(3)
        push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)  !!!!!! push 和pop 都是以字 单位进行的,也就是16位!!!
        pop 内存单元:出栈,用一个内存字单元接收出栈的数据

    例如:push [0]
          pop [2]

        指令执行时 ,CPU 要知道内存单元的地址,可以在 push、pop 指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。
            这里表明了可以直接 push 或者 pop  ds寄存器中偏移的内存内容.

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值