前面已經介紹了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零標誌位,記錄相關指令執行後,結果是否為0。通常一位bit的布林變數1表示真,0表示假。zf零標誌位在指令執行的結果為0時,值為真(zf=1);不為0時;不為0時,值為假(zf=0)。
pf奇偶校驗位,記錄相關指令執行後,結果中bit位中1的個數是否為偶數。若1的個數為偶數,則pf=1;反之,若1的個數為奇數,則pf=0。
sf符號標誌位,記錄相關指令執行後,結果是否為負。若結果為負,sf=1;若結果為非負,sf=0。
cf進製標誌位,一般在無符號數運算時,記錄最高位是否產生了進製(例如加法指令),或是否從最高位借位(例如減法指令)。
正是因為存在了cf進製標誌位,8086cpu的暫存器雖然只有16位,雖然在硬體上無法直接進行更大範圍的數的運算(超過2^16),但可以通過軟體的方式,將運算分為多步,將乙個更大的資料(例如兩個64位的數的加法可以分解為4個16位數的相加),通過cf進製標誌位完成運算(adc指令 帶進製的加法指令)。在理論上可以完成任意位資料的運算。
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
有程式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輔助進製標誌,用於表示8位無符號數運算時,4位的半位元組處是否產生進製或者借位。
若af=1表示位元組運算產生低半位元組向高半位元組的進製或借位,否則af=0。輔助進製也稱半進製標誌,主要用於bcd碼運算的十進位制調整。
有程式 mov al 10110001b; add 10100100b。無符號數1011 0001與1010 0100相加時,產生了進製,cf=1;但低四位0001與0100相加並沒有產生進製,因此af=0。
方向標誌位用於指定字串處理時的方向,df=1,以遞減順序處理字串,即位址以從高到低順序遞減。反之,df=0時則以遞增順序處理。
中斷標誌位用於標識中斷是否啟用。if=1,表示cpu允許接受中斷;if=0,表示當前cpu不接受中斷。
跟蹤標誌位用於標識cpu是否允許單步中斷,以進行程式除錯。tf=0時,8086cpu處於正常狀態;tf=1時,8086cpu處於單步狀態,每執行一條指令就自動產生一次單步中斷。
8086的debug功能依賴於8086cpu的單步除錯功能。更進一步,cpu單步中斷的硬體功能,是所有軟體級別的debug單步除錯的基礎,只不過通常高階語言中的單步執行對應的是多條機器硬體指令的執行。
if、tf在8086中斷控制中起到了非常關鍵的作用,在後面的中斷部分會進一步的詳細介紹。
在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檢視中。
8086組合語言學習 五 8086定址方式
前面的部落格都多少提到了8086彙編的記憶體定址,例如mov ax 2345h 而8086彙編還提供了更多 更靈活的定址方式,以滿足多種需求。需要強調的是,無論何種定址方式,記憶體定址的位址總是由基礎位址 偏移位址 段基址 偏移量 組合而成,不同之處在於基礎位址與偏移位址應該從何處獲得。在示例mov...
8086組合語言
cmc 進製位求反指令 stc 進製位置為1指令 cld 方向標誌置1指令 std 方向標誌位置1指令 cli 中斷標誌置0指令 sti 中斷標誌置1指令 nop 無操作 hlt 停機 wait 等待 esc 換碼 lock 封鎖 附上 藍色理想 的彙編學習心得位址 從今天開始溫習彙編了 1 基本概...
8086組合語言學習 三 8086中的段和棧
8086對記憶體定址的方式是通過段位址 16 偏移位址的方式實現的,而在16位的8086cpu下,段位址和偏移位址也都是16位的。這意味著,對於任意乙個段,段的起始位址必定為16的倍數 段位址 16 需要注意,記憶體段的概念並不是記憶體硬體所固有的,而是從cpu定址的角度出發,將記憶體中的物理連續區...