数据传输指令

用于在寄存器、存储器和输入输出端口之间传送数据或地址,可分为通用数据传送指令、累加器专用传送指令、地址传送指令和标志传送指令。

通用数据传送指令:

传送指令 MOV

格式:MOV 目的操作数,源操作数

功能:将源操作数存入目的地址中,执行后,源操作数不变。对标志位无影响。

应注意:源操作数和目的操作数的数据类型必须一致。立即数和 CS (代码段寄存器)不能作为目的操作数,不能将立即数直接送到段寄存器;两个存储器之间不能直接进行数据传送;两个段寄存器之间也不能直接进行数据传送。

MOV 指令的传送方向示意图:

根据对传送方向的规定,MOV 指令有以下几种使用形式:

1.)将立即数传送到通用寄存器或存储单元

MOV 指令可以实现立即数到通用寄存器或存储单元的传送,源操作数为8位或16位的立即数,立即数的类型必须与寄存器字长或存储单元类型一致,8位立即数可以送入8位或16位寄存器,16位只能送入16位的寄存器或存储单元。

eg:

MOV CL,4BH ;将8 位立即数 4BH 送入通用寄存器 CL

MOV DI,COUNT ;COUNT 为符号常数,将其值传送到通用寄存器 DI

MOV DI,2008 ;将十进制数 2008 传送到 DS 段 DI 内容所指地址的字单元

MOV ES:[100H],'B' ;将字符 B 的 ASCII 码传送到 ES 段偏移 100H 的字节单元

2.)寄存器之间的数据传送

MOV 指令可以实现寄存器之间的数据传送,注意两个寄存器的数据类型必须一致,即两个寄存器应同为8位或16位寄存器。

eg:

MOV CL,DL ;将8位通用寄存器 DL 的内容传送到8位通用寄存器 CH

MOV DI,BX ;将16位通用寄存器 BX 的内容传送到 16 位通用寄存器 DI

MOV DS,AX ;将16位通用寄存器 AX 的内容传到数据段寄存器 DS

3.)寄存器与存储单元之间的数据传送

MOV 指令可以实现寄存器到存储单元的数据传送,也可以实现存储单元到寄存器的数据传送。操作数类型必须一致。

eg:

MOV [200H],DX ;将 DX 中的内容传送到 DS 段偏移 200H 的字单元

MOV AL,VAR ;将符号地址 VAR 所指的字符单元内容传到 AL

MOV [SI],DS ;将 DS 的内容传送到 SI 所指的字单元

MOV ES,DX ;将 BX 所指的存储单元的内容传送到 ES

堆栈操作指令:

堆栈是在存储器中开辟的一个特殊区域,遵循“后进先出”的存取原则,段基地址存放在堆栈段寄存器 SS 中。堆栈操作只能在栈顶进行,堆栈的操作有进栈和出栈两种。

1.)进栈指令 PUSH

格式:PUSH 源操作数

功能:修改堆栈指针 SP ,然后将源操作数压入栈顶单元。

说明:源操作数可以是寄存器操作数、段寄存器操作数或存储器操作数。长度必须是16位。

2.)出栈指令 POP

格式:POP 目的操作数

功能:将栈顶单元的内容弹出到目的地址中,然后修改堆栈指针 SP。

说明:目的操作数可以是通用寄存器操作数、除 CS 以外的段寄存器操作数或字类型的存储器操作数,长度必须为16位。

3.)交换指令 XCHG

格式:XCHG 目的操作数,源操作数

功能:将源操作数和目的操作数互换。

累计器专用传送指令

1.)XTAT 换码指令

一般用来实现码制之间的转换,又称查表转换指令。

格式:XTAT

功能:将累加器 AL 中的一个值转换为内存表格中的一个值,再传送到累加器 AL 中。

eg:

MOV BX, 4C02H

MOV AL,08H

XTAT

指令执行时,先计算 BX+ AL ,得到有效地址 4C0AH ,在将 4C0AH 所指的字节单元中的数据送入 AL 寄存器。

2.)输入输出指令

专门用于在输入输出端口和累加器之间进行数据传送的指令。

(1.)输入指令 IN

短格式:IN AL/AX ,PORT

长格式:IN AL/AX,DX

功能:从无符号数 PORT 或 DX 寄存器所指的端口输入一个字节数据到累加器 AL 中,或输入一个字数据到累加器 AX 中。

说明:可以用一个无符号数 PORT 直接给出外设端口地址,取值为 0-FFH ,也可以用 DX 寄存器间接给出外设端口地址,取值 0-FFFFH。

eg:

IN AL,60H ;将 60H 端口中的数据读到 AL 中

IN AX,60H ;将 60H 端口中的数据读到 AX 中

MOV DX,3FFH ;将端口地址寄存到 DX 中

IN AL,DX ;将 DX 所指定的端口中的数据读到 AL 中

IN AX,DX ;将 DX 所指定的端口中的数据读到 AL 中,将 (DX)+1 所指定的端口中内容数据读到 AH 中。

(2.)输出指令 OUT

短格式:OUT PORT ,AL/AX

长格式:OUT DX,AL/AX

功能:实现输出,其数据传送方向与 IN 指令相反。

地址传送指令

地址传送指令实现操作数地址信息的传送。

1.)有效地址送寄存器指令 LEA

格式:LEA 通用寄存器,源操作数

功能:将源操作数的偏移地址送入通用寄存器。

说明:指令中的目的操作数只能使用 16 位通用寄存器,不能使用段寄存器,源操作数只能是存储器操作数。

eg:

MOV BX,0200H

MOV SI,3000H

LEA BP.[BX+SI+6] ;将源操作数的有效地址 3206H 送到 BP 寄存器中

2.)指针送寄存器和 DS 指令 LDS

格式:LDS 通用寄存器,源操作数

功能:将源操作数指示的双字节内容送入通用寄存器和 DS ,低两字节内容送到通用寄存器,高两字节内容送入 DS。

说明:指令中的目的操作数只能使用 16 位通用寄存器,不能使用段寄存器,源操作数只能是存储器操作数。

eg:

LDS BX,[100H]

3.)指针送寄存器和 ES 指令 LES

LES 和 LDS 的区别在于,传送地址时将高地址两字节送入 ES ,而不是 DS。

标志传送指令

标志传送指令专门用于对标志寄存器进行操作。 LAHF 和 SAHF 只对标志寄存器的低8位进行操作,而 PUSHF 和 POPF 对整个标志寄存器进行操作。

1.)取标志指令 LAHF

格式:LAHF

功能:将标志寄存器的低8位传送到累加器 AH。

标准寄存器中低8位中有五个状态标志位,LAHF 指令将这些标志位传送到 AH 中的对应位。

2.)置标志指令 SAHF

格式:SAHF

功能:将累加器 AH 中的内容送到标志寄存器的低8位。影响低8位中的五种状态标志位。

3.)标志进栈/出栈指令 PUSHF/POPF

格式:PUSHF

格式:POPF

功能:与 PUSH 不同之处在于,压入堆栈的是标志寄存器的内容;与 POP 不同之处在于,弹出的栈顶元素进入标志寄存器中。


[^]: 注:本篇中所有配图均来自《汇编语言程序设计实用教程》–任向民 ,如有侵权,请联系作者删除!