LGDT/LIDT - 加载全局/中断描述符表格寄存器
操作碼
| ? | 指令 | 說明 |
| 0F 01 /2 | LGDT m16&32 | 將 m 加載到 GDTR |
| 0F 01 /3 | LIDT m16&32 | 將 m 加載到 IDTR |
說明
將源操作數中的值加載到全局描述符表格寄存器 (GDTR) 或中斷描述符表格寄存器 (IDTR)。源操作數指定 6 字節內存位置,它包含全局描述符表格 (GDT) 或中斷描述符表格 (IDT) 的基址(線性地址)與限制(表格大小,以字節計)。如果操作數大小屬性是 32 位,則將 16 位限制(6 字節數據操作數的 2 個低位字節)與 32 位基址(數據操作數的 4 個高位字節)加載到寄存器。如果操作數大小屬性是 16 位,則加載 16 位限制(2 個低位字節)與 24 位基址(第三、四、五字節)。這里,不使用操作數的高位字節,GDTR 或 IDTR 中基址的高位字節用零填充。
LGDT 與 LIDT 指令僅用在操作系統軟件中;它們不用在應用程序中。在保護模式中,它們是僅有的能夠直接加載線性地址(即,不是段相對地址)與限制的指令。它們通常在實地址模式中執行,以便處理器在切換到保護模式之前進行初始化。
如需有關存儲 GDTR 與 IDTR 內容的詳細信息,請參閱本章中的 SFENCE - 存儲邊界。
操作
IF instruction is LIDT
THEN
IF OperandSize 16
THEN
IDTR(Limit) SRC[0:15];
IDTR(Base) SRC[16:47] AND 00FFFFFFH;
ELSE (* 32-bit Operand Size *)
IDTR(Limit) SRC[0:15];
IDTR(Base) SRC[16:47];
FI;
ELSE (* instruction is LGDT *)
IF OperandSize 16
THEN
GDTR(Limit) SRC[0:15];
GDTR(Base) SRC[16:47] AND 00FFFFFFH;
ELSE (* 32-bit Operand Size *)
GDTR(Limit) SRC[0:15];
GDTR(Base) SRC[16:47];
FI; FI;
影響的標志
無。
保護模式異常
#UD - 如果源操作數不是內存位置。
#GP(0) - 如果當前特權級別不是 0。如果內存操作數有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 寄存器用于訪問內存,并且它包含空的段選擇器。
#SS(0) - 如果內存操作數有效地址超出 SS 段限制。
#PF(錯誤代碼) - 如果發生頁錯誤。
實地址模式異常
#UD - 如果源操作數不是內存位置。
#GP - 如果內存操作數有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS - 如果內存操作數有效地址超出 SS 段限制。
虛 8086 模式異常
#GP(0) - 如果內存操作數有效地址超出 CS、DS、ES、FS 或 GS 段限制。
總結
以上是生活随笔為你收集整理的LGDT/LIDT - 加载全局/中断描述符表格寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《一个操作系统的实现》——pmtest1
- 下一篇: 保护模式下GDTR,LDTR,全局描述符