数据传送指令

前言

80x86指令寻址方式【微机原理】

数据传送指令

如表

1 数据传送指令【微机原理】_寄存器

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

1 数据传送指令【微机原理】_指令格式_02


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

1 数据传送指令【微机原理】_寄存器_03

2)置标志指令 SAHF(Store AH intoFlags)

指令格式及操作:

SAHF

1 数据传送指令【微机原理】_微机原理_04

3)标志压入堆栈指令 PUSHF(PUSH Flags onto stack)
指令格式及操作:
PUSHF
4)标志弹出堆栈指令 POPF(POP Flags off stack)
指令格式及操作:
POPF