標誌註冊
當 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 暫存器新增了額外的標誌:
IOPLI / O 許可權級別。
為了保護多工程式碼,某些任務需要訪問 I / O 埠的許可權,而其他任務必須停止訪問它們。英特爾推出了四級許可權級別,其中002 享有最高許可權,而112 則最少。如果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時,可以為它提出一個虛擬中斷。IDCPUID允許的標誌。
是否允許此任務執行CPUID指令。虛擬監視器可以禁止它,並且如果它執行指令則撒謊到請求任務。