標誌註冊
當 x86 算術邏輯單元(ALU)執行 NOT
和 ADD
等操作時,它會在特殊的 16 位 FLAGS
暫存器中標記這些操作的結果(變為零,溢位,變為負)。32 位處理器將其升級為 32 位並將其稱為 EFLAGS
,而 64 位處理器將其升級為 64 位並將其稱為 RFLAGS
。
條件程式碼
但無論名稱如何,暫存器都不能直接訪問(除了幾條指令 - 見下文)。相反,在某些指令中引用了單個標誌,例如條件跳轉或條件集,稱為 Jcc
和 SETcc
,其中 cc
表示條件程式碼並引用下表:
條件程式碼 | 名稱 | 定義 |
---|---|---|
E ,Z |
相等,零 | ZF == 1 |
NE ,NZ |
不等於,不是零 | ZF == 0 |
O |
溢位 | OF == 1 |
NO |
沒有溢位 | OF == 0 |
S |
籤 | SF == 1 |
NS |
沒有簽名 | SF == 0 |
P |
平價 | PF == 1 |
NP |
沒有奇偶性 | PF == 0 |
-————- | -— | -——— |
C ,B ,NAE |
攜帶,下方,不高於或等於 | CF == 1 |
NC ,NB ,AE |
不攜帶,不低於,高於或等於 | CF == 0 |
A ,NBE |
以上,不低於或等於 | CF == 0 和 ZF == 0 |
NA ,BE |
不高於,低於或等於 | CF == 1 或 ZF == 1 |
-————– | -— | -——— |
GE ,NL |
更大或更相等,而不是更少 | SF == OF |
NGE ,L |
不大於或等於,小於 | SF != OF |
G ,NLE |
更大,更小或相等 | ZF == 0 和 SF == OF |
NG ,LE |
不大於,小於或等於 | ZF == 1 或 SF != OF |
在 16 位中,從 0
中減去 1
是 65,535
或 -1
,具體取決於是使用無符號演算法還是帶符號演算法 - 但目標在任何一種情況下都保持 0xFFFF
。只有通過解釋條件程式碼才能明確含義。更有說服力是從 0x8000
中減去 1
:在無符號算術中,只是將 32,768
變為 32,767
; 在簽名算術中,它將 -32,768
改為 32,767
- 一個更值得注意的溢位!
條件程式碼分為表中的三個塊:符號無關,無符號和有符號。後兩個塊中的命名使用 Above
和 Below
表示無符號,Greater
或 Less
表示簽名。所以 JB
將是如果下面跳躍(未簽名),而 JL
將是 Jump if less
(簽名)。
直接訪問 FLAGS
上述條件程式碼對於解釋預定義概念很有用,但實際標誌位也可直接使用以下兩條指令:
LAHF
使用 Flags 載入AH
暫存器SAHF
將AH
儲存到 Flags 中
使用這些指令僅複製某些標誌。整個 FLAGS
/ EFLAGS
/ RFLAGS
暫存器可以在堆疊中儲存或恢復:
PUSHF
/POPF
將 16 位FLAGS
推入/彈出堆疊PUSHFD
/POPFD
將 32 位EFLAGS
推入/彈出堆疊PUSHFQ
/POPFQ
將 64 位RFLAGS
推入/彈出堆疊
請注意,中斷會自動儲存並恢復當前的 [R/E]FLAGS
暫存器。
其他標誌
除了上面描述的 ALU 標誌之外,FLAGS
暫存器還定義了其他系統狀態標誌:
IF
中斷標誌。
這是通過STI
指令設定為全域性啟用中斷,並使用CLI
指令清除以全域性禁用中斷。DF
方向標誌。
記憶體到記憶體操作(如CMPS
和MOVS
)(在記憶體位置之間進行比較和移動)會自動遞增或遞減索引暫存器作為指令的一部分。DF
標誌指示哪一個發生:如果用CLD
指令清除,它們會增加; 如果使用STD
指令設定,它們會遞減。TF
陷阱標誌。這是一個除錯標誌。設定它將使處理器進入單步模式:執行每條指令後,它將呼叫單步中斷處理程式,預計將由偵錯程式處理。沒有設定或清除此標誌的指令:你需要在記憶體中操作該位。
80286 標誌
為了支援 80286 中的新多工設施,英特爾為 FLAGS
暫存器新增了額外的標誌:
IOPL
I / O 許可權級別。
為了保護多工程式碼,某些任務需要訪問 I / O 埠的許可權,而其他任務必須停止訪問它們。英特爾推出了四級許可權級別,其中00
2 享有最高許可權,而11
2 則最少。如果IOPL
小於當前的許可權級別,則任何訪問 I / O 埠或啟用或禁用中斷的嘗試都將導致一般性保護錯誤。NT
巢狀任務標誌。
如果一個任務提示另一個任務導致上下文切換,則設定此標誌。設定標誌告訴處理器在執行RET
時執行上下文切換。
80386 標誌
‘386 需要額外的標誌來支援處理器中設計的額外功能。
RF
簡歷標誌。
`386 新增了除錯暫存器,它可以在各種硬體訪問上呼叫偵錯程式,如讀,寫或執行某個儲存位置。但是,當除錯處理程式返回執行指令時*,訪問將立即重新呼叫除錯處理程式!* 或者至少它不會用於 Resume Flag,它會在進入除錯處理程式時自動設定,並在每條指令後自動清除。如果設定了 Resume Flag,則不會呼叫 Debug 處理程式。VM
虛擬 8086 標誌。
為了支援較舊的 16 位程式碼以及較新的 32 位程式碼,80386 可以在“虛擬 8086”模式下執行 16 位任務,藉助 Virtual 8086 執行程式。VM
標誌表明此任務是虛擬 8086 任務。
80486 標誌
隨著英特爾架構的改進,它通過快取和超標量執行等技術得到了更快的發展。這必須通過做出假設來優化對系統的訪問。為了控制這些假設,需要更多的標誌:
AC
對齊檢查標誌 x86 架構總是可以在任何位元組邊界上訪問多位元組記憶體值,這與一些需要它們進行大小對齊的架構(4 位元組值需要在 4 位元組邊界上)不同。但是,這樣做的效率較低,因為訪問未對齊資料需要多次記憶體訪問。如果設定了AC
標誌,那麼未對齊的訪問將引發異常而不是執行程式碼。這樣,在使用AC
設定開發期間可以改進程式碼,但是關閉生產程式碼。
奔騰標誌
Pentium 為虛擬化增加了更多支援,並支援 CPUID
指令:
VIF
虛擬中斷標誌。
這是此任務的IF
的虛擬副本 - 此任務是否要禁用中斷,而不會實際影響全域性中斷。VIP
虛擬中斷掛起標誌。
這表明VIF
實際上阻止了一箇中斷,所以當 Task 執行一個STI
時,可以為它提出一個虛擬中斷。ID
CPUID
允許的標誌。
是否允許此任務執行CPUID
指令。虛擬監視器可以禁止它,並且如果它執行指令則撒謊到請求任務。