• DJ12-1 8086系列指令系统-2 数据传送指令


    目录

    1. 通用数据传送指令

    (1)MOV 一般数据传送指令

    (2)堆栈操作指令

    (3)XCHG 交换指令

    (4)XLAT 查表指令

    (5)CBW 和 CWD 字位扩展指令

    2. 输入输出指令

    3. LEA 取偏移地址指令

    4. 其它传送类指令

    (1)LDS 和 LES 装入地址指针指令

    (2)标志传送指令


    后续所用的符号说明:


    数据传送指令 按功能可以分为:

    1. 通用数据传送指令
    2. 输入输出指令
    3. 目的地址传送指令
    4. 标志传送指令

    FLAGS 不能作操作数。虽然不能直接对其进行操作,但是可以间接对其进行操作。

    如:SAHF 把 AH 写入 FLAGS,CAHF 把 FLAGS 写入 AH 。

    1. 通用数据传送指令

    (1)MOV 一般数据传送指令

    格式:MOV  Dest,Src

    执行:Src → Dest

    举例:MOV  AL,BL

    对操作数的要求:

    ① 两操作数长度必须相同;

    MOV  AX,BL(×)

    MOV  AX,09H(√)

    在可识别的情况下,编译器会自动把 09H 转换为 0009H 。实际上还是满足要求的。

    MOV  AX,[SI]

    根据 AX 是 16 位,会从 M 取出 16 位。

    存储单元之间不能直接传送;

    ③ 段寄存器 CS 只能作源操作数,段寄存器之间不能直接传送;

    ④ 当源操作数是立即数时,目的操作数不能是段寄存器;

    MOV  DS,1000H(×)应该修正为:

    MOV  DX,1000H

    MOV  DS,DX

    ⑤ FLAGS 一般不作为操作数在指令中出现。

    (重点记背)MOV 传送指令的操作数:

    应用举例:

    例、判断下列指令的正确性。

    例、将 * 的 ASCII 码 2AH 送入内存数据段 1010H 开始的 100 个单元中。

    (2)堆栈操作指令

    压栈指令格式:PUSH  OPRD

    出栈指令格式:POP  OPRD

    对操作数的要求:

    ① 指令的操作数必须是 16 位。

    ② 操作数可以是寄存器或存储器字单元,但不能是立即数。

    这里的寄存器包括段寄存器和通用寄存器。

    因为立即数无法作目的操作数,所以不适用于单操作数指令。

    ③ 不能从栈顶弹出一个字给 CS 。

    原则上只有 MOV 中可以使用 CS,其它的都不让用。

    ④ PUSH 和 POP 指令在程序中一般成对出现。

    ⑤ PUSH 指令的操作方向是从高地址向低地址,而 POP 指令的操作正好相反。

    应用举例:

    PUSH 指令 执行过程:

    POP 指令 执行过程:

    PUSH 和 POP 指令在程序中一般成对出现,但有时候我们故意不按顺序,以实现交换的效果。例如交换 AX 和 BX 中的内容:

    (3)XCHG 交换指令

    格式:XCHG  OPRD1,OPRD2

    执行:OPRD1 ←→ OPRD2

    效果:交换源地址中的内容和目的地址中的内容。

    对操作数的要求:

    • 操作数中至少有一个是通用寄存器,即不能同时为存储器。(可以同时为通用寄存器)
    • 段寄存器不能作操作数。(段寄存器主要适用于一般传送指令和堆栈操作指令)
    • 两个操作数的字长必须相同。

    应用举例:

            XCHG  AX,BX

            XCHG  [2000],CL

    (4)XLAT 查表指令

    格式:XLAT

    执行:[ BX + AL ] → AL

    XLAT 查表指令的特点:

    • 指令为零操作数指令,采用隐含寻址。
    • BX 的内容为表格首地址,AL 的内容为表内位移量,  BX + AL 得到要查找元素的偏移地址。
    • 表格的最大长度不超过 256 字节

    应用举例:

    例、假设数据段中存放有一张 ASCII 码转换表,若首地址为 2000H,现欲查出表中第 11 个代码的 ASCII 码。

    (5)CBW 和 CWD 字位扩展指令

    功能:将带符号数的符号位扩展到高位。

    注:默认将无符号数和带符号数一概视为带符号数。

    指令为零操作数指令,采用隐含寻址,隐含的操作数为 AX 或 AX 和 DX 。

    ① CBW

            将 AL 的符号位扩展到 AH。

            若 AL 的最高位 = 1,则执行后 AH = 0FFH;

            若 AL 的最高位 = 0,则执行后 AH = 00H。

    ② CWD

            将 AX 的符号位扩展到 DX。

            若 AX 的最高位 = 1,则执行后 DX = 0FFFFH;

            若 AX 的最高位 = 0,则执行后 DX = 0000H。

    例、判断下列指令的执行结果。

    2. 输入输出指令

    输入输出指令是专门面向 I/O 端口进行读写的指令,共有两条:IN 和 OUT 。输入指令 IN 用于从 I/O 端口读数据到累加器 AL 或 AX 中,而输出指令 OUT 用于把累加器 AL 或 AX 的内容写到 I/O 端口,即从 CPU 方面看,只有累加器 AL 或 AX 才能与 I/O 端口进行数据传送,所以输入输出指令又称累加器专用传送指令。

    格式:

    • 输入指令:IN  Acc,Port
    • 输出指令:OUT  Port,Acc

    Port 为端口地址,Acc 为累加器 AL 或 AX 。

    注意:若端口号为 0 ~ 0FFH,那么我们可以直接使用端口号;否则,需要把端口号送入 DX,以 DX 内容去访问端口。

    根据端口地址码的长度,指令具有两种不同的寻址方式。

    ① 直接寻址:端口地址为 8 位时,指令中直接给出 8 位端口地址;可寻址256个端口。

    ② 间接寻址:端口地址为 16 位时,指令中的端口地址必须由 DX 指定;可寻址 64K 个端口。

    应用举例:

    3. LEA 取偏移地址指令

    格式:LEA  Reg16,Mem

    LOAD EA,这里的 EA 指偏移地址。

    效果:LEA 指令将存储器操作数的 16 位偏移地址送到指定的通用寄存器。

    对操作数的要求:

    • 源操作数必须是存储器操作数;
    • 目的操作数必须是 16 位通用寄存器,而且最好是 间址寄存器

    间址寄存器:BX、BP、SI、DI 。

    应用举例:

    4. 其它传送类指令

    (1)LDS 和 LES 装入地址指针指令

    格式:

    • LDS  Reg16,Mem32
    • LES  Reg16,Mem32

    要求:Reg16 是任意一个 16 位通用寄存器,Mem32 必须是一个存储器操作数。

    作用:低字单元内容为偏移量送入通用寄存器,高字单元内容为段基址送入 DS 或 ES。即把 Mem32 存储单元开始的 4 个字节单元的内容送入通用寄存器 Reg16 和段寄存器 DS(LDS指令)或 ES(LES指令)。

    (2)标志传送指令

    ① LAHF:将 FLAGS 低 8 位的内容装入 AH 。

    ② SAHF:将 AH 的内容送给 FLAGS 的低 8 位。

    ③ PUSHF:将 FLAGS 的内容压栈保存。

    ④ POPF:将当前的栈顶内容送给 FLAGS 。

    LAHF = Load AH FLAGS、SAHF = Save AH FLAGS

  • 相关阅读:
    短视频背后的商业机遇:TikTok值得投资吗?
    DECIMAL 数据处理原理浅析
    NOMA学习
    .some方法、vh、多列布局、DNS域名解析过程、空页面文字内容渲染
    如何理解vue声明式渲染
    关于深度学习一些疑惑的总结
    几个Web自动化测试框架的比较:Cypress、Selenium和Playwright
    C# 系统学习(异步编程)
    SpringBoot自动装配原理
    【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
  • 原文地址:https://blog.csdn.net/m0_64140451/article/details/127973765