微型计算机原理与接口技术——8086指令系统之数据传送指令

前言

本篇文章正式进入汇编语言,下面是要用到的一些符号:

  • OPRD:泛指各种类型的操作数
  • mem:存储器操作数
  • acc:累加器操作数
  • dest:目标操作数
  • src:源操作数
  • disp:8位或16位偏移量,可用符号地址表示
  • DATA:8位或16位立即数
  • port:输入输出端口,可用数字或表达式表示
  • [ ]:表示存储器操作数,方括号中的内容表示数据的偏移地址

数据传送指令是实际程序中使用最为频繁的一类指令,因为无论什么样的程序都需要将原始数据、中间运算结果、最终结果及其他信息在CPU的寄存器和存储器之间进行传送。

绝大多数数据传送指令都不会对状态寄存器FLAGS产生影响。

数据传送指令按功能可分为四小类:

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

1.通用数据传送指令

通用数据传送指令包括一般传送指令MOV、堆栈操作指令PUSH和POP、交换指令XCHG、查表转换指令XLAT和字位拓展指令。

该类指令的执行对标志位不产生影响

一般传送指令MOV

指令格式

MOV dest,src

  • 两操作数字长必须相同;
  • 两操作数不允许同时为存储器操作数;
  • 两操作数不允许同时为段寄存器;
  • 在源操作数是立即数时,目标操作数不能是段寄存器;

指令功能

这里的dest表示目标操作数,src表示源操作数。

指令的功能是将一个操作数从源地址传送到目标地址,而源地址中的数据保持不变。

也就是说,MOV指令实际上是完成了一次数据的复制。

MOV指令可实现以下各种传送

微型计算机原理与接口技术——8086指令系统之数据传送指令
注:

  • reg:寄存器
  • mem:存储器
  • sreg :段寄存器
  • data :8或16立即数

堆栈操作指令PUSH和POP

堆栈是内存中一个特定的区域,用以存放寄存器或存储器中暂时不用又必须保存的数据。
微型计算机原理与接口技术——8086指令系统之数据传送指令

在程序中,堆栈主要应用于子程序调用、中断响应等操作时的参数保护,也可用于实现参数传递。

压栈指令 PUSH

指令格式

格式: PUSH src

执行过程

在压入操作数之前,堆栈指针SP先减2:
微型计算机原理与接口技术——8086指令系统之数据传送指令
微型计算机原理与接口技术——8086指令系统之数据传送指令

出栈指令 POP

指令格式

格式: POP dest

执行过程

微型计算机原理与接口技术——8086指令系统之数据传送指令
微型计算机原理与接口技术——8086指令系统之数据传送指令

交换指令XCHG

指令格式

XCHG OPRD1,OPRD2

需要注意的是:

  • 操作数可以是寄存器数或存储器数(但不能同时是存储器数,即必须有一个是寄存器数)
  • 不允许使用段寄存器
  • 两个操作数字长必须相同,可以字节/字交换

指令功能

交换指令的操作是将源地址与目标地址中的内容进行互换,即将源操作数送到目标操作数,同时将目标操作数传送到源操作数。

查表转换指令 XLAT

XLAT是一条字节的查表转换指令,可用根据表中元素的序号查出表中相应元素的内容

指令格式

XLAT ;AL <~ [BX+AL]

指令功能

将BX+AL所指单元的内容送AL(1个字节)

微型计算机原理与接口技术——8086指令系统之数据传送指令

微型计算机原理与接口技术——8086指令系统之数据传送指令

2.输入输出指令

输入输出(I/O)指令是专门面向输入输出端口进行读写的指令,共有两条,分别是IN和OUT。

指令格式

微型计算机原理与接口技术——8086指令系统之数据传送指令

指令寻址方式

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

直接寻址

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

间接寻址

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

3.取偏移地址指令

指令格式

LEA REG,MEM

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

指令功能

将存储器操作数的16位偏移地址取出送目标寄存器

当程序中用符号地址表示内存偏移地址时,须使用该指令。

LEA与MOV的对比

微型计算机原理与接口技术——8086指令系统之数据传送指令

4.其他传送指令

字节到字的扩展指令

指令格式

CBW

指令操作

将AL内容扩展到AX

指令规则

  • 若AL最高位=1,则执行后AH=FFH
  • 若AL最高位=0,则执行后AH=00H

字到双字的扩展指令

指令格式

CWD

指令操作

将AX内容扩展到DX AX

指令规则

  • 若AX最高位=1,则执行后DX=FFFFH
  • 若AX最高位=0,则执行后DX=0000H

取远地址指针指令

LDS

指令格式

LDS reg,MEM32

指令功能

将内存中连续4个字节内容送到DS和寄存器reg中。

微型计算机原理与接口技术——8086指令系统之数据传送指令

LES

指令格式

LES reg,MEM32

指令功能

将内存中连续4个字节内容送到ES和寄存器reg中。

微型计算机原理与接口技术——8086指令系统之数据传送指令

标志位操作指令

微型计算机原理与接口技术——8086指令系统之数据传送指令

LAHF,SAHF

微型计算机原理与接口技术——8086指令系统之数据传送指令

PUSHF,POPF

针对FLAGS的堆栈操作指令

将标志寄存器压栈或从堆栈弹出

总结与升华

微型计算机原理与接口技术——8086指令系统之数据传送指令

微型计算机原理与接口技术——8086指令系统之数据传送指令