🎓 微机原理考点专栏(通篇免费)
欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。
为什么选择我的视频?
- 全程考点讲解:每一节视频都紧扣考试要点,拒绝冗余,专注于最关键的知识点。
- 系统且高效:我已经为你精心准备了系统的学习资料,让你不再迷茫。
🔗 点击这里观看我的视频讲解 🔗
我需要你的支持
我为这套视频投入了大量精力,希望它能对你的学习有所帮助。如果你觉得内容有用,请给我的视频点个赞、评论、并关注我,这将是我继续创作的最大动力!
🙏 感谢你的支持!祝你学有所成! 🙏
3.4 数据传送指令
汇编指令说明
1. MOV(Move)指令
- 功能: 将源操作数(可以是寄存器、内存单元或立即数)的内容传送到目的操作数(寄存器或内存单元)。
- 格式:
MOV 目的, 源
- 示例:
MOV AX, BX
:将BX
寄存器中的内容传送到AX
寄存器。MOV AL, [SI]
:将SI
寄存器指向的内存单元中的内容传送到AL
寄存器。
2. PUSH(Push)指令
- 功能: 将源操作数压入堆栈。
- 过程:
- 栈指针(
SP
)先减去2,指向新位置。 - 将源操作数的内容存入该位置。
- 栈指针(
- 格式:
PUSH 源
- 示例:
PUSH AX
:将AX
寄存器中的内容压入堆栈。
3. POP(Pop)指令
- 功能: 将堆栈中的数据弹出至目的操作数。
- 过程:
- 先将栈顶的内容传送到目的操作数。
- 栈指针(
SP
)加2,指向新的栈顶。
- 格式:
POP 目的
- 示例:
POP BX
:将栈顶内容弹出至BX
寄存器。
4. XCHG(Exchange)指令
- 功能: 交换源操作数与目的操作数的内容。
- 格式:
XCHG 目的, 源
- 示例:
XCHG AX, BX
:交换AX
和BX
寄存器的内容。
5. XLAT(Translate)指令
此部分不太考,可选择性跳过。
- 功能: 利用累加器
AL
中的值作为索引,从内存表格中取出相应的值,替换AL
中的内容。通常用于代码转换。 - 格式:
XLAT
或XLATB
- 示例:
- 当
AL
为一个索引,执行XLAT
后,AL
将包含[BX+AL]
处的值。
- 当
6. IN(Input)指令
- 功能: 将 I/O 端口的数据传输到
AX
或AL
寄存器中。 - 格式:
IN AX/AL, I/O地址
- 示例:
IN AL, 60h
:从 I/O 地址60h
读入一个字节,存入AL
寄存器。
7. OUT(Output)指令
- 功能: 将
AX
或AL
寄存器中的数据传输到指定的 I/O 端口。 - 格式:
OUT I/O地址, AX/AL
- 示例:
OUT 60h, AL
:将AL
寄存器中的内容传送到 I/O 地址60h
。
8. LEA(Load Effective Address)指令
- 功能: 将源操作数的有效地址(偏移量)送入目的操作数。常用于获取内存地址而不进行实际的内存访问。
- 格式:
LEA 目的, 源
- 示例:
LEA BX, [SI+DI]
:将SI+DI
的和(内存偏移量)送入BX
寄存器。
9. LDS(Load Pointer to DS)指令
- 功能: 从源操作数指定的存储单元中取出一个双字(4 字节)的地址指针,将低地址的两个字节送入目的操作数,高地址的两个字节送入
DS
寄存器。 - 格式:
LDS 目的, 源
- 示例:
LDS BX, [1234h]
:将内存1234h
和1236h
处的内容分别送入BX
和DS
寄存器。
LDS 指令的执行过程
题目
假设在程序执行过程中,SI=0124H
,DS=1234H
。程序中有一条指令:LDS SI, [SI+20H]
。在内存中,地址 12484H
和 12486H
处分别存储了以下数据:
内存地址 | 数据 |
---|---|
12484H | 0464H |
12486H | 1200H |
执行这条指令后,SI
和 DS
寄存器的值会如何变化?
解答
-
计算源地址:
首先,我们需要计算出源操作数的地址,它是由SI
寄存器的初始值加上20H
偏移量得到的:
源地址 = SI + 20 H = 0124 H + 20 H = 0144 H \text{源地址} = \text{SI} + 20H = 0124H + 20H = 0144H 源地址=SI+20H=0124H+20H=0144H
然后,根据段地址1234H
计算出实际的内存地址(物理地址):
物理地址 = DS × 16 + 源地址 = 1234 H × 16 + 0144 H = 12484 H \text{物理地址} = \text{DS} \times 16 + \text{源地址} = 1234H \times 16 + 0144H = 12484H 物理地址=DS×16+源地址=1234H×16+0144H=12484H -
从源地址读取数据:
从计算得到的内存地址12484H
读取 32 位的数据(双字),其中:- 前 16 位(从
12484H
读取)为0464H
。 - 后 16 位(从
12486H
读取)为1200H
。
- 前 16 位(从
-
加载数据到寄存器:
结果如下:
寄存器 | 旧值 | 新值 |
---|---|---|
SI | 0124H | 0464H |
DS | 1234H | 1200H |
- 将
0464H
加载到SI
寄存器。 - 将
1200H
加载到DS
寄存器。
- 结果分析:
执行完LDS SI, [SI+20H]
指令后:SI
寄存器的值更新为0464H
。DS
段寄存器的值更新为1200H
。
小结
LDS
指令的作用是从内存中加载一个 32 位的指针,并将这个指针分为两部分:
- 前 16 位加载到目标寄存器(如
SI
)。 - 后 16 位加载到
DS
段寄存器。
通过这种方式,程序可以设置一个新的段:偏移地址对,用于后续的内存访问操作。这使得程序能够动态地调整数据段,方便灵活的数据处理。
实例验证
为了更清楚地理解这个过程,我们通过具体的数据验证 LDS
指令的执行结果:
- 内存地址
12484H
的值为0464H
。 - 内存地址
12486H
的值为1200H
。
执行 LDS SI, [SI+20H]
后:
寄存器 | 更新后的值 |
---|---|
SI | 0464H |
DS | 1200H |
这与我们的预期一致,证明 LDS
指令成功加载并更新了 SI
和 DS
寄存器的值。