8086標志寄存器介紹
前面已經介紹了8086大多數的寄存器,現在介紹一種8086內部一個特殊的寄存器,標志寄存器(flag register)。
8086標志寄存器大致有以下作用:
1.存儲一些相關指令的執行結果
2.為CPU執行相關指令提供依據
3.控制CPU的部分工作方式
8086的寄存器是16位的,通常的寄存器都是存放一個16位數據視作一個整體進行工作的。但標志寄存器較為特殊,標志寄存器中的每一bit位是單獨工作的,雖然理論上16位的標志寄存器能夠提供至多16個flag標志,但事實上8086CPU的設計者只使用了其中的9位,剩余的bit位並沒有實際意義。
8086的指令集中,有許多指令的執行會同時影響標志寄存器中flag的值。比如add、sub、inc、and等運算指令(邏輯或算術運算),而像mov、push、pop等單純傳送數據的指令則不會對標志寄存器產生影響。在使用一條指令時,出了其本身的作用外,也要注意指令對標志寄存器的影響。
其中ZF、PF、SF、CF、OF、AF被歸類為運算結果標志位,而DF、IF、TF則被歸類為狀態控制標志位。
下面對標志寄存器的各位進行詳細介紹。
ZF(Zero Flag) 零標志位
ZF零標志位,記錄相關指令執行后,結果是否為0。通常一位bit的布爾變量1表示真,0表示假。ZF零標志位在指令執行的結果為0時,值為真(ZF=1);不為0時;不為0時,值為假(ZF=0)。
PF(Parity Flag) 奇偶標志位
PF奇偶校驗位,記錄相關指令執行后,結果中bit位中1的個數是否為偶數。若1的個數為偶數,則PF=1;反之,若1的個數為奇數,則PF=0。
SF(Sign Flag) 符號標志位
SF符號標志位,記錄相關指令執行后,結果是否為負。若結果為負,SF=1;若結果為非負,SF=0。
CF(Carry Flag) 進位標志位
CF進位標志位,一般在無符號數運算時,記錄最高位是否產生了進位(例如加法指令),或是否從最高位借位(例如減法指令)。
正是因為存在了CF進位標志位,8086CPU的寄存器雖然只有16位,雖然在硬件上無法直接進行更大范圍的數的運算(超過2^16),但可以通過軟件的方式,將運算分為多步,將一個更大的數據(例如兩個64位的數的加法可以分解為4個16位數的相加),通過CF進位標志位完成運算(adc指令 帶進位的加法指令)。在理論上可以完成任意位數據的運算。
OF(Overflow Flag) 溢出標志位
OF溢出標志位,一般在有符號運算時,記錄結果是否產生了溢出。若發生了溢出,則OF=1;若沒有發生溢出,則OF=0。
有程序mov al,98; add al,99。 將98、99看作8位無符號整數,則沒有產生進位(98+99<2^8);若是將98、99看作8位有符號整數,則發生了溢出(98+99>2^7)。
有程序mov al,0F0H; add al,88H。將0F0H、88H看作8位無符號整數,則產生了進位(240+136>2^8);若是將0F0H、88H看作8位有符號整數,也發生溢出(-16+-120<-2^7)。
有程序mov al,0F0H; add al,78H。將0F0H、78H看作8位無符號整數,則產生了進位(240+135>2^8);若是將0F0H、88H看作8位有符號整數,則沒有發生溢出(-16+120<2^7)。
在運算指令執行后,CF。OF的值可以不同也可以不同。由此可見,CF和OF是分別針對無符號和有符號運算的,兩者之間並無直接關聯。
AF(Auxiliary Carry Flag) 輔助進位標志
AF輔助進位標志,用於表示8位無符號數運算時,4位的半字節處是否產生進位或者借位。
若AF=1表示字節運算產生低半字節向高半字節的進位或借位,否則AF=0。輔助進位也稱半進位標志,主要用於BCD碼運算的十進制調整。
有程序 mov al 10110001B; add 10100100b。無符號數1011 0001與1010 0100相加時,產生了進位,CF=1;但低四位0001與0100相加並沒有產生進位,因此AF=0。
DF(Direction Flag) 方向標志位
方向標志位用於指定字符串處理時的方向,DF=1,以遞減順序處理字符串,即地址以從高到低順序遞減。反之,DF=0時則以遞增順序處理。
IF(Interrupt enable Flag) 中斷允許標志位
中斷標志位用於標識中斷是否啟用。IF=1,表示CPU允許接受中斷;IF=0,表示當前CPU不接受中斷。
TF(Trap Flag) 跟蹤標志位
跟蹤標志位用於標識CPU是否允許單步中斷,以進行程序調試。TF=0時,8086CPU處於正常狀態;TF=1時,8086CPU處於單步狀態,每執行一條指令就自動產生一次單步中斷。
8086的debug功能依賴於8086CPU的單步調試功能。更進一步,CPU單步中斷的硬件功能,是所有軟件級別的debug單步調試的基礎,只不過通常高級語言中的單步執行對應的是多條機器硬件指令的執行。
IF、TF在8086中斷控制中起到了非常關鍵的作用,在后面的中斷部分會進一步的詳細介紹。
標志寄存器在Debug模式中的表示
在8086的debug模式下,可以觀察到標志寄存器中各個flag位的狀態。debug中的flag不是使用0、1展示的,而是使用更符合flag語義的英文單詞縮寫來表示。
第二行尾部的NV UP EI等便是8086標志寄存器的狀態信息了。
debug模式下標志位的含義:
1、OF 值為1時=>OV(overflow),值為0時=>NV(not overflow)
2、DF 值為1時=>DN(decrement),值為0時=>UP(increament)
3、IF 值為1時=>EI(enabled interrupt),值為0時=>DI(disabled interrupt)
4、SF 值為1時=>NG(negative),值為0時=>PL(positive)
5、ZF 值為1時=>ZR(zero),值為0時=>NZ(not zero)
6、AF 值為1時=>AC(auxiliary carry),值為0時=>NA(not auxiliary carry)
7、PF 值為1時=>PE(parity even),值為0時=>PO(parity odd)
8、CF 值為1時=>CY(carry),值為0時=>NC(not carry)
8086有九個標志寄存器,可為什么debug模式下卻只展示了8個flag的信息呢?
這是因為debug模式依賴於8086CPU的單步調試狀態,只有TF=1時debug調試才能正常工作,所以TF位並沒有顯示在debug的CPU視圖中。