8086指令系统之数据传送指令

  • ​​前言​​
  • ​​1.通用数据传送指令​​
  • ​​一般传送指令MOV​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​MOV指令可实现以下各种传送​​
  • ​​堆栈操作指令PUSH和POP​​
  • ​​压栈指令 PUSH​​
  • ​​指令格式​​
  • ​​执行过程​​
  • ​​出栈指令 POP​​
  • ​​指令格式​​
  • ​​执行过程​​
  • ​​交换指令XCHG​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​查表转换指令 XLAT​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​2.输入输出指令​​
  • ​​指令格式​​
  • ​​指令寻址方式​​
  • ​​直接寻址​​
  • ​​间接寻址​​
  • ​​3.取偏移地址指令​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​LEA与MOV的对比​​
  • ​​4.其他传送指令​​
  • ​​字节到字的扩展指令​​
  • ​​指令格式​​
  • ​​指令操作​​
  • ​​指令规则​​
  • ​​字到双字的扩展指令​​
  • ​​指令格式​​
  • ​​指令操作​​
  • ​​指令规则​​
  • ​​取远地址指针指令​​
  • ​​LDS​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​LES​​
  • ​​指令格式​​
  • ​​指令功能​​
  • ​​标志位操作指令​​
  • ​​LAHF,SAHF​​
  • ​​PUSHF,POPF​​
  • ​​总结与升华​​

前言

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

  • 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指令系统之数据传送指令_指令_02

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

压栈指令 PUSH

指令格式

格式: PUSH src

执行过程

在压入操作数之前,堆栈指针SP先减2:

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


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

出栈指令 POP

指令格式

格式: POP dest

执行过程

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


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

交换指令XCHG

指令格式

XCHG OPRD1,OPRD2

需要注意的是:

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

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

查表转换指令 XLAT

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

指令格式

XLAT ;AL <~ [BX+AL]

指令功能

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

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

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

2.输入输出指令

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

指令格式

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

指令寻址方式

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

直接寻址

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

间接寻址

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

3.取偏移地址指令

指令格式

LEA REG,MEM

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

指令功能

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

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

LEA与MOV的对比

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

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指令系统之数据传送指令_数据传送_11

LES

指令格式

LES reg,MEM32

指令功能

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

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

标志位操作指令

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

LAHF,SAHF

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

PUSHF,POPF

针对FLAGS的堆栈操作指令

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

总结与升华

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

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