資料傳送指令
- 前言
- 資料傳送指令
- 1.通用資料傳送指令
- 2.輸入/輸出指令
- 3.目标位址傳送指令
- 4.标志傳送指令
前言
80x86指令尋址方式【微機原理】
資料傳送指令
如表

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
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
2)置标志指令 SAHF(Store AH intoFlags)
指令格式及操作:
SAHF