CPU內(nèi)部的寄存器中,有一種特殊的寄存器(對(duì)于不同的處理機(jī),個(gè)數(shù)和結(jié)構(gòu)都可能不同),具有三種作用: 1) 用來(lái)存儲(chǔ)相關(guān)指令的某些執(zhí)行結(jié)果; 2) 用來(lái)為CPU執(zhí)行相關(guān)指令提供行為依據(jù); 3) 用來(lái)控制CPU的相關(guān)工作方式。
這種特殊的寄存器在8086CPU中,被稱(chēng)為標(biāo)志寄存器(簡(jiǎn)稱(chēng)為flag)。8086CPU的標(biāo)志寄存器有16位,其中存儲(chǔ)的信息通常被稱(chēng)為程序狀態(tài)字(PSW)。
flag和其他寄存器不一樣,其他寄存器是用來(lái)存放數(shù)據(jù)的,都是整個(gè)寄存器具有一個(gè)含義。而flag寄存器是按位起作用的,也就是說(shuō),它的每一位獨(dú)有專(zhuān)門(mén)的含義,記錄特定的信息。
8086CPU的flag寄存器的結(jié)構(gòu)如下:
flag的1、3、5、12、13、14、15位在8086CPU中沒(méi)有使用,不具有任何含義。 而0、2、4、6、7、8、9、10、11位都具有特殊的含義。
zero 零 parity 奇偶性
標(biāo)志寄存器(flag)的第六位是ZF,零標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為0。如果結(jié)果為0,那么ZF =1,如果結(jié)果不為0,那么ZF =0。
比如: mov ax, 1 sub ax, 1 執(zhí)行后,結(jié)果為0,則ZF =1。
mov ax, 2 sub ax, 1 執(zhí)行后,結(jié)果為1,則ZF =0。
對(duì)于ZF的值,我們可以這樣來(lái)看,zf標(biāo)記相關(guān)指令的計(jì)算結(jié)果是否為0,如果為0,則ZF要記錄下"是0"的這樣的肯定信息。在計(jì)算機(jī)中1表示邏輯真,表示肯定,所以當(dāng)結(jié)果為0的時(shí)候ZF =1,表示"結(jié)果是0"。如果結(jié)果不為0,則ZF要記錄下"不是0"這樣的否定信息。在計(jì)算機(jī)中0表示邏輯假,表示否定,所以當(dāng)結(jié)果不為0的時(shí)候ZF =0,表示"結(jié)果不是0"。
比如: mov ax, 1 and ax, 0 執(zhí)行后,結(jié)果為0,則ZF =1,表示"結(jié)果是0"。
mov ax, 1 or ax, 0 執(zhí)行后,結(jié)果為1,則ZF =0,表示"結(jié)果非0"。
在8086CPU的指令集中,有的指令的執(zhí)行會(huì)影響標(biāo)志寄存器的,比如:add、sub、mul、div、inc、dec、or、and等,它們大都是運(yùn)算指令(進(jìn)行邏輯或算術(shù)運(yùn)算);有的指令的執(zhí)行對(duì)標(biāo)志寄存器沒(méi)有影響,比如:mov、push、pop等,它們大都是傳送指令。
PF標(biāo)志 flag的第二位是PF,奇偶標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果的所有二進(jìn)制位中1的個(gè)數(shù)是否為偶數(shù)。如果1的個(gè)數(shù)為偶數(shù),PF =1,如果為奇數(shù),那么PF =0。
比如: mov al, 1 add al, 10 執(zhí)行后,結(jié)果為00001011b,其中有3個(gè)(奇數(shù))1,則PF =0;
mov al, 1 or al, 2 執(zhí)行后,結(jié)果為00000011b,其中有2個(gè)(偶數(shù))1,則PF =1。
sub al, al 執(zhí)行后,結(jié)果為00000000b,其中有0個(gè)(偶數(shù))1,則PF =1。 sign 符號(hào)
flag的第7位是SF,符號(hào)標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為負(fù)。如果結(jié)果為負(fù),SF =1,如果結(jié)果為非負(fù),SF =0。
在計(jì)算機(jī)中通常用補(bǔ)碼來(lái)表示有符號(hào)數(shù)據(jù)。計(jì)算機(jī)中的一個(gè)數(shù)據(jù)可以看作是有符號(hào)數(shù),也可以看成是無(wú)符號(hào)數(shù)。 如: 00000001b,可以看作為無(wú)符號(hào)數(shù)1,或有符號(hào)數(shù)+1;10000000b可以看作為無(wú)符號(hào)數(shù)129,也可以看作有符號(hào)數(shù)-127。
這也就是說(shuō),對(duì)于同一個(gè)二進(jìn)制數(shù)據(jù),計(jì)算機(jī)可以將它當(dāng)作無(wú)符號(hào)數(shù)據(jù)來(lái)運(yùn)算,也可以當(dāng)作有符號(hào)數(shù)據(jù)來(lái)運(yùn)算。 如: mov al, 10000001b add al, 1 結(jié)果:(al) =10000010b 如果我們將add指令的運(yùn)算當(dāng)作無(wú)符號(hào)數(shù)的運(yùn)算,那么結(jié)果為130(10000001b);如果我們將它當(dāng)作有符號(hào)數(shù)的運(yùn)算,那么結(jié)果為-126(10000010b)。
不管我們?nèi)绾慰创?,CPU在執(zhí)行add等指令的時(shí)候,就已經(jīng)包含了2種定義,也將得到同一種信息來(lái)記錄的2中結(jié)果。關(guān)鍵在于我們的程序需要哪一種結(jié)果。
SF標(biāo)志,就是CPU對(duì)有符號(hào)數(shù)運(yùn)算結(jié)果的一種記錄,它記錄數(shù)據(jù)的正負(fù)。在我們將數(shù)據(jù)當(dāng)作有符號(hào)數(shù)來(lái)運(yùn)算的時(shí)候,可以通過(guò)它來(lái)得知結(jié)果的正負(fù)。如果我們將數(shù)據(jù)當(dāng)作無(wú)符號(hào)數(shù)來(lái)奇數(shù),SF的值則沒(méi)有意義,雖然相關(guān)的指令影響了它的值。
也就是說(shuō),CPU在執(zhí)行add等指令時(shí),是必然要影響到SF標(biāo)志的值的。至于我們需不需要這種影響,那就看我們?nèi)绾慰创噶钏M(jìn)行的運(yùn)算了。 如: mov al, 10000001b add al, 1 執(zhí)行后,結(jié)果為10000010b,SF =1,表示:如果指令進(jìn)行的是有符號(hào)數(shù)運(yùn)算,那么結(jié)果為負(fù)。
mov al, 10000001b add al, 01111111b 執(zhí)行后,結(jié)果為0,SF =0,表示:如果指令進(jìn)行的是有符號(hào)數(shù)運(yùn)算,那么結(jié)果為非負(fù)。
carry 進(jìn)位 CF標(biāo)志 flag的第0位是CF,進(jìn)位標(biāo)志位。一般情況下,在進(jìn)行無(wú)符號(hào)數(shù)運(yùn)算的時(shí)候,它記錄了運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。
對(duì)于位數(shù)為N的無(wú)符號(hào)數(shù)來(lái)說(shuō),其對(duì)于的二進(jìn)制信息的最高位,即第N-1位,就是它的最高有效位,而假想存在的第N位,就是相對(duì)于最高有效位的更高位。
當(dāng)兩個(gè)數(shù)據(jù)相加的時(shí)候,有可能產(chǎn)生從最高有效位向更高位的進(jìn)位。比如,2個(gè)8位數(shù)據(jù):98H+98H,將產(chǎn)生進(jìn)位。由于這個(gè)進(jìn)位值在8位數(shù)中無(wú)法保存,我們之前認(rèn)為是這個(gè)進(jìn)位值被丟棄了。其實(shí),CPU在運(yùn)算的時(shí)候,并不丟棄這個(gè)進(jìn)位值,而是記錄在一個(gè)特殊的寄存器的某一位上。8086CPU就用flag的CF位來(lái)記錄這個(gè)進(jìn)位值。 比如: mov al, 98h add al, al ;執(zhí)行后:(al) =30h,CF =1;CF記錄了從最高有效位向更高位的進(jìn)位值 add al, al ;執(zhí)行后:(al) =60h,CF =0,CF記錄了從最高有效位向更高位的進(jìn)為值
而當(dāng)兩個(gè)數(shù)據(jù)做減法時(shí),有可能向更高位借位。比如:兩個(gè)8位數(shù)據(jù):97H -98H,將產(chǎn)生借位,借位后,相當(dāng)于計(jì)算197H-98H。而flag的CF位也可以用來(lái)記錄這個(gè)借位值。 比如: mov al, 97H sub al, 98H ;執(zhí)行后:(al) =FFH, CF =1,CF記錄了向更高位的借位值 sub al, al ;執(zhí)行后:(al) =0, CF =0,CF記錄了向更高位的借位值
|