8086組合語言:標誌暫存器的各個標誌位的詳細介紹
一、基本介紹:
CPU的內部的暫存器中,有一類特殊的暫存器(對於不同的處理機,其個數和結構都可能不同);它具有以下三種作用!
這種特殊的暫存器在8086CPU中,被稱為標誌暫存器flag。8086CPU的標誌暫存器有16位,其中儲存的資訊通常又被稱為程式狀態字(PSW)。
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... ...