1. 程式人生 > >組合語言資料傳送指令之通用資料傳送類指令

組合語言資料傳送指令之通用資料傳送類指令


  • 通用資料傳送類指令

傳送指令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指令實現短時間延時, 還可以臨時佔用程式碼空間以便以後填入需要的指令程式碼。