寄存器(内存访问)06 – 零基础入门学习汇编语言18

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

让编程改变世界

Change the world by program

push、pop指令

问题3.7

编程:将10000H~1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。

思考后看分析。

宽客网,量化投资,宽客俱乐部

push、pop指令

问题3.8

编程:

(1)将10000H~1000FH 这段空间当作栈,初始状态是空的;

(2)设置AX=001AH,BX=001BH;

(3)将AX、BX中的数据入栈;

(4)然后将AX、BX清零;

(5)从栈中恢复AX、BX原来的内容。

思考后看分析。

宽客网,量化投资,宽客俱乐部

push、pop指令

从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时 ,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶 ,所以在恢复时,要最先出栈。

问题3.9

编程:

(1)将10000H~1000FH 这段空间当作栈,初始状态是空的;

(2)设置AX=002AH,BX=002BH;

(3)利用栈 ,交换 AX 和 BX 中的数据。

思考后看分析。

宽客网,量化投资,宽客俱乐部

push、pop指令

问题3.10

我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:

mov ax,1000H

mov ds,ax

mov ,ax,2266H

mov [0],ax

看题目:

补在10000H处写入字型数据2266H。




mov ax,2266H

push ax

要求:不能使用“mov 内存单元,寄存器”这类指令

思考后看分析。

我们看需补全代码的最后两条指令,将ax中的2266H压入栈中,也就是说,最终应由push ax将2266H写入10000H处。

问题的关键就在于:如何使push ax访问的内存单元是10000H。

Push指令是入栈指令。(注意执行过程)

完整的程序:

mov ax,1000H

mov ss,ax

mov sp,2

mov ax,2266H

push ax

结论

push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。

同时,push和pop指令还要改变 SP 中的内容。

我们要十分清楚的是,push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。

执行push时:先改变SP,后向SS:SP处传送。

执行pop时:先读取SS:SP处的数据,后改变SP。

注意

push、pop 等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:0~FFFFH。

提供:SS、SP指示栈顶;改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。

这就是8086CPU提供的栈操作机制。

栈的综述

  1. 8086CPU提供了栈操作机制,方案如下:

在SS,SP中存放栈顶的段地址和偏移地址;

提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。

  1. push指令的执行步骤:

SP=SP-2;

向SS:SP指向的字单元中送入数据。

  1. pop指令的执行步骤:

从SS:SP指向的字单元中读取数据;

SP=SP-2。

  1. 任意时刻,SS:SP指向栈顶元素。
  2. 8086CPU只记录栈顶,栈空间的大小我们要自己管理。
  3. 用栈来暂存以后需要恢复的寄存器的内容时 ,寄存器出栈的顺序要和 入栈的顺序相反。
  4. push、pop实质上是一种内存传送指令,注意它们的灵活应用。

栈是一种非常重要的机制,一定要深入理解,灵活掌握。

视频下载
技术, IT技术, 汇编语言, 视频教程


风险提示及免责条款

市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部