《汇编语言》讲稿章寄存器(内存访问).ppt

《汇编语言》讲稿章寄存器(内存访问).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.8 栈顶超界的问题 当栈满的时候再使用push指令入栈, 栈空的时候再使用pop指令出栈, 都将发生栈顶超界问题。 栈顶超界是危险的。 3.8 栈顶超界的问题 栈顶超界是危险的: 因为我们既然将一段空间安排为栈 ,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。 (毕竟一个计算机系统并不是只有我们自己的程序在运行) 3.8 栈顶超界的问题 但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。 我们当然希望CPU 可以帮我们解决这个问题, 3.8 栈顶超界的问题 比如说在CPU中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围 ,然后 ,CPU 在执行push指令的时候靠检测栈顶上限寄存器,在执行pop 指令的时候靠检测栈顶下限寄存器保证不会超界。 实际情况:8086CPU中并没有这样的寄存器。 3.8 栈顶超界的问题 8086CPU不保证对栈的操作不会超界。 这就是说, 8086CPU 只知道栈顶在何处(由SS:SP指示),而不知道读者安排的栈空间有多大。这点就好像 ,CPU 只知道当前要执行的指令在何处(由CS:SP指示)而不知道读者要执行的指令有多少。 从这两点我们可以看出 3.8 栈顶超界的问题 8086CPU的工作机理,只考虑当前的情况: 当前栈顶在何处; 当前要执行的指令是哪一条。 结论 3.8 栈顶超界的问题 结论: 我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。 3.9 push、pop指令 push和pop指令是可以在寄存器和内存之间传送数据的。 push和pop指令的格式 栈与内存 栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。 3.9 push、pop指令 push和pop指令的格式(1) push 寄存器:将一个寄存器中的数据入栈 pop寄存器:出栈,用一个寄存器接收出栈的数据 例如:push ax pop bx 3.9 push、pop指令 push和pop指令的格式(2) push 段寄存器:将一个段寄存器中的数据入栈 pop段寄存器:出栈,用一个段寄存器接收出栈的数据 例如:push ds pop es 3.9 push、pop指令 push和pop指令的格式(3) push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位) pop 内存单元:出栈,用一个内存字单元接收出栈的数据 例如:push [0] pop [2] 指令执行时 ,CPU 要知道内存单元的地址,可以在 push、pop 指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。 3.9 push、pop指令 问题3.7 编程: 将10000H~1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。 思考后看分析。 问题3.7分析 3.9 push、pop指令 问题3.8 编程: (1)将10000H~1000FH 这段空间当作栈,初始状态是空的; (2)设置AX=001AH,BX=001BH; (3)将AX、BX中的数据入栈; (4)然后将AX、BX清零; (5)从栈中恢复AX、BX原来的内容。 思考后看分析。 问题3.8分析 结论 问题3.8分析 从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时 ,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶 ,所以在恢复时,要最先出栈。 3.9 push、pop指令 问题3.9 编程: (1)将10000H~1000FH 这段空间当作栈,初始状态是空的; (2)设置AX=002AH,BX=002BH; (3)利用栈 ,交换 AX 和 BX 中的数据。 思考后看分析。 验证(Debug) mov 段寄存器,寄存器 ? mov 寄存器,段寄存器 add和sub指令同mov一样,都有两个操作对象。 它们可以对段寄存器进行操作吗? (请自行在Debug中试验) 3.4 mov、add、sub指令 3.5 数据段 前面讲过,对于8086PC机,我们可以根据需要将一组内存单元定义为一个段。 我们可以将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。 比如

文档评论(0)

xiaohuer + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档