標誌註冊

當 x86 算術邏輯單元(ALU)執行 NOTADD 等操作時,它會在特殊的 16 位 FLAGS 暫存器中標記這些操作的結果(變為零溢位變為負)。32 位處理器將其升級為 32 位並將其稱為 EFLAGS,而 64 位處理器將其升級為 64 位並將其稱為 RFLAGS

條件程式碼

但無論名稱如何,暫存器都不能直接訪問(除了幾條指令 - 見下文)。相反,在某些指令中引用了單個標誌,例如條件跳轉或條件集,稱為 JccSETcc,其中 cc 表示條件程式碼並引用下表:

條件程式碼 名稱 定義
EZ 相等,零 ZF == 1
NENZ 不等於,不是零 ZF == 0
O 溢位 OF == 1
NO 沒有溢位 OF == 0
S SF == 1
NS 沒有簽名 SF == 0
P 平價 PF == 1
NP 沒有奇偶性 PF == 0
-————- -— -———
CBNAE 攜帶,下方,不高於或等於 CF == 1
NCNBAE 不攜帶,不低於,高於或等於 CF == 0
ANBE 以上,不低於或等於 CF == 0 和 ZF == 0
NABE 不高於,低於或等於 CF == 1 或 ZF == 1
-————– -— -———
GENL 更大或更相等,而不是更少 SF == OF
NGEL 不大於或等於,小於 SF != OF
GNLE 更大,更小或相等 ZF == 0 和 SF == OF
NGLE 不大於,小於或等於 ZF == 1 或 SF != OF

在 16 位中,從 0 中減去 165,535-1,具體取決於是使用無符號演算法還是帶符號演算法 - 但目標在任何一種情況下都保持 0xFFFF。只有通過解釋條件程式碼才能明確含義。更有說服力是從 0x8000 中減去 1:在無符號算術中,只是將 32,768 變為 32,767; 在簽名算術中,它將 -32,768 改為 32,767 - 一個更值得注意的溢位!

條件程式碼分為表中的三個塊:符號無關,無符號和有符號。後兩個塊中的命名使用 AboveBelow 表示無符號,GreaterLess 表示簽名。所以 JB 將是如果下面跳躍(未簽名),而 JL 將是 Jump if less(簽名)。

直接訪問 FLAGS

上述條件程式碼對於解釋預定義概念很有用,但實際標誌位也可直接使用以下兩條指令:

  • LAHF 使用 Flags 載入 AH 暫存器
  • SAHFAH 儲存到 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 方向標誌。
    記憶體到記憶體操作(如 CMPSMOVS)(在記憶體位置之間進行比較和移動)會自動遞增或遞減索引暫存器作為指令的一部分。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 指令。虛擬監視器可以禁止它,並且如果它執行指令則撒謊到請求任務。