天天看點

1 資料傳送指令【微機原理】

資料傳送指令

  • ​​前言​​
  • ​​資料傳送指令​​
  • ​​1.通用資料傳送指令​​
  • ​​2.輸入/輸出指令​​
  • ​​3.目标位址傳送指令​​
  • ​​4.标志傳送指令​​

前言

80x86指令尋址方式【微機原理】

資料傳送指令

如表

1 資料傳送指令【微機原理】

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

1 資料傳送指令【微機原理】

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

1 資料傳送指令【微機原理】

2)置标志指令 SAHF(Store AH intoFlags)

指令格式及操作:

SAHF

繼續閱讀