数据传送指令负责把数据、地址或立即数传送到寄存器、存储器或端口号寄存器。它相对高级语言里的赋值语句。
通用数据传送:MOV、XCHG、PUSH、POP
累加器专用传送(输入输出):IN、OUT、XLAT
地址传送:LEA、LDS、LES
标志寄存器传送:LAHF、SAHF、PUSHF、POPF
把源操作数(第二操作数)的值传给目的操作数(第一操作数)该操作数的寻址方式可以是任意一种存储单元寻址方式
格式:MOV Reg/Mem,Reg/Mem/Imm
MOV BL,AX
、MOV AX,BL
等都是不正确的;MOV ES,DS
等;MOV CS, AX
等不正确,但指令MOV AX,CS
等是正确的;MOV DS,100H
等;MOV 100H,AX
等;MOV VARA,VARB
等,其中VARA和VARB是同数据类型的内存变量可以将一个字节或一个字的源操作数与目的操作数相交换。交换能在通用寄存器之间、通用寄存器与存储器之间进行。但段寄存器和立即数不能作为一个操作数。
格式:XCHG OPD,OPS
eg:
(AL)=2AH,(DS)=1000H, (1204DH)=5BH,指令XCHG AL,[204DH]
执行后,(AL)=5BH,(AL)=2AH
将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2(栈向低地址增长,且由于小端对齐,先高8位数据进栈,然后低8位数据进栈)
格式:PUSH Reg/Mem/Seg
将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。 (先低8位数据出栈,然后高8位数据出栈 )
格式:POP Reg/Mem/Seg
过程逆向PUSH即可
- PUSHA:16位通用寄存器依次进栈,次序为AX、CX、DX、BX(不是ABCD!!),指令执行前的SP、BP、SI、DI。
指令执行后(SP)-16→(SP),SP仍指向栈顶。- POPA:16位通用寄存器依次出栈,次序为DI、SI、BP、SP,指令执行前的BX、DX、CX、AX。
指令执行后(SP)+16→(SP) ,SP仍指向栈顶
格式:PUSHA
/POPA
SP出栈只是修改了指针,使其后的BX能够出栈,而堆栈中原先由PUSHA指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中。
仅限于使用累加器AX或AL传送信息
输入指令用来从指定的外设寄存器取信息送入累加器
Func:从端口中读入一个字节或字(取决于寄存器),并保存在寄存器AL或AX中。如果某输入设备的端口地址在0~255范围之内,那么,可在指令IN中直接给出,否则,要把该端口地址先存入寄存器DX中,然后在指令中由DX来给出其端口地址。
格式:
IN AL, PORT
(字节)/IN AX, PORT
(字)IN AL, DX
(字节)/IN AX, DX
(字)eg:
如IN DX,2F8H
不可,需要先MOV DX,2F8H
再 进行IN指令
IN AL,DX
;从端口2F8H读入一个字节到AL中IN AX,DX
;把端口2F8H、2F9H按“高高低低”组成把累加器的内容送往指定的外设存储器
将寄存器AL或AX的内容输出到指定端口。如果某输出设备的端口地址在0~255范围之内,那么,可在指令OUT中直接给出,否则,要把该端口地址先存入寄存器DX中,然后在指令中由DX来给出其端口地址。
类似IN指令
所有I/O端口与CPU之间的通信都由IN和OUT指令来完成。外部设备最多有65536个I/O端口,端口号为0000~0FFFFH。
XLAT指令有两个隐含操作数BX和AL
Function:把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。
格式:XLAT OPR
或 XLAT
eg:
若(BX)=0040H
MOV AL,3
XLAT
则指令执行后AL的值为33H
tips:可用来查表或访问数组,但表和数组的长度不能超过256.
Function: 将源操作数的有效地址送到指定的寄存器中。
格式:LEA REG,OPS
tips:
LDS_Function:
- 完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址(EA+2)送入DS,偏移量部分(EA)送入一个16位的基址寄存器或变址寄存器。
LES_Function:
- 将地址指针的段地址部分送入ES外,与LDS类似
格式为: LDS/LES REG,OPS
tips:
LAHF
;操作:(AH)<—(FLAGS的低字节)SAHF
;操作: (FLAGS的低字节)<—(AH)PUSHF
;操作: (SP)<—(SP) - 2、((SP)+1, (SP))<—(FLAGS)POPF
;操作: (FLAGS)<—((SP)+1,(SP))、(SP)<—(SP)+ 2该组指令的操作数可以是8位、16位。当存储单元是该类指令的操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。
ADD_Function: 将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变
ADC_Function:将目的操作数加源操作数再加低位进位,结果送目的地址
INC_Function:将目的操作数加1,结果送目的地址(INC指令不影响CF标志)
格式:
ADD DST,SRC
ADC DST,SRC
INC OPR
SUB_Function:目的操作数减去源操作数,结果存于目的地址,源地址的内容不变
SBB_Function:目的操作数减源操作数再减低位借位CF,结果送目的地址
DEC_Function:将目的操作数减1,结果送目的地址(不影响CF标志)
NEG_Function:将目的操作数的每一位取反(包括符号位)后加1,结果送目的地址。(允许存储器或寄存器操作数,不允许段寄存器)
CMP_Function:目的操作数减源操作数,结果只影响标志位,不送入目的地址。
格式:
SUB DST,SRC
SBB DST,SRC
DEC OPR
NEG OPR
CMP OPR1, OPR2
tips:
对于字节操作时,数据-128和字操作时数据-32768的情况,求补后不变,OF=1
Function: 若是字节数据相乘,(AL寄存器)与SRC相乘得到字数据存入AX中;若是字数据相乘,则(AX)与SRC相乘得到双字数据,高字存入DX、低字存入AX中。SRC不允许是立即数
格式:
MUL SRC
IMUL SRC
tip:对OF和CF标志的影响:
寄存器使用与乘法相同
格式:
DIV SRC
IDIV SRC
tips:
CBW
AL -> AXCWD
AX -> (DX,AX)DAA
DAS
加法的非压缩的BCD调整指令AAA
格式:AAA
减法的非压缩的BCD调整指令AAS
格式:AAS