1. 程式人生 > 其它 >8086組合語言:標誌暫存器的各個標誌位的詳細介紹

8086組合語言:標誌暫存器的各個標誌位的詳細介紹

技術標籤:# 8086組合語言8086組合語言標誌暫存器

一、基本介紹:

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

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

flag和其他暫存器不一樣,其他暫存器是用來儲存資料的,都是一個暫存器作為一個整體具有一個含義的。但是flag暫存器是每一位都有專門的含義的,記錄著特定的資訊!

flag暫存器各位示意圖

flag暫存器在上圖中顯示空白的位,在8086CPU中沒有被使用,因此不具有任何的含義

;其他被標識的位都具有特殊的含義。

二、各個標誌位介紹:

OF標誌:溢位標誌位(有符號數)

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

CF和OF之間的區別:CF是針對於無符號數運算,OF位是針對於有符號數運算。

程式碼舉例:

mov al,0F0H

add al,88H

指令執行之後,CF=1,OF=1。如果把該運算看作無符號數運算,則0F0H+88H產生了進位,故CF=1;如果把該運算看作有符號數運算,則0F0H+88H發生溢位,OF=1。

mov al,0F0H

add al,78H

指令執行之後,CF=1,OF=0。如果把該運算看作無符號數運算,則0F0H+78H產生了進位,故CF=1;如果把該運算看作有符號數運算,則0F0H+78H不發生溢位,OF=0。

因此,CF和OF所表示的進位和溢位,是分別對於無符號數和有符號數運算而言的彼此之間沒有任何的關係。


DF標誌:方向標誌位

flag的第10位是DF,方向標誌位;僅僅用於串處理指令中,控制著地址的變化方向

DF=0;每次操作之後地址遞增;即從低地址向高地址處理資料串。

DF=1,每次操作之後地址遞減,即從高地址向低地址處理資料串。

由於flag暫存器中的DF位決定著串傳送指令執行之後,SI、DI的改變方向;因此8086CPU也提供了相應的指令來對於DF位進行設定:

CLD指令:將標誌暫存器的DF位,置為0

STD指令:將標誌暫存器的DF位,置為1


IF標誌:中斷允許標誌位

flag的第9位是IF,IF置為0,禁止其他的可遮蔽中斷;如果允許處理可遮蔽中斷,則將IF置為1。

——相關操作指令:

STI指令:將IF設定為1,允許可遮蔽中斷。

CLI指令:將IF設定為0,禁止可遮蔽中斷。


TF標誌:跟蹤標誌位

flag的第8位是TF,跟蹤標誌位用於標識CPU是否允許單步中斷,以進行程式除錯。TF=0時,8086CPU處於正常狀態;TF=1時,8086CPU處於單步狀態,每執行一條指令就自動產生一次單步中斷。

  8086的debug功能依賴於8086CPU的單步除錯功能。


SF位:符號標誌位(有符號數)

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

在計算機裡面,通常使用補碼來表示有符號資料。計算機的一個數據既可以看作有符號數,亦可以看作無符號數。譬如:

0000 0001B,可以看作為無符號數1,也可看做有符號數+1。

1000 0001B,可以看作為無符號數129,也可以看作有符號數-127。

這就說明計算機在計算相關的資料時,即可以看作有符號數的運算,亦可以看作無符號數的運算,關鍵在於使用者需要哪一個!例如:

mov al,1000 0001B

add al,1

計算的結果就是:al=1000 0010B

對於該運算,如果你把它看作無符號數的運算,那麼就是129+1=130(1000 0010B);也可以將其看作有符號數的運算,那麼就是-127+1=-126(1000 0010B)。

SF標誌,就是8086CPU對於有符號運算結果的一種記錄,它記錄了運算結果的正負無論你把運算看作有符號運算還是無符號運算,SF的值都會改變,不同的是,當你看作有符號運算時,它是有意義的;當你看作無符號運算時它是無意義的!

mov al,1000 0001B

add al,1

運算結果為1000 0010B,SF=1;如果你把這個運算看作有符號數運算,那麼結果為負。

mov al,1000 0001B

add al,0111 1111B

運算結果是0,SF=1;如果你把這個運算看作有符號數運算,那麼結果為正。


ZF位:零標誌位

flag暫存器的第6位是ZF,零標誌位;它記錄著相關指令執行之後,其結果是否為零;如果結果為零,那麼ZF=1,如果結果不為零,那麼ZF=0。

例如:

mov ax,1

sub ax,1

執行之後,結果為零,則ZF=1。

mov ax,2

sub ax,1

執行之後,結果為1,則ZF=0。


AF位:調整標誌位

flag的第4位是AF,調整標誌位;反映加減運算時最低半位元組有無進位或者借位。最低半位元組有進位或借位時,AF=1,否則AF=0。

這個標誌位主要由處理器內部使用,用於十進位制算術運算的調整指令,使用者一般不必關心。

例如:8位二進位制數運算0011 1010+0111 1100 = 1011 0110,低四位有進位,所以此時的AF=1。


PF位:奇偶標誌位

flag暫存器的第2位是PF,奇偶標誌位;它記錄著相關指令執行之後,其結果的所有bit位中1的個數是否為偶數;如果1的個數為偶數,則PF=1,如果1的個數為奇數,則PF=0。

例如:

mov al,1

add al,10

執行之後,結果是0000 1011B;其中有3個1;因此PF=0。

mov al,2

or al,2

執行之後,結果是0000 0011B;其中有2個1;因此PF=1。

sub al,al

執行之後,結果為0000 0000B;其中有0(偶數)個1;因此PF=1。


CF標誌:進位標誌位(無符號數)

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

以8位為例:

——進位舉例:

mov al,98H

add al,al;執行之後,al的值變為30H,CF=1;此時CF記錄了最高有效位向更高位的進位值。

add al,al;執行之後,al的值變為60H,CF=0;此時CF記錄了最高有效位向更高位的進位值。

——借位舉例:

mov al,97H

sub al,98H;執行之後,al的值變為FFH,CF=1;此時CF記錄了向更高位的借位值。

sub al,al;執行之後,al的值變為0,CF=0;此時CF記錄了向更高位的借位值。

——相關操作指令:

CLC指令:將CF置為0。

STC指令:將CF置為1。

CMC指令:原來是0變為1,原來是1變為0。

Ending... ...