數據傳送類指令
注意點
- 除 \(SAHF、POPF\) 指令外,其余傳送類指令CPU執行后,對6個狀態標志均無影響。
也就是說,除 \(SAHF、POPF\) 指令外,CPU只是做了數據傳送,並沒有進行數據運算,對狀態標志位無影響。
- 語法規則
1)立即數只能做源操作數
2)類型一致
3)類型明確
4)當ES、DS、SS做目的操作數時,源操作數不能是立即數。
5)CS、IP不能做目的操作數
6)兩存儲器單元之間不能直接操作
數據傳送類指令
通用數據傳送指令-MOV
mov指令的格式為
MOV DST,SRC
取有效地址指令-LEA
LEA指令的格式為
LEA REG_16,MEM
REG_16表示一個16位寄存器,理論上只要是16位即可,但是因為存放有效地址,所以最好是 BX、BP、SI、DI
MEM是5種存儲器尋址方式之一指明的一個存儲器單元。
例如
LEA BX,data1 ;data1是變量,直接尋址找到這個存儲單元把有效地址送給BX
等同於
MOV BX,OFFSET data1
功能一樣。
取地址指針指令-LDS、LES
這兩個指令是將雙字變量MEM內容中的高16位送入DS/ES,低16位送入指定的REG16中。這里REG16不允許為段寄存器。
不常用,了解。
以LDS為例,格式為
LDS REG_16,MEM
REG_16表示一個16位寄存器
MEM是5種存儲器尋址方式之一指明的一個存儲器單元
例如
TABLE DB 10H,20H...
LDS BX,TABLE ;TABLE的段地址->(DS),TABLE的偏移地址->(BX)
得到地址指針,就可以很容易取數據
MOV DX,[BX]
實際中LEA用的比較多。
標志傳送指令-LAHF、SAHF
指令LAHF(load AH register from flags)可以將PSW寄存器中的低8位傳送到AH中,指令SAHF(store AH register from flags)可以將AH的內容傳送到PSW寄存器中的低8位。
源操作數和目的操作數的尋址方式均為隱含尋址方式。
數據交換指令-XCHG
XCHG指令完成兩個操作數之間數據的交換
XCHG指令格式為
XCHG DST,SRC
注意兩點:
-
DST,SRC的內容均不能為立即數
-
所有的段寄存器不能參加交換
例如
XCHG AX,BX
XCHG DL,DH
XCHG AX,[SI+3]
字節轉換指令-XLAP
XLAP為隱含尋址,格式為
XLAP ;DS:(BX)+(AL)->(AL)
右邊默認在數據段,以BX內容為基址加上以AL為內容的相對位移量,作為有效地址,尋找一個存儲單元,將這個單元的內容傳送給AL。
XLAP非常適合兩個代碼之間的交換(查表)
例如
TABLE DB 30H,31H,32H,33H... ;在DS段定義字符0-9,存儲為ASCII碼
...
mov AL,3 ;通過查表得到字符3
LEA BX,TABLE ;BX默認數據段,執行后TABLE的偏移地址屬性傳送給BX
XLAB ;(AL)= 33H
所以XLAB也叫查表指令。
堆棧操作指令
有四條,堆棧操作指令必須 按字(雙字節)操作 。
- 壓入堆棧指令-PUSH
格式為
PUSH SRC ;將SRC壓入堆棧
SRC不能為立即數
- 彈出堆棧指令-POP
格式為
POP DST ;從堆棧彈出DST
- PUSHF
PUSHF為隱含尋址,格式為
PUSHF ;將(PSW)壓入堆棧
- POPF
POPF為隱含尋址,格式為
POPF ;從堆棧彈出一個字,送給(PSW)