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

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

 

让编程改变世界

Change the world by program


 

push、pop指令

 

问题3.7

编程:将10000H~1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。 思考后看分析。 [caption id="attachment_300" align="aligncenter" width="300"] push、pop指令[/caption]  

问题3.8

编程: (1)将10000H~1000FH 这段空间当作栈,初始状态是空的; (2)设置AX=001AH,BX=001BH; (3)将AX、BX中的数据入栈; (4)然后将AX、BX清零; (5)从栈中恢复AX、BX原来的内容。 思考后看分析。 [caption id="attachment_301" align="aligncenter" width="300"] push、pop指令[/caption]   从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时 ,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶 ,所以在恢复时,要最先出栈。  

问题3.9

编程: (1)将10000H~1000FH 这段空间当作栈,初始状态是空的; (2)设置AX=002AH,BX=002BH; (3)利用栈 ,交换 AX 和 BX 中的数据。 思考后看分析。 [caption id="attachment_302" align="aligncenter" width="300"] push、pop指令[/caption]  

问题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指示的地址,按照栈的方式访问内存单元。  

2. push指令的执行步骤:

SP=SP-2; 向SS:SP指向的字单元中送入数据。  

3. pop指令的执行步骤:

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

4. 任意时刻,SS:SP指向栈顶元素。

5. 8086CPU只记录栈顶,栈空间的大小我们要自己管理。

6. 用栈来暂存以后需要恢复的寄存器的内容时 ,寄存器出栈的顺序要和 入栈的顺序相反。

7. push、pop实质上是一种内存传送指令,注意它们的灵活应用。

  栈是一种非常重要的机制,一定要深入理解,灵活掌握。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LBXAHKKOVRLY']视频下载[/Downlink]
原文地址:https://www.cnblogs.com/LoveFishC/p/3846972.html