操作碼 |
指令 |
說明 |
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 指令。
#UD - 在虛 8086 模式中無法執行LAR 指令。