VERR、VERW - 驗證段的讀取或寫入

操作碼

指令

說明

0F 00 /4

VERR r/m16

如果 r/m16 指定的段可以讀取,則設定 ZF=1

0F 00 /5

VERW r/m16

如果 r/m16 指定的段可以寫入,則設定 ZF=1

說明

驗證源運算元指定的程式碼或數據段是否可以從目前特權級別 (CPL) 讀取 (VERR) 或寫入 (VERW)。源運算元是 16 位暫存器或記憶體位置,它包含要驗證的段的段選擇器。如果段可以訪問,並且可讀 (VERR) 或可寫 (VERW),則設定 ZF 標誌;否則清除 ZF 標誌。程式碼段永遠不會驗證為可寫。此檢查不能在系統段上執行。

要設定 ZF 標誌,必須滿足以下條件:

段選擇器不為空。選擇器表示的描述符必須在描述符表格(GDT 或 LDT)的邊界內。選擇器必須表示程式碼或數據段的描述符(而不是系統段或門的描述符)。對於 VERR 指令,段必須可讀。對於 VERW 指令,段必須是可寫的數據段。如果段不是相容程式碼段,則段的 DPL 必須大於或等於(即特權更小或相同)CPL 與段選擇器的 RPL。

執行的驗證操作與將段選擇器載入到 DS、ES、FS、或 GS 暫存器時執行的相同,並且執行指出的訪問(讀取或寫入)。段選擇器的值不得導致保護異常,以便軟體可以預見可能的段訪問問題。

操作

IF SRC[Offset) > (GDTR(Limit) OR (LDTR(Limit))
THEN
ZF 0
Read segment descriptor;
IF SegmentDescriptor(DescriptorType) 0 (* system segment *)
OR (SegmentDescriptor(Type) conforming code segment)
AND (CPL > DPL) OR (RPL > DPL)
THEN
ZF 0
ELSE
IF ((Instruction VERR) AND (segment readable))
OR ((Instruction VERW) AND (segment writable))
THEN
ZF 1;
FI;
FI;

影響的標誌

如果段可以訪問,並且可讀 (VERR) 或可寫 (VERW),則 ZF 標誌設定為 1;否則清除為 0。

保護模式異常

這些指令只會產生與源運算元的地址非法有關的異常。

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 暫存器用於訪問記憶體,並且它包含空的段選擇器。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#UD - VERR 與 VERW 指令在實地址模式中無法識別。

虛 8086 模式異常

#UD - VERR 與 VERW 指令在虛 8086 模式中無法識別。