• 寄存器(内存访问)05 零基础入门学习汇编语言17


    第三章:寄存器(内存访问)05

     

    让编程改变世界

    Change the world by program


     

    pop指令的执行过程

     

    pop ax

    将SS:SP指向的内存单元处的数据送入ax中;

    SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

      [caption id="attachment_298" align="aligncenter" width="300"] pop指令的执行过程[/caption]  

    注意:

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

    栈顶超界的问题

    SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶。   可是,如何能够保证在入栈、出栈时,栈顶不会超出栈空间? [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/3_执行PUSH指令后栈顶超出栈空间.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]   都将发生栈顶超界问题,栈顶超界是危险的。 [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/3_执行POP指令后栈顶超出栈空间.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]   因为我们既然将一段空间安排为栈 ,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。(毕竟一个计算机系统并不是只有我们自己的程序在运行) 但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。(但如果是刻意的……那么……呵呵……) 我们当然希望CPU 可以帮我们解决这个问题,比如说在CPU中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围 ,然后 ,CPU 在执行push指令的时候靠检测栈顶上限寄存器,在执行pop 指令的时候靠检测栈顶下限寄存器保证不会超界。   实际情况:8086CPU中并没有这样的寄存器。 8086CPU不保证对栈的操作不会超界。 这就是说 8086CPU 只知道栈顶在何处(由SS:SP指示),而不知道读者安排的栈空间有多大。 这点就好像CPU只知道当前要执行的指令在何处(由CS:SP指示)而不知道读者要执行的指令有多少。  

    从这两点我们可以看出

    8086CPU的工作机理,只考虑当前的情况:

    当前栈顶在何处;

    当前要执行的指令是哪一条。

     

    结论

    我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界; 执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。

    push、pop指令

      push和pop指令是可以在寄存器和内存之间传送数据的。 栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。  

    push和pop指令的格式

      push 寄存器:将一个寄存器中的数据入栈 pop寄存器:出栈,用一个寄存器接收出栈的数据 例如:

    push ax

    pop bx

      push 段寄存器:将一个段寄存器中的数据入栈 pop段寄存器:出栈,用一个段寄存器接收出栈的数据 例如:

    push ds

    pop es

    push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位) pop 内存单元:出栈,用一个内存字单元接收出栈的数据 例如:

    push [0]

    pop [2]

      指令执行时 ,CPU 要知道内存单元的地址,可以在 push、pop 指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LNZLGFDAOVZG']视频下载[/Downlink]
  • 相关阅读:
    第一个TS文件
    盒子模型
    不稳定的排序算法
    状态码Status Code
    从输入URL到页面加载完成发生了什么?
    JavaScript中var、let、const的区别
    explain 详解 (转)
    HttpServletRequest对象方法的用法 (转)
    数据一致性理解
    logback 使用详解 (转)
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3845993.html
Copyright © 2020-2023  润新知