8086標誌暫存器

2022-03-13 04:43:09 字數 3650 閱讀 2846

cpu內部的暫存器中,有一種特殊的暫存器(對於不同的機器,個數和結構都有可能不同)具有以下三個功能:

這種特殊的暫存器在8086cpu中稱為標誌暫存器。8086的標誌暫存器有16位,其中儲存的資訊通常被稱為程式狀態字(psw)。

標誌暫存器與其他暫存器不一樣,其他暫存器是用來放資料的,都是整個暫存器具有乙個含義,而標誌暫存器是按位起作用的。

8086中的標誌暫存器的結構如下圖所示:

其中1、3、4、12、13、14、15位在8086中沒有使用。另外對於有確切含義的每一位,我們稱為標誌位

標誌暫存器的第六位是zf,零標誌位。他是記錄相關指令執行後,其結果是否位零。如果為零,那麼zf=1,如果不為零,那麼zf=0

比如指令:

mov ax, 1

sub ax, 1

執行後,ax的結果為0,所以zf=1

再比如:

mov ax, 2

sub ax, 1

執行後,ax的結果不為0,所以zf=0

在這裡,有一點需要注意:在8086的指令集中,有的指令的執行是影響標誌位的,比如add、sub、mul、div、inc、or、and等,它們大都是運算指令(進行邏輯或算數運算);有的指令的執行對標誌暫存器沒有影響,比如mov、push、pop等,它們大都是傳送指令。

標誌暫存器的第二位是pf,奇偶標誌位。它記錄相關指令執行後,其結果的所有bit位中1的個數是否位偶數。如果是偶數,pf=1,如果位奇數,pf=0

比如指令:

mov al, 1

add al, 10

執行後,al為00001011b,其中有3個1,所以pf=0

再比如:

mov al, 1

or al, 2

執行後結果為00000011b,其中有2個1,所以pf=1

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

這裡要明確一點,在計算機中,通常用補碼來表示有符號的資料,計算機中的乙個資料既可以看作有符號數,也可以看作無符號數。不管我們如何看待,當cpu在進行運算的時候,就已經包含了兩種含義,也將的到同一種資訊來記錄的兩種結果。關鍵在於我們的程式需要那一種。

sf標誌,是cpu對有符號數運算結果一種記錄。如果我們將資料當作無符號數來運算,sf標誌位則沒有意義,雖然計算過程中影響了他的值。

我個人在這裡的更簡單寫的理解是計算後結果的最高位是否為1,為1,這sf=1,否則,sf=0

比如指令:

mov al, 100000001b

add al, 1

執行後結果為10000010b,sf=1,表示如果進行的是有符號運算的話,則結果為負

再比如

mov al, 10000001b

add al, 01111111b

執行後,結果為0,sf=0,表示,如果進行的是有符號運算,這結果為非負

標誌暫存器的第0為是cf,僅為標誌位。一般情況下,在進行 無符號 運算的時候,它記錄了運算結果的最高有效位向更高有效位的進製,或從更高有效位的借位。

比如指令:

mov al, 98h

add al, al ; 執行後(al)=30h, cf=1, 產生進製

add al, al ; 執行後(al)=60h, cf=0, 沒有進製,或者說進製為0

再比如:

mov al, 97h

sub al, 98h ; 執行後(al)=ffh, cf=1, 產生借位

sub al, al ; 執行後(al)=0, cf=0, 借位為0

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

這裡一定要注意的是cf和of的區別,cf是對無符號數運算有意義的標誌位,而of是對有符號數運算有意義的標誌位。 它們之間沒有任何關係

比如指令:

mov al, 98

add al, 99

執行後,of=1,發生溢位,沒有進製

再比如:

mov al, 0f0h

add al, 78h

執行後:of=0,沒有溢位

標誌暫存器的第10位是df,方向標誌位。在串傳送指令中,控制每次操作後si、di的增減。

df=0,每次操作後si、di遞增

df=1,每次操作後si、di遞減

例如串傳送指令movsb

另外還有movsw,這時候就是一次傳送乙個字了,相應的si和di的+1-1也就變更成了+2-2

一般,movsbmovsw一般配合指令rep指令使用,如rep movsb, 相當於

s: movsb  ; 當然啦,在此之前要先設定cx暫存器

loop s

再沒有標誌暫存器的時候,我們進行加減運算最多只能進行16位的加減運算,這在實際的應用中顯然是不夠的,那麼有了標誌暫存器,在結合adcsbb指令,我們就可以進行任意多位的數的加減法了

adc是帶進製的加法指令,它利用了cf上記錄的進製值

比如:計算1ef000h + 201000h,結果放在ax(高16位)和bx(低16位)中:

mov ax, 001eh

mov bx, 0f000h

add bx, 1000h

adc ax, 0020h

更多位數的數相加和以上同理

sbb是借位減法指令,它利用了cf位上記錄的借位值

比如:計算003e1000h - 00202000h,結果儲存在ax,bx中

mov bx, 1000h

mov ax, 003eh

sub bx, 2000h

sbb ax, 0020h

cmp是比較指令,功能相當於減法指令,只是不儲存結果。執行後,對標誌暫存器產生影響

經過cmp計算後,我們就可以用jejnejbjnbjajna指令進行跳轉了。

因為比較複雜,在這裡就不具體說實現的細節了,具體在更。

pushf的功能是將標誌暫存器的值壓棧,而popf是從棧中彈出資料送入標誌暫存器

這兩個指令為直接訪問暫存器提供了一種方法

在這裡,我們討論了六種暫存器,另外還有if,tf,和af沒有討論,具體再更

標誌暫存器df 標誌暫存器

cpu內部的暫存器中,有一種特殊的暫存器具有以下三種作用。用來儲存相關指令的某些執行結果 用來為cpu執行相關指令提供行為依據 用來控制cpu的相關工作方式 這種特殊的暫存器在8086cpu種,被稱為標誌暫存器 flag 8086cpu的標誌暫存器有16位,其中儲存的資訊通常被稱為程式狀態字 psw...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...

標誌暫存器

標誌暫存器 標誌暫存器 flags register,fr 又稱程式狀態字 program status word,psw 這是乙個存放條件標誌 控制標誌暫存器,主要用於反映處理器的狀態和運算結果的某些特徵及控制指令的執行 各標誌在標誌暫存器中的位置 條件標誌 cf carry flag 進製標誌 ...