標志寄存器
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 :從棧中彈出數據,送入標志寄存器中