汇编-数据传送类指令

数据传送类指令

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

标志传送指令外,其他指令的执行对标志位不产生影响

通用数据传送指令

  • 一般数据传送指令

    • 使用 \(MOV\) 的注意事项
      1. 两个操作数的字长必须相同
      2. 两个操作数不允许同时为存储器操作数
      3. 两个操作数不能同时为段寄存器
      4. 在源操作数是立即数的时候 ,目标操作数不能是段寄存器
      5. \(IP\)\(CS\) 不作为目标操作数, \(FLAGS\) 一般也不作为操作数在指令中出现

    \(MOV \ [BX][BP] , BX\) 是 错误的, 目标操作数两个都是基址,应为\([基址][变址]\)

  • 堆栈操作指令 \(PUSH\) \(POP\) 操作数必须是 16位 的 通用寄存器 和 存储器均可,存储器需要声明字长

  • 交换指令 \(XCHG\) 操作数至少有一个是寄存器,如果是存储器操作数 必须声明字长

  • 查表转换指令 \(XLAT\)

  • 字位扩展指令

    1. 将符号数的符号位扩展到高位
    2. 指令为零操作数指令,采用隐含寻址,隐含的操作数为 \(AX\)\(AX, DX\)
    3. 无符号数的扩展规则为在高位补零
    • \(CBW\)
      • \(AL\) 的内容扩展到 \(AX\) 若最高位为 \(1\) 则执行后 \(AH = FFH\) 若最高位为 \(0\), 则执行后 \(AH = 00H\)
    • \(CWD\)
      • \(AX\) 的内容扩展到 \(DX \ AX\) 若最高位为 \(1\) 则执行后 \(DX = FFFFH\) 若最高位为 \(0\), 则执行后 \(DX = 0000H\)

该类所有指令的执行都不影响标志位

输入输出指令

I/O端口:

I/O 接口中用于存储数据、可以直接被CPU访问的寄存器

计算机输入输出系统中可以包含若干接口控制电路(芯片),每个接口都包含了一个或者多个端口

输入输出指令

专门面向 I/O 端口操作的指令

端口地址在指令中的表示方式 寻址方式

指令功能: 从端口地址读入数据到累加器/将累加器的值输出到端口中

指令格式:

  1. 输入指令: \(IN \ acc, PORT\)\(PORT\)是端口地址, \(acc\)\(AL / AX\)
  2. 输出指令: \(OUT \ PORT, acc\)

指令寻址方式

  • 根据端口地址码的长度,指令具有两种不同的端口地址表现形式

  • 直接寻址

    • 端口地址为 8位 时,指令中直接给出 8位 端口地址
    • 寻址 256个 端口
  • 间接寻址

    • 端口地址为 16位 指令中的端口地址必须由DX 指定
    • 可寻址 64K 个端口

地址传送指令

  • 取偏移地址指令 \(LEA\) 取近地址指针
  • \(*LDS\) 指令 取远地址指针
  • \(*LES\) 指令 取远地址指针

LEA

操作

将变量的 16位 偏移地址写入到目标寄存器

当程序中用符号标志内存偏移地址的时,须使用该指令

格式

\(LEA \ REG,MEM\)

指令要求

源操作数 必须是一个 存储器操作数,目标操作数通常是间址寄存器

LDS LES指令

LDS 和 LES 均用于将一个 32位的远地址指针写入到目标寄存器

LDS 的一般格式

LDS 通用寄存器,存储操作数

将源操作数的偏移地址送到目标寄存器,将源操作数的段地址送到 ES

因此这个存储器操作数事实上是一个 32位 的操作数

LES 的一般格式

LES 通用寄存器,存储操作数

将源操作数的偏移地址送到目标寄存器,将原操作数的段地址送到 ES

标志传送指令

LAHF SAHF

隐含操作数 \(AH\)

LAHF :\(FLAGS\) 的低八位装入 \(AH\)

SAHF :\(AH\) 的内容写入 \(FLAGS\) 的低八位

PUSHF POPF

隐含操作数 \(FLAGS\)

能够表示偏移地址的寄存器只有四个 \(BX \ BP \ SI \ DI\)

posted @ 2022-02-09 23:39  ccz9729  阅读(443)  评论(0编辑  收藏  举报