数据传输指令
用于在寄存器、存储器和输入输出端口之间传送数据或地址,可分为通用数据传送指令、累加器专用传送指令、地址传送指令和标志传送指令。
通用数据传送指令:
传送指令 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 不同之处在于,弹出的栈顶元素进入标志寄存器中。
[^]: 注:本篇中所有配图均来自《汇编语言程序设计实用教程》–任向民 ,如有侵权,请联系作者删除!