数据传送指令
如表
1.通用数据传送指令
1)数据传送指令 MOV(MOVement)
指令格式及操作:
MOV dst,src
在MOV指令中,源操作数可以是存储器、寄存器、段寄存器和立即数;目的操作数可以是存储器、寄存器(不能是IP)、段寄存器(不能为CS)。
必须注意,不能用一条MOV指令实现一下传送:
①存储单元之间传送
②立即数至段寄存器之间的传送
③段寄存器之间的传送
需要说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中内容。但是CS可以作为源操作数。
举例 1
- 源程序
mov.asm
data segment
x db 1,2,3,4,5,6,7,8,9,10
data ends
code segment
assume cs:code,ds:data
start:
;mov ds,data ; 1 error A2056: Immediate mode illegal
mov ax,data
mov ds,ax
;mov al,278 ; 2 error A2050: Value out of range
;mov ax,bl ; 3 warning A4031: Operand types must match
lea bx,x
;mov [bx],[bx+2] ;4 error A2052:Improper operand type
mov al,[bx+2]
mov [bx],al
;mov [bx],10h ;5 error A2035: Operand must have size
mov [bx],byte ptr 10h
mov al,10h
mov [bx],al
mov ah,4ch
int 21h
code ends
end start
- 分析
1 不能用一条MOV指令实现:
②立即数至段寄存器之间的传送,
可以修改为下两行语句
操作之后:实现ds(=075A) <- data(=076A)
2 立即数超出上限
3 操作数类型不匹配 word <- byte
4.不能用一条MOV指令实现:
①存储单元之间传送
可以修改为下两行语句
操作之后:实现[bx](=1) <- [bx+2](=3)
5.操作数必须有类型 word / byte
可以修改为下一行语句
或者修改为后两行行语句
操作之后:实现[bx](=3) <- (al=)10
举例 2
2)堆栈操作指令
(1)压入堆栈指令 PUSH(PUSH word onto stack)
指令格式及操作:
PUSH src
(2)弹出堆栈指令 POP (POP word off stack)
指令格式及操作:
POP dst
3)数据交换指令 XCHG (eXCanGE)
指令格式及操作:
XCHG dst,src
4)字节转换指令 XLAT (transLATe)
指令格式及操作:
XLAT src_table
2.输入/输出指令
1)输入指令 IN (INput byte or word)
(1) 直接寻址的输入指令
指令格式及操作:
IN acc,port
(2)间接寻址的输入指令
指令格式及操作:
IN acc,DX
2)输出指令 OUT (OUTput byte or word)
(1) 直接寻址的输出指令
指令格式及操作:
OUT acc,port
(2)间接寻址的输出指令
指令格式及操作:
OUT acc,DX
3.目标地址传送指令
1)取有效地址指令 LEA(Load Effective Address)
指令格式及操作:
LEA reg16,mem
LEA指今将一个近地址指针写入到指定的寄存器。指令中的目的操作数必须是一个16位通用寄存器,源操作数必须是一个存储器操作数,指令的执行结果是把源操作数的有效地址,即16位偏移地址传送到目标寄存器。例如:
LEA BX, BUFFER ;(BX)-OFFSETBUFFER
LEA AX, [BP][DI] ;(AX)-(BP)+(DI)
LEA DX, BETA[BX][SI]; (DX)-(BX)+(SI)+BETA
注意LEA指令与MOV指令的区别,比较下面两条指令:
EA BX, BUFFER
MOV BX, BUFFER
前者将存储器变量BUFFER的偏移地址送到BX,而后者将存储器变量BUFFER的内容(两个字节)传送到BX。
当然也可以用MOV指令来得到存储器的偏移地址,例如以下两条指令的效果相同:
LEA BX, BUFFER
MOV BX, OFFSET BUFFER
其中,OFFSET BUFFER表示存储器变量BUFFER的偏移地址。
2)地址指针装入DS指令 LDS (Load pointer into DS)
指令格式及操作:
LDS reg16,mem32
2)地址指针装入ES指令 LDS (Load pointer into ES)
指令格式及操作:
LES reg16,mem32
4.标志传送指令
1)取标志指令 LAHF(Load AH from Flags)
指令格式及操作:
LAHF
2)置标志指令 SAHF(Store AH intoFlags)
指令格式及操作:
SAHF
3)标志压入堆栈指令 PUSHF(PUSH Flags onto stack)
指令格式及操作:
PUSHF
4)标志弹出堆栈指令 POPF(POP Flags off stack)
指令格式及操作:
POPF