3.4 数据传送指令

在这里插入图片描述

🎓 微机原理考点专栏(通篇免费)

欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。

为什么选择我的视频?

  • 全程考点讲解:每一节视频都紧扣考试要点,拒绝冗余,专注于最关键的知识点。
  • 系统且高效:我已经为你精心准备了系统的学习资料,让你不再迷茫。

🔗 点击这里观看我的视频讲解 🔗

我需要你的支持

我为这套视频投入了大量精力,希望它能对你的学习有所帮助。如果你觉得内容有用,请给我的视频点个赞、评论、并关注我,这将是我继续创作的最大动力!

🙏 感谢你的支持!祝你学有所成! 🙏


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:交换 AXBX 寄存器的内容。

5. XLAT(Translate)指令

此部分不太考,可选择性跳过。

  • 功能: 利用累加器 AL 中的值作为索引,从内存表格中取出相应的值,替换 AL 中的内容。通常用于代码转换。
  • 格式: XLATXLATB
  • 示例:
    • AL 为一个索引,执行 XLAT 后,AL 将包含 [BX+AL] 处的值。

6. IN(Input)指令

  • 功能: 将 I/O 端口的数据传输到 AXAL 寄存器中。
  • 格式: IN AX/AL, I/O地址
  • 示例:
    • IN AL, 60h:从 I/O 地址 60h 读入一个字节,存入 AL 寄存器。

7. OUT(Output)指令

  • 功能: 将 AXAL 寄存器中的数据传输到指定的 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]:将内存 1234h1236h 处的内容分别送入 BXDS 寄存器。

LDS 指令的执行过程

题目

假设在程序执行过程中,SI=0124HDS=1234H。程序中有一条指令:LDS SI, [SI+20H]。在内存中,地址 12484H12486H 处分别存储了以下数据:

内存地址数据
12484H0464H
12486H1200H

执行这条指令后,SIDS 寄存器的值会如何变化?

解答
  1. 计算源地址:
    首先,我们需要计算出源操作数的地址,它是由 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

  2. 从源地址读取数据:
    从计算得到的内存地址 12484H 读取 32 位的数据(双字),其中:

    • 前 16 位(从 12484H 读取)为 0464H
    • 后 16 位(从 12486H 读取)为 1200H
  3. 加载数据到寄存器:
    结果如下:

寄存器旧值新值
SI0124H0464H
DS1234H1200H
  • 0464H 加载到 SI 寄存器。
  • 1200H 加载到 DS 寄存器。
  1. 结果分析:
    执行完 LDS SI, [SI+20H] 指令后:
    • SI 寄存器的值更新为 0464H
    • DS 段寄存器的值更新为 1200H
小结

LDS 指令的作用是从内存中加载一个 32 位的指针,并将这个指针分为两部分:

  • 前 16 位加载到目标寄存器(如 SI)。
  • 后 16 位加载到 DS 段寄存器。

通过这种方式,程序可以设置一个新的段:偏移地址对,用于后续的内存访问操作。这使得程序能够动态地调整数据段,方便灵活的数据处理。

实例验证

为了更清楚地理解这个过程,我们通过具体的数据验证 LDS 指令的执行结果:

  • 内存地址 12484H 的值为 0464H
  • 内存地址 12486H 的值为 1200H

执行 LDS SI, [SI+20H] 后:

寄存器更新后的值
SI0464H
DS1200H

这与我们的预期一致,证明 LDS 指令成功加载并更新了 SIDS 寄存器的值。

  • 27
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值