167.數據傳送指令

1.數據傳送指令

 通用數據傳送指令
MOV、PUSH、POP、XCHG
 累加器專用傳送指令
IN、OUT、XLAT
 地址傳送指令
LEA、LDS、LES
 標誌寄存器傳送指令
LAHF、SAHF、PUSHF、POPF
 類型轉換指令
CBW、CWDoop

 

2.通用數據傳送指令

2.1 傳送指令MOV

傳送指令: MOV DST, SRC
執行操做: (DST) ← (SRC)post

注意:
* DST、SRC 不能同時爲段寄存器 MOV DS, ES //F
* 當即數不能直接送段寄存器 MOV DS, 2000H //F
* DST 不能是當即數和CS
* DST、SRC 不能同時爲存儲器尋址
* 不影響標誌位測試

2.2進棧出棧指令 PUSH POP

進棧指令: PUSH SRC
執行操做: (SP) ← (SP) – 2
      ( (SP)+1, (SP) ) ← (SRC)spa

出棧指令: POP DST
執行操做: (DST) ← ( (SP)+1, (SP) )
      (SP) ← (SP) + 2指針

堆棧:‘先進後出’的存儲區,段地址存放在SS中,SP在任什麼時候候都指向棧頂,進出棧後自動修改SP。

注意:
* 堆棧操做必須以字爲單位。
* 不影響標誌位
* 不能用當即尋址方式 PUSH 1234H //F
* DST不能是CS POP CS //Fcode

例:假設 (AX) = 2107 H , 執行 PUSH AXblog

   POP BXget

 

例:     PUSH  DS
         SUB   AX, AX
         PUSH  AX
         ……
         ……
         RET

例:     PUSH  AX
         PUSH  BX
         PUSH  CX
         ……            ;其間用到AX、BX、CX
         POP    CX    ; 後進先出
         POP    BX
         POP    AX

 

 

2.3交換指令

交換指令: XCHG OPR1, OPR2
執行操做: (OPR1) ↔ (OPR2)it

注意:
* 不影響標誌位
* 不容許使用段寄存器class

例:

XCHG BX, [ BP+SI ]
XCHG AL, BH

 

3.累加器專用傳送指令(只限使用AX或AL)

 3.1輸入指令 IN

輸入指令 IN (I/O → CPU)

長格式: IN AL, PORT (字節)
     IN AX, PORT (字)
執行操做:(AL) ← ( PORT ) (字節)
       (AX) ← ( PORT+1, PORT )(字)

 

短格式: IN AL, DX (字節)
     IN AX, DX (字)
執行操做:(AL) ← ( (DX) ) (字節)
     (AX) ← ( (DX)+1, (DX) )(字)

 

3.2輸出指令 OUT

輸出指令 OUT (CPU → I/O)


長格式: OUT PORT, AL (字節)
               OUT PORT, AX (字)
執行操做:( PORT ) ← (AL) (字節)
                 ( PORT+1, PORT ) ← (AX)(字)

 

短格式: OUT DX, AL (字節)
     OUT DX, AX (字)
執行操做:( (DX) ) ← (AL) (字節)
                 ( (DX)+1, (DX) ) ← (AX)(字)

 

注意:
* 不影響標誌位
* 前256個端口號00H~FFH可直接在指令中指定(長格式)
* 若是端口號≥ 256,端口號 → DX(短格式)

例: IN AX, 28H
MOV DATA_WORD, AX

例: MOV DX, 3FCH
IN AX, DX

例: OUT 5, AL

例:測試某狀態寄存器(端口號27H)的第2位是否爲1
IN AL, 27H
TEST AL, 00000100B
JNZ ERROR ;若第2位爲1,轉ERROR處理

 

例:Sound程序

 

              mov    dx, 100
              in        al,  61h
              and     al,11111100b
sound:     xor      al,  2       ; 1    0    1
              out      61h, al       ;ON     OFF    ON
              mov     cx, 140h       ;脈寬
Wait1:     loop    wait1
              dec      dx
              jne       sound

 

 

 3.3換碼指令 XLAT

換碼指令:XLAT 或 XLAT OPR
執行操做:(AL) ← ( (BX) + (AL) )

例:MOV BX, OFFSET TABLE ; (BX)=0040H
MOV AL, 3
XLAT TABLE
指令執行後 (AL)=33H

注意:
* 不影響標誌位
* 字節表格(長度不超過256)
  首地址 → (BX)
* 需轉換的代碼位移量 → (AL)

 

4.地址傳送指令

4.1  LEA (load effective address)有效地址送寄存器

有效地址送寄存器指令: LEA REG, SRC(源)
執行操做:   (REG) ← SRC

LEA    BX,  [BX+SI+0F62H

4.2 指針送寄存器和DS、ES、ES、FS、GS、SS

指針送寄存器和DS指令: LDS REG, SRC

執行操做: (REG) ← (SRC)
      (DS) ← (SRC+2)
相繼二字 → 寄存器、DS

LDS SI, [10H]


指針送寄存器和ES指令: LES REG, SRC

執行操做: (REG) ← (SRC)
        (ES) ← (SRC+2)
相繼二字 → 寄存器、ES

LES DI, [BX]

 

注意:
* 不影響標誌位
* REG 不能是段寄存器
* SRC 必須爲存儲器尋址方式

 

5.標誌寄存器傳送指令

標誌送AH指令: LAHF    (load AH with flags)
執行操做: (AH) ← (FLAGS的低字節)

 


AH送標誌寄存器指令: SAHF     (store AH to flags)

執行操做: (FLAGS的低字節) ← (AH)

 


標誌進棧指令: PUSHF  (push the flags or eflags)
執行操做: (SP) ← (SP) - 2
        ( (SP)+1, (SP) ) ← (FLAGS)


標誌出棧指令: POPF  (pop the flags or eflags)
執行操做: (FLAGS) ← ( (SP)+1, (SP) )
        (SP) ← (SP) + 2


* 影響標誌位

 

6.類型轉換指令

字節轉字指令 CBW (convert byte to word)

CBW AL → AX
執行操做: 若(AL)的最高有效位爲0,則(AH)= 00H
若(AL)的最高有效位爲1,則(AH)= FFH

 

字轉雙字 CWD(convert word to double word)

CWD AX → (DX,AX)
執行操做:若(AX)的最高有效位爲0,則(DX)= 0000H
若(AX)的最高有效位爲1,則(DX)= FFFFH

例:(AX) = 0BA45H
CBW ; (AX)=0045H
CWD ; (DX)=0FFFFH (AX)=0BA45H

注意:

* 無操做數指令
* 隱含對AL 或AX 進行符號擴展
* 不影響條件標誌位

 雙字轉四字 CDQ (convert double to quad)

 字節交換 BSWAP (byte swap)

 

 

 

相關文章
相關標籤/搜索