串傳送指令
MOVSB
功能
以位元組為單位傳送串
實現
- \(((ES) * 16 + (DI)) = ((DS) * 16 + (SI))\)
- 如果 DF = 0 ,則 \((SI) = (SI) + 1\) ,\((DI) = (DI) + 1\) 。如果 DF = 1 ,則 \((SI) = (SI) - 1\) ,\((DI) = (DI) - 1\)
MOVSW
功能
以字為單位傳送串
實現
- \(((ES) * 16 + (DI)) = ((DS) * 16 + (SI))\)
- 如果 DF = 0 ,則 \((SI) = (SI) + 2\) ,\((DI) = (DI) + 2\) 。如果 DF = 1 ,則 \((SI) = (SI) - 2\) ,\((DI) = (DI) - 2\)
REP 指令
REP 指令常和串傳送指令搭配使用
功能
根據 CX 的值,重複執行後面的指令
標誌暫存器
結構
- FLAG 暫存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的資訊
- 8086 CPU 中沒有使用 FLAG 的 1、3、5、12、13、14、15 位,這些位不具有任何意義
作用
- 用來儲存相關指令的某些執行結果
- 用來為 CPU 執行相關指令提供行為依據
- 用來控制 CPU 的相關工作方式
檢視暫存器的值
在 DEBUG 環境下使用 R 指令檢視
含義
標誌 | 值為 1 | 值為 0 | 意義 | 備註 | |
---|---|---|---|---|---|
Overflow | OF | OV | NV | 溢位 | |
Direction | DF | DN | UP | 方向 | |
Sign | SF | NG | PL | 符號 | positive / negative |
Zero | ZF | ZR | NZ | 零值 | |
Parity | PF | PE | PO | 奇偶 | odd / even |
Carry | CF | CY | NC | 進位 |
直接訪問標誌暫存器的方法
- PUSHF 將標誌暫存器的值壓棧
- POPF 從棧中彈出資料,送入標誌暫存器
ZF 零標誌(Zero Flag)
ZF 標記相關指令的計算結果是否為 0
- ZF = 1 表示“結果是0”,1 表示“邏輯真”
- ZF = 0 表示“結果不是0”,1 表示“邏輯假”
在 8086 CPU 的指令集中的應用
- 有的指令的執行是影響標誌暫存器的,比如 : ADD , SUB , MUL , DIV , INC , OR , AND 等,大都是運算指令,進行邏輯或算數運算
- 有的指令對標誌暫存器沒有影響,比如 :MOV, PUSH, POP等,它們大都是傳送指令
- 使用一條指令的時候,要注意這條指令的全部功能,其中包括執行結果對標記暫存器的哪些標誌位造成影響。
PF 奇偶標誌(Parity Flag)
- PF 記錄指令執行後,結果的所有二進位制位中 1 的個數
- 1 的個數為偶數 ,PF = 1
- 1 的個數為奇數 ,PF = 0
SF 符號標誌(Sign Flag)
- SF 記錄指令執行後,將結果視為有符號數
- 結果為負,SF = 1
- 結果為非負數,SF = 0
有符號數與補碼
- 計算機中有符號數一律用補碼來表示和儲存
- 正整數的補碼是其二進位制表示,與原碼相同
- 負整數的補碼,是將其對應二進位制的所有位取反(包括符號位)後加 1
- 例如 正數5 (00000101) 所有位取反後 (11111010) 後加 1 得到 -5 的補碼 (11111011)
SF 標誌是 CPU 對有符號數操作結果的一種記錄
將資料當作有符號數來運算的時候,透過 SF 可知結果的正負;將資料當作無符號數來運算,SF 的值則沒有意義,雖然相關的指令影響了它的值。
CF 進位標誌(Carry Flag)
- 在進行無符號數運算 時,CF 記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值
- CF記錄執行後,有進位或借位時 CF = 1,無進位或借位時 CF = 0
- 對於位數為 N 的無符號數來說,其對應的二進位制的最高位即第 \(N-1\) 位,是最高有效位
- 假想存在的第 N 位,就是相對最高有效位的更高位
SUB 暫存器 , 暫存器
不能用MOV 暫存器 , 0
替代,SUB 暫存器 , 暫存器
可以使 CF 為 0- ADD 指令不能替代 多個 INC 指令,INC 指令不會造成進位,不會影響 CF 標誌位,而 ADD 指令會影響。
OF 溢位標誌(Overflow Flag)
- 在進行有符號數運算的時候,如果結果超過了機器所能表示的範圍稱為溢位
- OF 記錄有符號數操作指令執行後,有溢位時 OF = 1,無溢位時 OF = 0
機器所能表達的範圍
- 以 8 位運算為例,如果用 8 位暫存器或記憶體單元來存放,機器所能表示的範圍就是 \([-128,127]\)
- 同理,對於 16 位有符號數,機器所能表示的範圍是 \([-32768,32767]\)
CF 和 OF 的區別
- CF 是對無符號數運算有意義的進/借位標誌位
- OF 是對有符號數運算有意義的溢位標誌位
DF 方向標誌位(Direction Flag)
功能
- 在串處理指令中,控制每次操作後 SI 和 DI 的增減
- DF = 0 時,每次操作後 SI 和 DI 都遞增
- DF = 1 時,每次操作後 SI 和 DI 都遞減
對 DF 位進行設定的指令
- CLD 指令 : 將標誌暫存器的 DF 位設定為 0 (clear)
- STD 指令 : 將標誌暫存器的 DF 位設定為 1 (setup)
帶進(借)位的加減法
ADC 帶進位加法指令
ADC 是帶進位加法指令,它利用了 CF 位上記錄的進位值
格式
ADC 操作物件1 , 操作物件2
功能
\(操作物件1 = 操作物件1 + 操作物件2 + CF\)
SBB 帶借位減法指令
格式
SBB 操作物件1 , 操作物件2
功能
\(操作物件1 = 操作物件1 - 操作物件2 - CF\)
與 SUB 的區別
SBB 利用了 CF 位上記錄的借位值
CMP 和 條件轉移指令
CMP 指令
- CMP 是比較指令,功能相當於減法指令,只是不儲存結果
- CMP 指令執行後,將對標誌暫存器產生影響
格式
CMP 操作物件1 , 操作物件2
功能
計算 \(操作物件1 - 操作物件2\)
例
指令 | CMP AX , AX |
---|---|
功能 | 做 (AX) - (AX) 的運算,結果為 0 ,但並不在 AX 中儲存,僅影響 FLAG 的相關各位 |
標誌暫存器 | ZF = 1 , PF = 1 , SF = 0 , CF = 0 , CF = 0 |
應用方法
用標誌暫存器值,確定比較結果
無符號數比較與標誌位取值
比較關係 | (AX) ? (BX) | (AX) - (BX) 特點 | 標誌暫存器 |
---|---|---|---|
等於 | \((AX) = (BX)\) | \((AX) - (BX) = 0\) | ZF = 1 |
不等於 | \((AX) \not = (BX)\) | \((AX) - (BX) \not = 0\) | ZF = 0 |
小於 | \((AX) > (BX)\) | \((AX) - (BX)\) 將產生借位 | CF = 1 |
小於等於 | \((AX) \leq (BX)\) | \((AX) - (BX)\) 或者借位,或者結果為 0 | CF = 1 或 ZF = 1 |
大於 | \((AX) \textgreater (BX)\) | \((AX) - (BX)\) 既不借位,結果也不為 0 | CF = 0 且 ZF = 0 |
大於等於 | \((AX) \geq (BX)\) | \((AX) - (BX)\) 不必借位 | CF = 0 |
比較指令的設計思路
透過做減法運算影響標誌暫存器,標誌暫存器的相關位的取值,體現比較的結果
有符號數比較與標誌位取值(不完善)
僅憑結果正負(SF)無法得出結論,需要配合是否溢位(OF)得到結論
比較關係 | (AX) ? (BX) | (AX) - (BX) 特點 | 標誌暫存器 |
---|---|---|---|
等於 | \((AX) = (BX)\) | \((AX) - (BX) = 0\) | ZF = 1 |
不等於 | \((AX) \not = (BX)\) | \((AX) - (BX) \not = 0\) | ZF = 0 |
小於 | \((AX) > (BX)\) | \((AX) - (BX)\) 將產生借位 | SF = 1 且 OF = 0 |
小於等於 | \((AX) \leq (BX)\) | \((AX) - (BX)\) 或者借位,或者結果為 0 | SF = 0 或 OF = 1 |
大於 | \((AX) \textgreater (BX)\) | \((AX) - (BX)\) 既不借位,結果也不為 0 | SF = 1 且 OF = 1 |
大於等於 | \((AX) \geq (BX)\) | \((AX) - (BX)\) 不必借位 | SF = 0 且 OF = 0 |
條件轉移指令
套路
所有影響標誌暫存器的指令 + 條件轉移指令
字元 | 含義 |
---|---|
J | Jump |
E | Equal |
N | Not |
B | Below |
A | Above |
L | Less |
G | Greater |
S | Sign |
C | Carry |
P | Parity |
O | Overflow |
Z | Zero |
根據單個標誌位轉移的指令
指令 | 含義 | 轉移條件 |
---|---|---|
JE / JZ | 相等 / 結果為 0 | ZF = 1 |
JNE / JNZ | 不等 / 結果不為 0 | ZF = 0 |
JS | 結果為負 | SF = 1 |
JNS | 結果非負 | SF = 0 |
JO | 結果溢位 | OF = 1 |
JNO | 結果溢位 | OF = 0 |
JP | 奇偶位為 1 | PF = 1 |
JNP | 奇偶位不為 1 | PF = 0 |
JB / JNAE / JC | 低於 / 不高於等於 / 有借位 | CF = 1 |
JNB / JAE / JNC | 不低於 / 高於等於 / 無解位 | CF = 0 |
根據無符號數比較結果進行轉移的指令
指令 | 含義 | 轉移條件 |
---|---|---|
JB / JNAE / JC | 不高於則轉移 | CF = 1 |
JNB / JAE / JNC | 低於則轉移 | CF = 0 |
JNA / JBE | 不高於則轉移 | CF = 1 或 ZF =1 |
JA / JNBE | 高於則轉移 | CF = 0 且 ZF = 0 |
根據有符號數比較結果進行轉移的指令
指令 | 含義 | 轉移條件 |
---|---|---|
JL / JNGE | 小於則轉移 | SF = 1 且 OF = 0 |
JNL / JGE | 不小於則轉移 | SF = 0 且 OF = 0 |
JLE / JNG | 小於等於則轉移 | SF = 0 且 OF = 1 |
JNLE / JG | 不小於等於則轉移 | SF = 1 且 OF = 1 |
條件轉移指令的使用
- JXXX 系列指令和 CMP 指令配合使用,構造條件轉移指令
- 不必再考慮 CMP 指令對相關標誌位的影響和 JXXX 指令對相關標誌位的檢測
- 可以直接考慮 CMP 和 JXXX 指令配合使用時表現出來的邏輯含義
- JXXX 系列指令和 CMP 指令配合實現高階語言中的 IF 語句的功能
條件轉移指令的應用
- 條件轉移指令可以根據某種”條件“,決定是否”轉移“程式執行流程
- ”轉移“ = 修改 IP
如果檢測條件
- 透過檢測標誌位,由標誌位體現條件
- 條件轉移指令通常都和 CMP 相配合使用,CMP 指令改變標誌位