1.資料傳送指令
通用資料傳送指令
MOV、PUSH、POP、XCHG
累加器專用傳送指令
IN、OUT、XLAT
地址傳送指令
LEA、LDS、LES
標誌暫存器傳送指令
LAHF、SAHF、PUSHF、POPF
型別轉換指令
CBW、CWD
2.通用資料傳送指令
2.1 傳送指令MOV
傳送指令: MOV DST, SRC
執行操作: (DST) ← (SRC)
注意:
* 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)
出棧指令: POP DST
執行操作: (DST) ← ( (SP)+1, (SP) )
(SP) ← (SP) + 2
堆疊:‘先進後出’的儲存區,段地址存放在SS中,SP在任何時候都指向棧頂,進出棧後自動修改SP。
注意:
* 堆疊操作必須以字為單位。
* 不影響標誌位
* 不能用立即定址方式 PUSH 1234H //F
* DST不能是CS POP CS //F
例:假設 (AX) = 2107 H , 執行 PUSH AX
POP BX
例: 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)
注意:
* 不影響標誌位
* 不允許使用段暫存器
例:
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)