汇编语言数据传送指令之通用数据传送类指令


  • 通用数据传送类指令

传送指令mov把一个字节、字或双字的操作数从源位置传送至目的位置,可实现立即数到通用寄存器或者是主存的传送,通用寄存器与通用寄存器,主存或段寄存器之间的传送,主存与段寄存器之间的传送,

  1. 1)Mov reg/mem,imm//立即数传送

寄存器以reg为目的操作数
Mov al,200;8位立即数i8
Mov ax,200;16位数据传送i16
Mov eax,200;32位立即数i32
存储器以mem为目的操作数
Mov bvar,byte ptr200;8位立即数i8,bvar是byte型数据的变量
Mov [ebx],word ptr 200;16位通用通用寄存器i16
Mov [esi+8],dword ptr 200;32位通用寄存器i32

  1. 2)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;位通用寄存器r8,bvar是byte型数据的变量

Mov [ebx],cx;16位通用寄存器r16
Mov [esi+8],edi;32位通用寄存器r32
段寄存器seg为目的操作数
Mov ds,bx;段寄存器是16位的,只能与16位通用寄存器r16进行数据传输

  1. 3)Mov reg/seg,mem//存储器传送

寄存器reg为目的操作数
Mov dl,bvar; 8位存储器m8,bvar是byte型数据的变量
Mov dx,[ebx]; 16位存储器m16
Mov edx,dvar[edi];32位存储器32
段寄存器seg为目的操作数
Mov ds,wvar;16位存储器m16,wvar是word型变量
Mov,es,[ebx];段寄存器是16位的,只能与16位存储器进行数据传输
Mov ss,[ebp+8];虽然寻址方式使用了32位存储器,但是访问的是16存储单元

  1. 4)Mov r16/m16,seg//段寄存器传送

寄存器r16为目的操作数
Mov ax,ds;mov dx,es;mov si,fs;mov di,gs;
存储器m16为目的操作数
Mov wvar,ds;wvar是word类型
Mov [ebx],ss;mov [esi+8],cs;mov[ebp+8],cs;
IA-32处理器能处理的数据类型:
8位数据byte类型mov al,200
16位数据word类型mov ax,[ebx]
32位数据dword类型mov eax,dvar

2 注意问题
2.1)IA-32指令系统可以对8位,16位,32位整数进行处理,但是双操作数指令的目的操作数与源操作数必须类型一致;

MOV ESI,DL;错误:类到不一致.ESI为32位寄存器,DL为8位寄存器
mov esi,edx;正确:两个32位寄存器传送
mov AL,050Ah;错误:类型不一致。 050AH超出了寄存器AL的范圈
mov eax,050ah;正确:双字量数据传送
2. 2) 寄存器名表达了其类型, 变量一经定义也具有类型属性, 但立即数和寄存器间接寻址的存储单元等却无明确的类型。
IA-32指令系统要求类型一致的两个操作数之一必须有明确类型,则要用PTR指明。

例如
MOV [EBX],255;错误:无明确类型
mov byte ptr[ebx],255;正确:BYTE PTR说明是字节操作
mov word ptr[ebx],255;正确:WORD PTR说明是字操作
mov dword ptr[ebx],255;正确:DWORD PTR说明是双字操作
另外, 无变量名的寄存器相对和变址寻址也无明确类型, 例如:
MOV [EBX+4],200;错误:无明确类型
mov byte ptr [ebx+4],200正:BYTEPTR说明是字节操作
mov wvar[esi],200:正确:字变量wVAR说明是字操作
mov dvar[edi* 4],200;正确:双字变量DVAR说明是双字操作
2. 3) 为了减小指令编码长度,IA-32指令系统没有设计两个存储器操作数的指令 (除串操作指令), 也就是不允许两个操作数都是存储单元

,例如:
假设DBUF1 和DBUF2 是两个双字变量
MOV DBUF2,DBUFI;错误: 两个操作数都是存储单元
mov eax,dbufl;正确:EAX=DBUF1(将DBUFl 内容送EAX)
mov dbuf2,eax;正确:DBUF2=EAX(将EAX内容送DBUF2)

    1. 能对专用寄存器进行操作的指令有限,功能不强, 使用时要注意

。 例如:
MOV DS,@DATA;错误:立即数不能直接传送段寄存器(@DATA是获得数据段地址)
mov ax,@data;
mov ds.ax ;正确:通过2X间接传送给DS

  • 3.交换指令XCHG

交换指令 XCHG (Exchange) 用来交换源操作数的和目的操作数的内容, 可以在通用寄存器与通用寄存器或存储器之间对换数据。使用操作数符号的合法格式如下:
XCHG reg,reg/mem
XCHG reg/mem,reg
交换指令的两个操作数实现位置互换,实际上既是源提作数也是目的操作数, 所以它们哪个在前哪个在后就无所谓了,但不能是立即数,也不支持存储器与存储器之间的数据对换。
与大多数指令一样, 交互指令XCHG 支持8,16和32位数据交换,例如:
32位数据交换。
xchg esi,edi;ESI 与EDI 互换内容
xchg esi,[edi];ESI与EDI指向的主存单元互换内容
16位数据交换。
xchg si,di;SI与DI互换内容
xchg si,[edi];SI与EDI指向的主存单元互换内容
.8位数据交换。
xchg bl,bh;BL与BH互换内容
xchg’al,bvar:AL与字节类型变量BVAR 互换内容
IA-32处理器采用小端方式存储多字节数据,但有些处理器却采用大端方式。当数据在不同处理器之间交换时, 有时需要进行小端, 大端的互换。
例如,双字变量DVAR进行小端、大端的互换可以使用交换指令:
mov al,byte ptr dvar ;取第1个字节
xchg al,byte ptr dvar+3 ;与第4 个字节交换
mov byte ptr dvar,al;实现低1,4个字节互换(也可以用MOV指令)
mov al,byte ptr dvar+1 ;同上,AL=第2个字节
xchg al,byte ptr dvar+2 ;与第3个字节交换,AL=第3个字节
mov al,byte ptr dvar+1 ;实现第2,3个字节互换
指令系统中有一条空操作 (No Operation) 指令: NOP。 在IA-32 处理器中, NOP指令与指令 “XCHG EAX, EAX” 具有同样的指令代码 (90H), 实际上就是同一条指令。 空操作指令放置在主存中也要占用一个字节空间。 编程中, 有时利用 NOP指令实现短时间延时, 还可以临时占用代码空间以便以后填入需要的指令代码。

猜你喜欢

转载自blog.csdn.net/Clown_pan/article/details/85047577
今日推荐