LDS/LES/LFS/LGS/LSS - 載入遠指針

操作碼

指令

說明

C5 /r

LDS r16,m16:16

從記憶體將遠指針載入到 DS:r16

C5 /r

LDS r32,m16:32

從記憶體將遠指針載入到 DS:r32

0F B2 /r

LSS r16,m16:16

從記憶體將遠指針載入到 SS:r16

0F B2 /r

LSS r32,m16:32

從記憶體將遠指針載入到 SS:r32

C4 /r

LES r16,m16:16

從記憶體將遠指針載入到 ES:r16

C4 /r

LES r32,m16:32

從記憶體將遠指針載入到 ES:r32

0F B4 /r

LFS r16,m16:16

從記憶體將遠指針載入到 FS:r16

0F B4 /r

LFS r32,m16:32

從記憶體將遠指針載入到 FS:r32

0F B5 /r

LGS r16,m16:16

從記憶體將遠指針載入到 GS:r16

0F B5 /r

LGS r32,m16:32

從記憶體將遠指針載入到 GS:r32

說明

從第二個運算元(源運算元)將遠指針(段選擇器與偏移量)載入到段暫存器與第一個運算元(目標運算元)。源運算元指定記憶體中的 48 位或 32 位指針,具體取決於運算元大小屬性的當前設定(分別為 32 位或 16 位)。指令操作碼與目標運算元指定段暫存器/通用暫存器對。源運算元中的 16 位段選擇器載入到操作碼指定的段暫存器(DS、SS、ES、FS 或 GS)。32 位或 16 位偏移量載入到目標運算元指定的暫存器。

如果在保護模式中執行其中一條指令,則將源運算元中段選擇器指向的段描述符中的其它資訊載入到所選段暫存器的隱藏部分。

還是在保護模式中,空選擇器(值是 0000 到 0003)可以載入到 DS、ES、FS 或 GS 暫存器,而不會導致保護異常。(隨後引用段暫存器中載入空選擇器的段時,將導致一般保護性異常 (#GP),並且不發生該段的記憶體引用)。

操作

IF ProtectedMode
THEN IF SS is loaded
THEN IF SegementSelector null
THEN #GP(0);
FI;
ELSE IF Segment selector index is not within descriptor table limits
OR Segment selector RPL CPL
OR Access rights indicate nonwritable data segment
OR DPL CPL
THEN #GP(selector);
FI;
ELSE IF Segment marked not present
THEN #SS(selector);
FI;
SS SegmentSelector(SRC);
SS SegmentDescriptor([SRC]);
ELSE IF DS, ES, FS, or GS is loaded with non-null segment selector
THEN IF Segment selector index is not within descriptor table limits
OR Access rights indicate segment neither data nor readable code segment
OR (Segment is data or nonconforming-code segment
AND both RPL and CPL > DPL)
THEN #GP(selector);
FI;
ELSE IF Segment marked not present
THEN #NP(selector);
FI;
SegmentRegister SegmentSelector(SRC) AND RPL;
SegmentRegister SegmentDescriptor([SRC]);
ELSE IF DS, ES, FS, or GS is loaded with a null selector:
SegmentRegister NullSelector;
SegmentRegister(DescriptorValidBit) 0; (*hidden flag; not accessible by software*)
FI;
FI;
IF (Real-Address or Virtual-8086 Mode)
THEN
SegmentRegister SegmentSelector(SRC);
FI;
DEST Offset(SRC);

影響的標誌

無。

保護模式異常

#UD - 如果源運算元不是記憶體位置。

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

#GP(選擇器) - 如果給 SS 暫存器載入數據,並且以下任何一個條件為真:段選擇器索引超出描述符表格限制;段選擇器 RPL 不等於 CPL;所選的段不是可寫的數據段;或者是 DPL 不等於 CPL。如果將非空的段選擇器載入到 DS、ES、FS 或 GS 暫存器,並且以下任何一個條件為真:段選擇器索引超出描述符表格限制;所選的段既不是數據段,也不是可讀的程式碼段;或所選的段是數據段或非相容程式碼段,但 RPL 與 CPL 都大於 CPL。

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

#SS(選擇器) - 如果給 SS 暫存器載入數據,並且段標記成不存在。

#NP(選擇器) - 如果將非空的段選擇器載入到 DS、ES、FS 或 GS 暫存器,並且段標記成不存在。

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

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

實地址模式異常

#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

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

#UD - 如果源運算元不是記憶體位置。

虛 8086 模式異常

#UD - 如果源運算元不是記憶體位置。

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

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

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

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。