8086 彙編學習 Part 7

AlwaysBeShine發表於2024-05-04

串傳送指令

MOVSB

功能

以位元組為單位傳送串

實現

  1. \(((ES) * 16 + (DI)) = ((DS) * 16 + (SI))\)
  2. 如果 DF = 0 ,則 \((SI) = (SI) + 1\)\((DI) = (DI) + 1\) 。如果 DF = 1 ,則 \((SI) = (SI) - 1\)\((DI) = (DI) - 1\)

MOVSW

功能

以字為單位傳送串

實現

  1. \(((ES) * 16 + (DI)) = ((DS) * 16 + (SI))\)
  2. 如果 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 指令改變標誌位

相關文章