標誌暫存器

2021-09-27 06:22:40 字數 3812 閱讀 9849

——感覺寫的太好了吧,一下子就把我的課後習題給理解到了哈哈哈哈~

首先說一下標誌暫存器的概念。在8086cpu中標誌暫存器都是16位的,而其中儲存的資訊被稱為程式狀態字(一段包含系統狀態的記憶體或者是硬體區域)。標誌暫存器既然是暫存器,那麼它也是用來儲存資訊的,只是它儲存資訊的方式與其他的暫存器不同而已。其他的暫存器是乙個暫存器包含乙個資訊,而標誌暫存器則可以包含多個資訊。而標誌暫存器之所以可以儲存多個資訊,是因為它的儲存方式。在標誌暫存器中,資訊是被儲存在位中的。標誌暫存器中的每乙個位都可以代表特定的資訊。

這是我在網上找的乙個標誌暫存器的示意圖。通過這張我們可以知道在標誌暫存器中,哪些是用到的,哪些是沒用到的。我就不在贅述了。接下來我們看一下這些位的具體含義。

cf(carry flag):進製標誌位。這個位是在進行無符號數運算的時候用到的。一般情況下,這個位記錄了進行無符號運算的時候,運算結果的最高有效位向更高位的進製值,或從更高位的借位值。注意的是,這裡的進製與借位,都是相對於二進位制而言的。下面我們再找一張圖來加深下理解。

pf(parity flag):奇偶標誌位。這個位的判斷需要我們將結果轉為二進位制來看,如果結果的低8位中有偶數個1,就將pf的值置1;如果是奇數個1,就置0。要注意的是一定是結果的低8位。

af(auxiliary flag):輔助進製標誌位。這個位用的不多,所以書上也沒有講,我就簡單的查了一下資料。這個位表示加減法做到一半時有沒有形成進製/借位,如果有則af=1。這麼說誰都聽不懂,所以我們舉個例子來說下。例如 mov al,00001110 mov bl,00001000 add al,bl 最後結果為al=00010110這就是低四位向高四位進製。反之在減法中第三位不夠減向第四位借位(注意數字是從第0位開始數的)叫低四位向高四位借位!像前面的al中前四位為高四位,後四位為低四位。例如,當兩個位元組相加時,如果從低4位向高4位有進製時,則af=1。

zf(zero flag):零標誌位。這個位就很簡單了,判斷結果是不是0。如果結果為0,就置1;不為0,就置0。

sf(sign flag):符號標誌位。既然是符號標誌位,就是對有符號資料來說的。如果結果為負,就置1;結果為正,就置0。

tf(timer overblow flag):定時器溢位標誌。這個位主要是用來在debug中進行-t指令時使用的。當cpu在執行完一條指令後,如果檢測到tf位的值為1,則產生單步中斷,引發中斷過程。通過這個位,我們就可以在debug中對程式進行單步跟蹤。

if(interrupt flag):中斷允許標誌位。當if=1時,cpu在執行完當前指令後響應中斷,引發中斷過程;當if=0時,則不響應可遮蔽中斷。

df(direction flag):方向標誌位。在串處理指令中,控制每次操作後,si(指向原始偏移位址)、di(指向目標偏移位址)的增減。當df=0時,每次操作後,si、di遞增;df=1時,每次操作後,si、di遞減。我們可以使用cld指令將df的值置為0,使用std指令將df的值置為1。df需要與rep、movsb等指令配合使用。

of(overflow flag):溢位標誌位。這個位是用來判斷有沒有溢位的。注意溢位這個概念只對於有符號資料而言,就如同進製只對於無符號資料而言。當of=0時,說明沒有溢位;當of=1時,說明溢位了。

我們再來看一下各個位在debug中是如何表示的:

標誌    debug(1/0)

cf    cy    nc

pf    pe    po

af    ac    na

zf    zr    nz

sf    ng    pl

if    ei    di

df    dn    up

of    ov    nv

以上這些就是關於標誌暫存器的基本概念了。但是光有這些概念確實不夠用的,因為要學以致用,也就是做一些題。我記得我學的時候就是知道概念,但是題就是不會做。所以接下來我們做一道題來加深理解。

題目:寫出下面每條指令執行後,zf、pf、sf、cf、of等標誌位的值。

sub al,al

mov al,10h

add al,90h

mov al,80h

add al,80h

mov al,0fch

add al,05h

mov al,7dh

add al,0bh

答案:                    al                 cf    of    sf    zf    pf

sub al,al         0h/0000 0000b      0       0       0      1     1

mov al,10h    10h/0001 0000b     0      0       0       1     1

add al,90h     a0h/1010 0000b     0      0       1       0     1

mov al,80h    80h/1000 0000b     0      0       1       0     1

add al,80h     0h/0000 0000b       1      1       0       1     1

mov al,0fch    0fch/1111 1100b    1      1       0      1     1

add al,05h     1h/0000 0001b        1      0      0       0     0

mov al,7dh     7dh/1111 1101b     1      0      0       0     0

add al,0bh      88h/1000 1000b     0      1      1       0     1

解析:第一條指令:sub al,al。此時al的值為0,那麼自然沒有借位,也不會有溢位,不是負數,值為0,二進位制中都是0,也就是0個1。

第二條指令:mov al,10h。我們只需要知道如mov、push、pop等指令不會對標誌暫存器有影響就可以了。

第三條指令:add al,90h。這裡就是10h+90h=0001 0000b+1001 0000b=1010 0000b=a0h。先看cf位,我們可以看到沒有進製(可以自己用計算器算下,不過要調為字型資料再去算);接下來是of位,我們將10h換為十進位制有符號資料為16,90h則為-112,a0為-96。也就是16-112=-96,正確,所以沒有溢位。需注意的是:首先是轉換為有符號資料是計算器要是位元組型資料。其次,在判斷溢位時,如果答案我們算的一樣,就是沒有溢位,如果出現了正數+正數=負數一類的,那就是溢位了。sf位是對於有符號資料來說的,也就是-96。pf位要注意是低8位就可以(不過這裡也沒有高8位,而且這個考的不多,知道就好)。

第五條指令:add al,80h。80h+80h=1000 0000b+1000 0000b=0000 0000b(0001 0000 0000b)=0h(100h)。我們知道al是位元組型的,只可以儲存8。通過上邊的式子我們也可以很明顯的看出存在進製的現象。所以如果用計算器(位元組型)算的話就是0,如果是用字型計算器算的話就是另乙個結果,因此cf=1。80h對應的無符號資料是-128,最後的結果為(-128)+(-128)=0。負數加負數為0,肯定是溢位了。其他省略了。

第七條指令: add al,05h。0fch+05h=1111 1100b+0000 0101b=0000 0001b(1 0000 0001b)=1h(101h)。有符號運算(-4)+5=1。所以有進製,沒有溢位。

第九條指令:add al,0bh。7dh+0bh=0111 1101b+0000 1011b=1000 1000b=88h。有符號運算120+5=(-120)。所以無進製,有溢位。

關於計算器,如果你設定為位元組型的,那麼得到的就是有符號資料,如果是字型的,就是無符號資料。

在往暫存器中儲存資料的時候,是以二進位制的形式往裡面儲存資料的。

標誌暫存器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 進製標誌 ...