首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

x86 SUB 指令對 CF 標志位影響詳解:借位而非進位

     編輯:程式設計綜合問答

核心結論

SUB dest, src 執行 dest = dest - src,**CF (Carry Flag) 反映無符號數減法的「借位」情況**:

  • CF = 1:發生借位(即 src > dest 作為無符號數)。
  • CF = 0:無借位(src <= dest)。

你的誤區分析

你嘗試用 ADD dest, -src 類比 SUB,但 **CF 語義不同**:

  • ADD:CF = 1 表示**進位**(結果超出位寬)。
  • SUB:CF = 1 表示**借位**(被減數不夠減)。

例:mov al, 1; sub al, 2 → al = 255 (FFh),**CF = 1**(1 不夠減 2,產生借位)。
但 mov al, 1; add al, -2 (FEh) → al = 255 (FFh),**CF = 0**(無進位)。

完整標志位影響

標志含義設置條件
CF進位/借位無符號借位 (src > dest) 置 1
OF溢出有符號數溢出:符號位異常變化置 1
SF符號結果最高位 (MSB) 為 1 置 1
ZF零結果為 0 置 1
AF輔助進位bit 3 向 bit 4 借位/進位置 1 (BCD 運算用)
PF奇偶結果低 8 位中 1 的個數為偶數置 1

調試建議

在調試器中觀察 EFLAGS 寄存器,對比 SUB 和 ADD 同數值運算的 CF 差異,即可直觀理解「借位 ≠ 進位」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved