【汇编语言】第三章----寄存器(内存访问)(九)—— push、pop指令以及例题分析与讲解

在这里插入图片描述

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

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]

指令执行时,CPU要知道内存单元的地址,可以在push、pop指令中只给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。

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主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

评论 92
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值