小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

匯編語言:標志寄存器

 just_person 2012-04-22

CPU內(nèi)部的寄存器中,有一種特殊的寄存器(對于不同的處理機,個數(shù)和結(jié)構(gòu)都可能不同),具有三種作用:
1) 用來存儲相關(guān)指令的某些執(zhí)行結(jié)果;
2) 用來為CPU執(zhí)行相關(guān)指令提供行為依據(jù);
3) 用來控制CPU的相關(guān)工作方式。

這種特殊的寄存器在8086CPU中,被稱為標志寄存器(簡稱為flag)。8086CPU的標志寄存器有16位,其中存儲的信息通常被稱為程序狀態(tài)字(PSW)。

flag和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個寄存器具有一個含義。而flag寄存器是按位起作用的,也就是說,它的每一位獨有專門的含義,記錄特定的信息。

8086CPU的flag寄存器的結(jié)構(gòu)如下:

flag的1、3、5、12、13、14、15位在8086CPU中沒有使用,不具有任何含義。
而0、2、4、6、7、8、9、10、11位都具有特殊的含義。


zero 零
parity 奇偶性

標志寄存器(flag)的第六位是ZF,零標志位。它記錄相關(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。

對于ZF的值,我們可以這樣來看,zf標記相關(guān)指令的計算結(jié)果是否為0,如果為0,則ZF要記錄下"是0"的這樣的肯定信息。在計算機中1表示邏輯真,表示肯定,所以當結(jié)果為0的時候ZF =1,表示"結(jié)果是0"。如果結(jié)果不為0,則ZF要記錄下"不是0"這樣的否定信息。在計算機中0表示邏輯假,表示否定,所以當結(jié)果不為0的時候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í)行會影響標志寄存器的,比如:add、sub、mul、div、inc、dec、or、and等,它們大都是運算指令(進行邏輯或算術(shù)運算);有的指令的執(zhí)行對標志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。


PF標志
flag的第二位是PF,奇偶標志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果的所有二進制位中1的個數(shù)是否為偶數(shù)。如果1的個數(shù)為偶數(shù),PF =1,如果為奇數(shù),那么PF =0。


比如:
mov al, 1
add al, 10
執(zhí)行后,結(jié)果為00001011b,其中有3個(奇數(shù))1,則PF =0;

mov al, 1
or al, 2
執(zhí)行后,結(jié)果為00000011b,其中有2個(偶數(shù))1,則PF =1。

sub al, al
執(zhí)行后,結(jié)果為00000000b,其中有0個(偶數(shù))1,則PF =1。

 

 

sign 符號

flag的第7位是SF,符號標志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為負。如果結(jié)果為負,SF =1,如果結(jié)果為非負,SF =0。

在計算機中通常用補碼來表示有符號數(shù)據(jù)。計算機中的一個數(shù)據(jù)可以看作是有符號數(shù),也可以看成是無符號數(shù)。
如:
00000001b,可以看作為無符號數(shù)1,或有符號數(shù)+1;10000000b可以看作為無符號數(shù)129,也可以看作有符號數(shù)-127。

這也就是說,對于同一個二進制數(shù)據(jù),計算機可以將它當作無符號數(shù)據(jù)來運算,也可以當作有符號數(shù)據(jù)來運算。
如:
mov al, 10000001b
add al, 1
結(jié)果:(al) =10000010b
如果我們將add指令的運算當作無符號數(shù)的運算,那么結(jié)果為130(10000001b);如果我們將它當作有符號數(shù)的運算,那么結(jié)果為-126(10000010b)。

不管我們?nèi)绾慰创?,CPU在執(zhí)行add等指令的時候,就已經(jīng)包含了2種定義,也將得到同一種信息來記錄的2中結(jié)果。關(guān)鍵在于我們的程序需要哪一種結(jié)果。

SF標志,就是CPU對有符號數(shù)運算結(jié)果的一種記錄,它記錄數(shù)據(jù)的正負。在我們將數(shù)據(jù)當作有符號數(shù)來運算的時候,可以通過它來得知結(jié)果的正負。如果我們將數(shù)據(jù)當作無符號數(shù)來奇數(shù),SF的值則沒有意義,雖然相關(guān)的指令影響了它的值。


也就是說,CPU在執(zhí)行add等指令時,是必然要影響到SF標志的值的。至于我們需不需要這種影響,那就看我們?nèi)绾慰创噶钏M行的運算了。
如:
mov al, 10000001b
add al, 1
執(zhí)行后,結(jié)果為10000010b,SF =1,表示:如果指令進行的是有符號數(shù)運算,那么結(jié)果為負。

mov al, 10000001b
add al, 01111111b
執(zhí)行后,結(jié)果為0,SF =0,表示:如果指令進行的是有符號數(shù)運算,那么結(jié)果為非負。

carry 進位
CF標志
flag的第0位是CF,進位標志位。一般情況下,在進行無符號數(shù)運算的時候,它記錄了運算結(jié)果的最高有效位向更高位的進位值,或從更高位的借位值。


對于位數(shù)為N的無符號數(shù)來說,其對于的二進制信息的最高位,即第N-1位,就是它的最高有效位,而假想存在的第N位,就是相對于最高有效位的更高位。

當兩個數(shù)據(jù)相加的時候,有可能產(chǎn)生從最高有效位向更高位的進位。比如,2個8位數(shù)據(jù):98H+98H,將產(chǎn)生進位。由于這個進位值在8位數(shù)中無法保存,我們之前認為是這個進位值被丟棄了。其實,CPU在運算的時候,并不丟棄這個進位值,而是記錄在一個特殊的寄存器的某一位上。8086CPU就用flag的CF位來記錄這個進位值。
比如:
mov al, 98h
add al, al                        ;執(zhí)行后:(al) =30h,CF =1;CF記錄了從最高有效位向更高位的進位值
add al, al                        ;執(zhí)行后:(al) =60h,CF =0,CF記錄了從最高有效位向更高位的進為值


而當兩個數(shù)據(jù)做減法時,有可能向更高位借位。比如:兩個8位數(shù)據(jù):97H -98H,將產(chǎn)生借位,借位后,相當于計算197H-98H。而flag的CF位也可以用來記錄這個借位值。
比如:
mov al, 97H
sub al, 98H                 ;執(zhí)行后:(al) =FFH, CF =1,CF記錄了向更高位的借位值
sub al, al                     ;執(zhí)行后:(al) =0, CF =0,CF記錄了向更高位的借位值

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多