LAR - 載入訪問許可權位元組

操作碼

指令

說明

0F 02 /r

LAR r16,r/m16

r16 用 FF00H 掩碼 r/m16

0F 02 /r

LAR r32,r/m32

r32 用 00FxFF00H 掩碼 r/m32

說明

從第二個運算元(源運算元)指定的段描述符將訪問許可權載入到第一個運算元(目標運算元),並設定 EFLAGS 暫存器中的 ZF 標誌。源運算元(可以是暫存器或記憶體位置)包含要訪問的段描述符的段選擇器。目標運算元是通用暫存器。

作為載入過程的一部分,處理器會執行訪問檢查。載入到目標暫存器之後,軟體就可以在訪問許可權資訊上執行附加的檢查。

運算元大小為 32 位時,段描述符的訪問許可權包括型別與 DPL 欄位以及 S、P、AVL、D/B 及 G 標誌,它們都位於段描述符的第二個雙字(位元組 4 到 7)。在載入到目標運算元之前,此雙字使用 00FXFF00H 掩碼。運算元大小為 16 位時,訪問許可權包括型別與 DPL 欄位。這裡,在載入到目標運算元之前,雙字的兩個低位位元組使用 FF00H 掩碼。

將訪問許可權載入到目標暫存器之前,此指令執行以下檢查:

檢查段選擇器是否為空。檢查段選擇器指向的描述符是否在訪問的 GDT 或 LDT 限制範圍內。所有的程式碼與數據段描述符對於 LAR 指令是否都有效(能夠訪問)。有效的系統段與門描述符型別見下表。如果段不是相容程式碼段,則指令檢查在 CPL 處是否可以看見指定的段描述符(即,檢查段選擇器的 CPL 與 RPL 是否小於或等於段選擇器的 DPL)。

如果指令無法訪問段描述符,或是其型別對於此指令而言無效,則清除 ZF 標誌,並且不將訪問許可權載入到目標運算元。

LAR 指令只能在保護模式中執行。

型別

名稱

有效

0

保留

1

可用的 16 位 TSS

2

LDT

3

正忙的 16 位 TSS

4

16 位呼叫門

5

16 位/32 位任務門

6

16 位中斷門

7

16 位陷阱門

8

保留

9

可用的 32 位 TSS

A

保留

B

正忙的 32 位 TSS

C

32 位呼叫門

D

保留

E

32 位中斷門

F

32 位陷阱門

操作

IF SRC[Offset) > descriptor table limit THEN ZF 0; FI;
Read segment descriptor;
IF SegmentDescriptor(Type) conforming code segment
AND (CPL > DPL) OR (RPL > DPL)
OR Segment type is not valid for instruction
THEN
ZF 0
ELSE
IF OperandSize 32
THEN
DEST [SRC] AND 00FxFF00H;
ELSE (*OperandSize 16*)
DEST [SRC] AND FF00H;
FI;
FI;

影響的標誌

如果訪問許可權載入成功,則 ZF 標誌設定為 1;否則清除為 0。

保護模式異常

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

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

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

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

實地址模式異常

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

虛 8086 模式異常

#UD - 在虛 8086 模式中無法執行LAR 指令。