文章目录
前言
1. 知识点
前面我们一直在使用push ax和pop ax,显然push 和 pop指令是可以在寄存器和内存之间传送数据的。(栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。)
(1)push 和 pop指令的格式可以是如下形式:
例如:
push ax
pop bx
(2)当然也可以是如下形式:
例如:
push ds
pop es
(3)push和pop也可以在内存单元和内存单元之间传送数据,我们可以:
例如:
push [0]
pop [2]
2. 问题一以及分析与解答
编程要求:
将10000H-1000FH这空间当作栈,初始状态是空的,将AX、BX、DS中的数据入栈。
思考后看分析。
分析与求解:
代码如下:
3. 问题二以及分析与解答
编程要求:
(1)将10000H-1000FH 这段空间当作栈,初始状态栈是空的;
(2)设置AX=001AH,BX=001BH;
(3)将AX、BX中的数据入栈;
(4)然后将AX、BX清零;
(5)从栈中恢复AX、BX原来的内容。
思考后看分析。
分析与求解:
代码如下:
4. 问题三以及分析与解答
编程要求:
(1)将10000H-1000FH 这段空间当作栈,初始状态栈是空的;
(2)设置AX=001AH,BX=001BH;
(3)利用栈 ,交换 AX 和 BX 中的数据。
思考后看分析。
分析与求解:
代码如下:
5. 问题四以及分析与解答
编程要求:
我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:
补全下面的代码,使它能够完成同样的功能:在10000H处写入字型数据2266H。
❗要求:不能使用“mov 内存单元,寄存器”这类指令。
分析与求解:
首先,我们来看题目中已经给出的最后两条指令是将ax中的2266H入栈中,也就是说,最终应由push ax将2266H写入10000H处。
那么问题的关键就在于:如何使push ax访问的内存单元是 10000H。
push ax是入栈指令,它将在栈顶之上压入新的数据。一定要注意:它的执行过程是,先将记录栈顶偏移地址的SP寄存器中的内容减2,使得SS:SP指向新的栈顶单元,然后再将寄存器中的数据送入SS:SP指向的新的顶单元。
所以,要在执行push ax之前,将SS:SP指向10002H(可以设SS=1000H,SP=0002H),这样,在执行push ax的时候,CPU先将SP=SP-2,使得SS:SP指向10000H,再将ax中的数据送入SS:SP指向的内存单元处,即10000H处。
完整的程序如下:
6. 总结
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 提供的栈操作机制。
结语
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。
也可以点点关注,避免以后找不到我哦!
Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!