标志寄存器
8086CPU的标志寄存器有16位,其中存儲的資訊通常被稱為程式狀态字(PSW)。flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的資訊。
8086CPU的flag寄存器中的結構如圖:

ZF 标志
- flag的第6位是ZF,零标志位。它記錄相關指令執行後,其結果是否為0.如果結果為0,那麼zf=1;如果結果不為0,那麼zf=0。
- 在8086CPU的指令集中,有的指令的執行是影響标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運算指令(進行邏輯或算術運算);
- 有的指令的執行對标志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。
PF 标志
- flag的第2位是PF,奇偶标志位。它記錄指令執行後,結果的所有二進制位(最低有效字)中1的個數:為偶數,PF = 1;為奇數,PF = 0。
SF 标志
- flag的第7位是SF,符号标志位。它記錄指令執行後,結果為負,SF = 1;結果為正,SF = 0。
- 對于同一個二進制資料,計算機可以将它當作無符号資料來運算,也可以當作有符号資料來運算,實際上無關緊要,重要的是使用者如何看待。
- 我們可以将add指令進行的運算當作無符号數的運算,那麼add指令相當于計算129+1,結果為130(10000010B);
- 也可以将add指令進行的運算當作有符号數的運算,那麼add指令相當于計算-127+1,結果為-126(10000010B)。
- 如果我們将資料當作無符号數來運算,SF的值則沒有意義,雖然相關的指令影響了它的值。
CF 标志
- Flag的第0位是CF,進位标志位。一般情況下,在進行無符号數運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。
- 一種情況是兩個資料做加法産生了最高位的進位,另外一種情況,當兩個資料做減法的時候,有可能向更高位借位。
OF 标志
- 在進行有符号數運算的時候,如結果超過了機器所能表示的範圍稱為溢出。
- CF是對無符号數運算有意義的标志位;而OF是對有符号數運算有意義的标志位。
adc 指令
adc是帶進位加法指令 ,它利用了CF位上記錄的進位值。
- 格式: adc 操作對象1,操作對象2
- 功能:操作對象1=操作對象1+操作對象2+CF
- 比如指令adc ax,bx 實作的功能是:(ax)=(ax)+(bx)+CF
使用adc可以對任意大的資料進行加法運算。
sbb 指令
sbb是帶錯位減法指令,它利用了CF位上記錄的借位值。
- 格式:sbb 操作對象1,操作對象2
- 功能:操作對象1=操作對象1–操作對象2–CF
- 比如指令sbb ax,bx實作功能: (ax) = (ax) – (bx) – CF
使用sbb指令我們可以對任意大的資料進行減法運算。
cmp
cmp 是比較指令,功能相當于減法指令,隻是不儲存結果。cmp 指令執行後,将對标志寄存器産生影響。
- 格式:cmp 操作對象1,操作對象2
- 功能:計算操作對象1–操作對象2 但并不儲存結果,僅僅根據計算結果對标志寄存器進行設定。
檢測比較結果的條件轉移指令
- e:表示equal;
- ne:表示not equal;
- b:表示below;
- nb:表示not below;
- a:表示above;
- na:表示not above。
DF 标志和串傳送指令
flag的第10位是DF,方向标志位。在串處理指令中,控制每次操作後si,di的增減。
- DF = 0:每次操作後si,di遞增;
- DF = 1:每次操作後si,di遞減。
- 格式: movsb(w) ;
- 功能:(以位元組為機關傳送)。
((es)×16 + (di)) = ((ds) ×16 + (si))
如果DF = 0則:
(si) = (si) + 1
(di) = (di) + 1
如果DF = 1則:
(si) = (si) - 1
(di) = (di) - 1
movsb和movsw進行的是串傳送操作中的一個步驟,一般來說,movsb 和 movsw 都和rep配合使用,格式如下:
rep movsb。 ;rep的作用是根據cx的值,重複執行後面的串傳送指令。
8086CPU提供下而兩條指令對DF位進行設定:
- cld指令:将标志寄存器的DF位置0
- std指令:将标志寄存器的DF位置1
pushf 和 popf
- pushf :将标志寄存器的值壓棧;
- popf :從棧中彈出資料,送入标志寄存器中