Partial_Flags_Register 是一個警告。
為其發出 Partial_Flags_Register 的指令只讀取尚未失效的前一條指令寫入的一些而不是所有的狀態標誌。(此指令與寫入狀態標誌的指令之間可能存在多達 10 條指令)。EFLAGS 暫存器包含六個狀態標誌:CF(位 0)、PF(位 2)、AF(位 4)、ZF(位 6)、SF(位 7)及 OF(位 11)。另外,此指令還讀取以前未寫入過的狀態標誌。這會導致標誌暫停。
標誌暫停是以下情況之一導致的部分暫存器暫停:
指令既讀取前一條指令寫入的狀態標誌,也讀取未寫入過的狀態標誌。只讀取寫入過的標誌,或只讀取未寫入過的標誌時,都不會發生暫停。
循環移位指令(RCL/R - 帶進位循環左/右移、ROL/R - 循環左/右移)或移位指令(SAL/R - 算術左/右移、SHL/R - 邏輯左/右移)將 CL 暫存器用作移位或循環移位計數器,並且後面跟著使用任何標誌的指令。
要訪問讀取寫入過的標誌時發生標誌暫停,請使用寫入所有標誌的指令;或在讀取標誌的指令之間插入足夠多的指令,使得在第二條指令執行之前,第一條指令已經失效。
要防止將 CL 暫存器用作移位或循環移位計數器時發生標誌暫停,請在讀取 CL 暫存器的移位或循環移位指令之後插入修改所有標誌的指令。
示例:讀取 CL 與讀取標誌的移位或循環移位
此例顯示如何通過在 SAL 移位指令之後插入 CMP 指令(寫入所有標誌)來避免暫停。
原始程式碼 |
優化程式碼 |
|
|
SAL(算術左移)讀取 CL 暫存器。JZ 讀取 ZF 標誌時,會導致標誌暫停。 |
CMP 寫入所有的狀態標誌。 |
示例:讀取修改與未修改的標誌
此示例顯示如何通過在導致暫停的指令之間插入不讀取標誌的指令來避免暫停。
原始程式碼 |
優化程式碼 |
|
|
SAHF(將 AH 寫入標誌)寫入除 OF 之外的所有標誌。JG 除讀取 SF 與 ZF 之外,還讀取 O 、標誌,它會導致標誌暫停。 |
在 SAHF 與 JG 之間插入不讀取標誌的其它指令。 |