EFLAGS 暫存器暫停警告

Partial_Flags_Register 是一個警告。

為其發出 Partial_Flags_Register 的指令只讀取尚未失效的前一條指令寫入的一些而不是所有的狀態標誌。(此指令與寫入狀態標誌的指令之間可能存在多達 10 條指令)。EFLAGS 暫存器包含六個狀態標誌:CF(位 0)、PF(位 2)、AF(位 4)、ZF(位 6)、SF(位 7)及 OF(位 11)。另外,此指令還讀取以前寫入過的狀態標誌。這會導致標誌暫停。

標誌暫停是以下情況之一導致的部分暫存器暫停:

建議

要訪問讀取寫入過的標誌時發生標誌暫停,請使用寫入所有標誌的指令;或在讀取標誌的指令之間插入足夠多的指令,使得在第二條指令執行之前,第一條指令已經失效。

要防止將 CL 暫存器用作移位或循環移位計數器時發生標誌暫停,請在讀取 CL 暫存器的移位或循環移位指令之後插入修改所有標誌的指令。

示例:讀取 CL 與讀取標誌的移位或循環移位

此例顯示如何通過在 SAL 移位指令之後插入 CMP 指令(寫入所有標誌)來避免暫停。

原始程式碼

優化程式碼

sal eax, cl jz label

sal eax, cl cmp eax, 0 jz label

SAL(算術左移)讀取 CL 暫存器。JZ 讀取 ZF 標誌時,會導致標誌暫停。

CMP 寫入所有的狀態標誌。
JG 可以讀取 ZF 標誌,而不會導致暫停。

示例:讀取修改與未修改的標誌

此示例顯示如何通過在導致暫停的指令之間插入不讀取標誌的指令來避免暫停。

原始程式碼

優化程式碼

sahf jg label

sahf other instructions jg label

SAHF(將 AH 寫入標誌)寫入除 OF 之外的所有標誌。JG 除讀取 SF 與 ZF 之外,還讀取 O 、標誌,它會導致標誌暫停。

在 SAHF 與 JG 之間插入不讀取標誌的其它指令。
JG 在 SAHF 失效之後執行。因此獲取 JG 時,它不必等待。

影響的處理器