組合語言 標誌暫存器

2022-03-10 23:18:37 字數 3287 閱讀 6967

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

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

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

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

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

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

8086cpu的flag暫存器的結構如下:

flag的1、3、5、12、13、14、15位在8086cpu中沒有使用,不具有任何含義。

而0、2、4、6、7、8、9、10、11位都具有特殊的含義。

zero 零

parity 奇偶性

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

比如:mov ax, 1

sub ax, 1

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

mov ax, 2

sub ax, 1

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

對於zf的值,我們可以這樣來看,zf標記相關指令的計算結果是否為0,如果為0,則zf要記錄下"是0"的這樣的肯定資訊。在計算機中1表示邏輯真,表示肯定,所以當結果為0的時候zf =1,表示"結果是0"。如果結果不為0,則zf要記錄下"不是0"這樣的否定資訊。在計算機中0表示邏輯假,表示否定,所以當結果不為0的時候zf =0,表示"結果不是0"。

比如:mov ax, 1

and ax, 0

執行後,結果為0,則zf =1,表示"結果是0"。

mov ax, 1

or ax, 0

執行後,結果為1,則zf =0,表示"結果非0"。

在8086cpu的指令集中,有的指令的執行會影響標誌暫存器的,比如:add、sub、mul、div、inc、dec、or、and等,它們大都是運算指令(進行邏輯或算術運算);有的指令的執行對標誌暫存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。

pf標誌

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

比如:mov al, 1

add al, 10

執行後,結果為00001011b,其中有3個(奇數)1,則pf =0;

mov al, 1

or al, 2

執行後,結果為00000011b,其中有2個(偶數)1,則pf =1。

sub al, al

執行後,結果為00000000b,其中有0個(偶數)1,則pf =1。

sign 符號

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

在計算機中通常用補碼來表示有符號資料。計算機中的乙個資料可以看作是有符號數,也可以看成是無符號數。

如:00000001b,可以看作為無符號數1,或有符號數+1;10000000b可以看作為無符號數129,也可以看作有符號數-127。

這也就是說,對於同乙個二進位制資料,計算機可以將它當作無符號資料來運算,也可以當作有符號資料來運算。

如:mov al, 10000001b

add al, 1

結果:(al) =10000010b

如果我們將add指令的運算當作無符號數的運算,那麼結果為130(10000001b);如果我們將它當作有符號數的運算,那麼結果為-126(10000010b)。

不管我們如何看待,cpu在執行add等指令的時候,就已經包含了2種定義,也將得到同一種資訊來記錄的2中結果。關鍵在於我們的程式需要哪一種結果。

sf標誌,就是cpu對有符號數運算結果的一種記錄,它記錄資料的正負。在我們將資料當作有符號數來運算的時候,可以通過它來得知結果的正負。如果我們將資料當作無符號數來奇數,sf的值則沒有意義,雖然相關的指令影響了它的值。

也就是說,cpu在執行add等指令時,是必然要影響到sf標誌的值的。至於我們需不需要這種影響,那就看我們如何看待指令所進行的運算了。

如:mov al, 10000001b

add al, 1

執行後,結果為10000010b,sf =1,表示:如果指令進行的是有符號數運算,那麼結果為負。

mov al, 10000001b

add al, 01111111b

執行後,結果為0,sf =0,表示:如果指令進行的是有符號數運算,那麼結果為非負。

carry 進製

cf標誌

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

對於位數為n的無符號數來說,其對於的二進位制資訊的最高位,即第n-1位,就是它的最高有效位,而假想存在的第n位,就是相對於最高有效位的更高位。如下圖:

當兩個資料相加的時候,有可能產生從最高有效位向更高位的進製。比如,2個8位資料:98h+98h,將產生進製。由於這個進製值在8位數中無法儲存,我們之前認為是這個進製值被丟棄了。其實,cpu在運算的時候,並不丟棄這個進製值,而是記錄在乙個特殊的暫存器的某一位上。8086cpu就用flag的cf位來記錄這個進製值。

比如:mov al, 98h

add al, al                        ;執行後:(al) =30h,cf =1;cf記錄了從最高有效位向更高位的進製值

add al, al                        ;執行後:(al) =60h,cf =0,cf記錄了從最高有效位向更高位的進為值

而當兩個資料做減法時,有可能向更高位借位。比如:兩個8位資料:97h -98h,將產生借位,借位後,相當於計算197h-98h。而flag的cf位也可以用來記錄這個借位值。

比如:mov al, 97h

sub al, 98h                 ;執行後:(al) =ffh, cf =1,cf記錄了向更高位的借位值

sub al, al                     ;執行後:(al) =0, cf =0,cf記錄了向更高位的借位值

組合語言 標誌暫存器

8086cpu的flag暫存器的結構如下所示。1,3行為標誌名,2,4行為位數。ofdf iftf 1514 1312 111098 sfzf afpfcf7 6543 210zf標誌 記錄相關指令執行後,其結果是否為0。pf標誌 記錄相關指令執行後,其結果的所有bit位中1的個數是否為偶數。of標...

組合語言 標誌暫存器(flag)

標誌暫存器 flag 1用來儲存相關指令的某些資料結果 2用來為cpu執行相關的指令提供行為依據 3用來控制cpu的相關工作方式 flag暫存器是按位起作用,每一位都有專門的含義 8086cpu 0 cf 2 ff 4 af 6 zf 7 sf 8 tf 9 if 10 df 11 of 都具有特殊...

組合語言 暫存器

乙個典型的cpu由運算器 控制器 暫存器等器件組成,這些器件靠內部匯流排相連。通用暫存器 ax bx cx dx 段位址暫存器 cs ds es ss 專用暫存器 bp sp si di 指令指標暫存器 ip 標誌暫存器 psw ah al ax accumulator 累加暫存器 bh bl bx...