This HTML version of the file intel.doc from the
PC Game Programmer's guide was produced by Zack T Smith. Fancy HTML modifications are copyright ©
2005-2006 by Zack T Smith, all rights reserved.
This information is provided in the hope that it will be useful,
but without any warranty. It is provided AS-IS,
without even the implied warranty of fitness for a particular purpose.
L Instructions
LAHF - Load Register AH From Flags
Usage: LAHF
Modifies Flags: None
Copies bits 0-7 of the flags register into AH.
This includes flags AF, CF, PF, SF and ZF other bits
are undefined.
AH := SF ZF xx AF xx PF xx CF
Timing:
Clocks
operands | 286 | 386 | 486
| Size in Bytes
|
none | 2 | 2 | 3 | 1
|
LAR - Load Access Rights (286+ protected)
Usage: LAR dest,src
Modifies Flags: ZF
The high byte of the of the destination register is overwritten
by the value of the access rights byte and the low order byte
is zeroed depending on the selection in the source operand.
The Zero Flag is set if the load operation is successful.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg16,reg16 | 14 | 15 | 11 | 3
| reg32,reg32 | | 15 | 11 | 3
| reg16,mem16 | 16 | 16 | 11 | 3-7
| reg32,mem32 | | 16 | 11 | 3-7
|
LEA - Load Effective Address
Usage: LEA dest,src
Modifies Flags: None
Transfers offset address of "src" to the destination register.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg,mem | 3 | 2 | 1 | 2-4
|
LEAVE - Restore Stack for Procedure Exit (80188+)
Usage: LEAVE
Modifies Flags: LEAVE
Releases the local variables created by the previous ENTER
instruction by restoring SP and BP to their condition before
the procedure stack frame was initialized.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| none | 5 | 4 | 5 | 1
|
LES - Load Pointer Using ES
Usage: LES dest,src
Modifies Flags: None
Loads 32-bit pointer from memory source to destination
register and ES. The offset is placed in the destination
register and the segment is placed in ES. To use this
instruction the word at the lower memory address must
contain the offset and the word at the higher address
must contain the segment. This simplifies the loading
of far pointers from the stack and the interrupt vector table.
Timing:
Clocks operands | 286 | 386 | 486 | Size Bytes
|
reg,mem | 7 | 7 | 6 | 2-4
|
reg,mem (PM) | | 22 | 12 | 5-7
|
LFS - Load Pointer Using FS
Usage: LFS dest,src
Modifies Flags: None
Loads 32-bit pointer from memory source to destination
register and FS. The offset is placed in the destination
register and the segment is placed in FS. To use this
instruction the word at the lower memory address must
contain the offset and the word at the higher address must
contain the segment. This simplifies the loading of far pointers
from the stack and the interrupt vector table.
Timing:
Clocks operands | 286 | 386 | 486 | Size Bytes
| reg,mem | 7 | 6 | 5-7
| reg,mem (PM) | 22 | 12 | 5-7
|
LGDT - Load Global Descriptor Table (286+ privileged)
Usage: LGDT src
Modifies Flags: None
Loads a value from an operand into the Global Descriptor Table
(GDT) register.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| mem64 | 11 | 11 | 11 | 5
|
LGS - Load Pointer Using GS (386+)
Usage: LGS dest,src
Modifies Flags: None
Loads 32-bit pointer from memory source to destination
register and GS. The offset is placed in the destination
register and the segment is placed in GS. To use this
instruction the word at the lower memory address must
contain the offset and the word at the higher address must
contain the segment. This simplifies the loading of far pointers
from the stack and the interrupt vector table.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg,mem | | 7 | 6 | 5-7
| reg,mem (PM) | | 22 | 12 | 5-7
|
LIDT - Load Interrupt Descriptor Table (286+ privileged)
Usage: LIDT src
Modifies Flags: None
Loads a value from an operand into the Interrupt Descriptor
Table (IDT) register.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| mem64 | 12 | 11 | 11 | 5
|
LLDT - Load Local Descriptor Table (286+ privileged)
Usage: LLDT src
Modifies Flags: None
Loads a value from an operand into the Local Descriptor Table
Register (LDTR).
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg16 | 17 | 20 | 11 | 3
| mem16 | 19 | 24 | 11 | 5
|
LMSW - Load Machine Status Word (286+ privileged)
Usage: LMSW src
Modifies Flags: None
Loads the Machine Status Word (MSW) from data found at "src".
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg16 | 3 | 10 | 13 | 3
| mem16 | 6 | 13 | 13 | 5
|
LOCK - Lock Bus
Usage: LOCK
LOCK: (386+ prefix)
Modifies Flags: None
This instruction is a prefix that causes the CPU assert bus lock
signal during the execution of the next instruction. Used to
avoid two processors from updating the same data location.
The 286 always asserts lock during an XCHG with memory
operands. This should only be used to lock the bus prior to
XCHG, MOV, IN and OUT instructions.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| none | 0 | 0 | 1 | 1
|
LODS - Load String (Byte, Word or Double)
Usage: LODS src
LODSB
LODSW
LODSD (386+)
Modifies Flags: None
Transfers string element addressed by DS:SI (even if
an operand is supplied) to the accumulator. SI is incremented
based on the size of the operand or based on the instruction
used. If the Direction Flag is set SI is decremented, if
the Direction Flag is clear SI is incremented. Use with REP
prefixes.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| src | 5 | 5 | 5 | 1
|
LOOP - Decrement CX and Loop if CX Not Zero
Usage: LOOP label
Modifies Flags: None
Decrements CX by 1 and transfers control to "label" if CX
is not Zero. The "label" operand must be within -128 or 127
bytes of the instruction following the loop instruction.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| label: jump | 8+m | 11+m | 6 | 2
| no jump | 4 | ? | 2 | 2
|
LOOPE/LOOPZ - Loop While Equal / Loop While Zero
Usage: LOOPE label
LOOPZ label
Modifies Flags: None
Decrements CX by 1 (without modifying the flags) and
transfers control to "label" if CX != 0 and the Zero Flag is set.
The "label" operand must be within -128 or 127 bytes of
the instruction following the loop instruction.
Timing:
Clocks operands | 286 | 386 | 486 | Size Bytes |
label: jump | 8+m | 11+m | 9 | 2
| no jump | 4 | ? | 6 | 2
|
LOOPNE/LOOPNZ - Loop While Not Equal / Loop While Not Zero
Usage: LOOPNZ label
LOOPNE label
Modifies Flags: None
Decrements CX by 1 (without modifying the flags) and
transfers control to "label" if CX != 0 and the Zero Flag
is clear. The "label" operand must be within -128 or 127
bytes of the instruction following the loop instruction.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| label: jump | 8+m | 11+m | 9 | 2
| no jump | 4 | ? | 6 | 2
|
LSL - Load Segment Limit (286+ protected)
Usage: LSL dest,src
Modifies Flags: ZF
Loads the segment limit of a selector into the destination
register if the selector is valid and visible at the current
privilege level. If loading is successful the Zero Flag is set,
otherwise it is cleared.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg16,reg16 | 14 | 20/25 | 10 | 3
| reg32,reg32 | | 20/25 | 10 | 3
| reg16,mem16 | 16 | 21/26 | 10 | 5
| reg32,mem32 | | 21/26 | 10 | 5
|
386 times are listed "byte granular" / "page granular"
LSS - Load Pointer Using SS (386+)
Usage: LSS dest,src
Modifies Flags: None
Loads 32-bit pointer from memory source to destination
register and SS. The offset is placed in the destination
register and the segment is placed in SS. To use this
instruction the word at the lower memory address must
contain the offset and the word at the higher address must
contain the segment. This simplifies the loading of far pointers
from the stack and the interrupt vector table.
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg,mem | | 7 | 6 | 5-7
| reg,mem (PM) | | 22 | 12 | 5-7
|
LTR - Load Task Register (286+ privileged)
Usage: LTR src
Modifies Flags: None
Loads the current task register with the value specified in "src".
Timing:
Clocks
operands | 286 | 386 | 486 | Size Bytes
| reg16 | 17 | 23 | 20 | 3
| mem16 | 19 | 27 | 20 | 5
|
|