汇编语言通用数据处理指令——数据传送类指令

Posted BkbK-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言通用数据处理指令——数据传送类指令相关的知识,希望对你有一定的参考价值。

通用数据处理指令——数据传送类指令

文章目录

  • 数据传送
    ►把数据从一个位置传送到另一个位置
    ►计算机中最基本的操作
    ►程序设计中最常使用的指令
  • 除标志寄存器传送指令外,均不影响状态标志

一、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];错误

以上是关于汇编语言通用数据处理指令——数据传送类指令的主要内容,如果未能解决你的问题,请参考以下文章

汇编--指令系统 数据传送类指令

汇编语言通用数据处理指令——堆栈传送指令

汇编语言通用数据处理指令——堆栈传送指令

数据传送类指令(微机原理笔记)

x86汇编指令详解

汇编指令