lldt
Load Local Descriptor Table Register
Loads LDT segment selector (Privileged).
Pseudocode Operation
LDTR ← r/m16
// Selector is validated; if invalid, LDTR is cleared
Example
Encoding
Operands
-
dest
16-bit register or memory
Related
More in System
Reference
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| 0F 00 /2 | LLDT r/m16 | M | Valid Valid | Load segment selector r/m16 into LDTR. |
Description
Loads the source operand into the segment selector field of the local descriptor table register (LDTR). The source operand (a general-purpose register or a memory location) contains a segment selector that points to a local descriptor table (LDT). After the segment selector is loaded in the LDTR, the processor uses the segment selector to locate the segment descriptor for the LDT in the global descriptor table (GDT). It then loads the segment limit and base address for the LDT from the segment descriptor into the LDTR. The segment registers DS, ES, SS, FS, GS, and CS are not affected by this instruction, nor is the LDTR field in the task state segment (TSS) for the current task. If bits 2-15 of the source operand are 0, LDTR is marked invalid and the LLDT instruction completes silently. However, all subsequent references to descriptors in the LDT (except by the LAR, VERR, VERW or LSL instructions) cause a general protection exception (#GP). The operand-size attribute has no effect on this instruction. The LLDT instruction is provided for use in operating-system software; it should not be used in application programs. This instruction can only be executed in protected mode or 64-bit mode. In 64-bit mode, the operand size is fixed at 16 bits.
Operation
IF SRC(Offset) > descriptor table limit THEN #GP(segment selector); FI; IF segment selector is valid Read segment descriptor; IF SegmentDescriptor(Type) ≠ LDT THEN #GP(segment selector); FI; IF segment descriptor is not present THEN #NP(segment selector); FI; LDTR(SegmentSelector) := SRC; LDTR(SegmentDescriptor) := GDTSegmentDescriptor; ELSE LDTR := INVALID FI;