1. 程式人生 > >11 標誌暫存器

11 標誌暫存器

1、CPU內部的暫存器中,有一種特殊的暫存器(對於不同的處理機,個數和結構都可能不同)具有下面三種作用

(1)用來儲存相關指令的某些執行結果;

(2)用來為CPU執行相關指令提供行為依據;

(3)用來控制CPU的相關工作方式。

這種特殊的暫存器在8086CPU中,被稱為標誌暫存器。8086CPU的標誌暫存器有16位,其中儲存的資訊通常被稱為程式狀態字(PSW)。我們已經使用過8086CPU的ax,bx,cx,dx,si,di,bp,sp,IP,cs,ss,ds,es等13個暫存器了,接下來我們要學最後一個暫存器(flag)

flag和其他暫存器不一樣,其他暫存器是用來存放資料的,都是整個暫存器具有一個含義。而flag暫存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的資訊

此處有圖.jpg 這一節,我們學習CF、PF、ZF、SF、OF、DF

2、ZF標誌

flag的第六位是ZF,零標誌位。他記錄i相關指令執行後,其結果是否為0.如果結果為0,那麼ZF=1;如果其結果不為0,那麼ZF=0

在8086CPU的指令集中,有的指令的執行是影響標誌暫存器的,比如,add、sub、mul、div、inc、or、and等,他們大都是運算指令(進行邏輯或算術運算);有的指令的執行對標誌暫存器沒有影響,比如mov、push、pop等,他們大都是傳送指令。在使用一條指令的時候,要注意這條指令的全部功能,其中包括,執行結果對標誌暫存器的哪些標誌位造成影響

3、PF標誌

flag的第二位是PF,奇偶標誌位,他記錄相關指令執行後,其結果的所有bit位中1的個數是否為偶數。如果1的個數為偶數,pf=1,如果為奇數,那麼pf=0.

4、SF標誌

flag的第七位是SF,符號標誌位。他記錄相關指令執行後,其結果是否為負。如果結果為負,sf=1;如果非負,sf=0。

5、CF,OF標誌位

flag的第零位是CF,進位標誌位。一般情況下,在進行無符號運算的時候,他記錄了運算結果的最高有效位向更高的進位值,或從更高的借位值。

flag的第11位是OF,溢位標誌位。一般情況下,OF記錄了有符號數運算的結果是否發生了溢位。如果發生溢位,OF=1;如果沒有,OF=0.

一定要注意CF和OF的區別:CF是對無符號數運算有意義的標誌位,而OF是對有符號數運算有意義的標誌位

6、adc指令

adc是帶進位的加法指令,他利用了CF位上記錄的進位值

如:adc ax.bx實現的功能是:ax = ax + bx + CF

可以看出,adc指令比add指令多家了一個CF位的值。為什麼要加上CF的值呢?CPU為什麼要提供這樣一條指令呢?

加法分兩步來進行

(1)低位相加

(2)高位相加在加上低位相加產生的進位值

add ax,bx相當於

add al,bl

adc ah,bh

看起來CPU提供adc指令的目的,就是倆進行加法的第二步運算的。adc指令和add指令相配合皆可以對更大的資料進行加法運算

7、sbb指令

sbb指令就是帶借位的減法指令,他利用了CF位上記錄的借位值

sbb ax,bx實現的功能是:ax = ax - bx - CF

sbb和adc是基於同樣思想的兩條指令,在應用思想上和adc類似

8、cmp指令

cmp是比較指令,cmp的功能相當於減法指令,只是不儲存結果。cmp指令執行後,將對標誌暫存器產生影響。其他相關指令通過識別這些被影響的標誌暫存器位來得知比較結果

cmp指令格式:cmp 操作物件1,操作物件2

功能:計算操作物件1 - 操作物件2 ,但不儲存結果,僅僅根據計算結果對標誌暫存器進行設定

有如下結論:

zf=1 ax=bx

zf=0 ax!=bx

cf=1 ax<bx

cf=0 ax>=bx

cf=0 且zf=0 ax>bx

cf=1或zf=1 ax<=bx