通用数据处理指令——数据传送类指令
文章目录
- 数据传送
►把数据从一个位置传送到另一个位置
►计算机中最基本的操作
►程序设计中最常使用的指令- 除标志寄存器传送指令外,均不影响状态标志
一、MOV指令
把一个字节、字或双字的操作数从源位置传送至目的位置。
MOV reg/mem,imm
MOV reg/mem/seg,reg
MOV reg/seg,mem
MOV r16/m16,seg
1.数据长度
-
8位(字节)数据,byte类型
mov al,200
-
16位(字)数据,word类型
mov ax,[ebx]
-
32位(双字)数据,dword类型
mov eax,dvar
2.传送方式
立即数传送:
MOV reg/mem,imm
-
寄存器reg为目的操作数
mov al,200
;8位立即数i8
mov ax,200
;16位立即数i16
mov eax,200
;32位立即数i32
寄存器传送:
MOV reg/mem/seg,reg
-
寄存器reg为目的操作数
mov al,ah
;8位通用寄存器r8
mov ax,bx
;16位通用寄存器r16
mov eax,edx
;32位通用寄存器r32
-
存储器mem为目的操作数
mov bvar,cl
;8位通用寄存器r8
mov [ebx],cx
;16位通用寄存器r16
mov [esi+8],edi
;32位通用寄存器r32
-
段寄存器seg为目的操作数
mov ds,bx
存储器传送:
MOV reg/seg,mem
-
寄存器reg为目的操作数
mov dl,bvar
;8位储存器m8
mov dx,[ebx]
;16位存储器m16
mov edx,dvar[edi]
;32位存储器m32
-
段寄存器seg为目的操作数
mov ds,wvar
;16位存储器m16
mov es,[ebx]
;16位存储器m16
mov ss,[ebp+8]
;16位存储器m16
(16位)段寄存器传送:
MOV r16/m16,seg
-
寄存器r16为目的操作数
mov ax,ds mov dx,es mov si,fs mov di,gs
-
存储器m16为目的操作数
mov wvar,ds mov [ebx],ss mov [esi-8],cs mov [ebp+8],cs
3.常见错误
-
注意1:双操作数必须类型一致
MOV ESI,DL
;错误:类型不一致
;ESI为32位寄存器,DL为8位寄存器mov esi,edx
;正确:两个32位寄存器传送
MOV AL,050AH
;错误:类型不一致
;050AH超过了寄存器AL范围mov eax,050ah
;正确:双字量数据传送
-
注意2:操作数必须有明确的类型
MOV [EBX+4],200
;错误:无明确类型
mov byte ptr [ebx+4],200
;正确:BYTE PTR说明是字节操作
mov wvar[esi],200
;正确:字变量WVAR说明是字操作
mov dvar[edi*4],200
;正确:双字变量DVAR说明是双字操作
无变量名的寄存器相对和变址寻址无明确类型
-
注意3:双操作数不允许都是主存单元
MOV DBUF2,DBUF1
;假设dbuf1和dbuf2是两个双字变量
;错误:两个操作数都是存储单元mov eax,dbuf1
;正确:EAX=DBUF1(将DBUF1内容送EAX)
mov dbuf2,eax
;正确:DBUF2=EAX(将EAX内容送DBUF2)
-
注意4:不可随意操作专用寄存器
MOV DS,@DATA
;错误:立即数不能直接传送段寄存器
(@DATA是数据段地址)mov ax,@data
;正确:立即数传送给AX
mov ds,ax
;正确:通过AX间接传送给DS
MOV EIP,EAX
;错误:没有显式操作指令指针寄存器EIP的指令
二、XCHG指令
将源操作数和目的操作数内容交换
XCHG reg,reg/mem
XCHG reg/mem,reg
►通用寄存器与通用寄存器之间
►通用寄存器或存储器之间
1.数据长度
32位数据交换
xchg esi,edi
xchg esi,[edi]
16位数据交换
xchg si,di
xchg si,[edi]
8位数据交换
xchg bl,bh
xchg al,bvar
2.空操作指令NOP(no-operation)
空操作指令是一条不做实质操作的指令(交换指令的一个特例)
NOP = XCHG EAX, EAX
一个字节的指令代码;90H
- 处理器执行需要化费时间,占用一个字节存储空间
- 所以,具有实际意义:
►实现短时间延时
►临时占用代码空间
三、LEA指令
地址传送指令获取存储器操作数的地址
LEA r16/r32,mem
- r16/r32←mem的有效地址EA(不需类型一致)
- IA-32使用32位地址,保存于32位通用寄存器r32
1.LEA与OFFSET的作用
-
LEA指令在指令执行时计算出偏移地址
►OFFSET操作符在汇编阶段取得变量的偏移地址lea edi, var
-
OFFSET无需在执行时计算、指令执行速度更快
►LEA指令能获取汇编阶段无法确定的偏移地址mov edi, offset var
2.地址传送程序
mov eax,dvar
lea esi,dvar
mov ebx,[esi]
mov edi,offset dvar
mov ecx,[edi]
3.用LEA指令实现运算功能
lea edx,[esi+edi*4+100h]
EDX=ESI+EDI×4+100H
- LEA指令在计算地址时,可进行加和移位操作
►编译器将其用于实现加法,或者乘以2、4和8 - 不能用OFFSET操作符实现
mov edx, offset [esi+edi*4+100h];错误