操作码
指令 | 说明 | |
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 段限制。