3-510 Vol. 2A JMP—Jump
INSTRUCTION SET REFERENCE, A-M
• A task switch.
(The JMP instruction cannot be used to perform inter-privilege-level far jumps.)
In protected mode, the processor always uses the segment selector part of the far
address to access the corresponding descriptor in the GDT or LDT. The descriptor
type (code segment, call gate, task gate, or TSS) and access rights determine the
type of jump to be performed.
If the selected descriptor is for a code segment, a far jump to a code segment at the
same privilege level is performed. (If the selected code segment is at a different priv-
ilege level and the code segment is non-conforming, a general-protection exception
is generated.) A far jump to the same privilege level in protected mode is very similar
to one carried out in real-address or virtual-8086 mode. The target operand specifies
an absolute far address either directly with a pointer (ptr16:16 or ptr16:32) or indi-
rectly with a memory location (m16:16 or m16:32). The operand-size attribute
determines the size of the offset (16 or 32 bits) in the far address. The new code
segment selector and its descriptor are loaded into CS register, and the offset from
the instruction is loaded into the EIP register. Note that a call gate (described in the
next paragraph) can also be used to perform far call to a code segment at the same
privilege level. Using this mechanism provides an extra level of indirection and is the
preferred method of making jumps between 16-bit and 32-bit code segments.
When executing a far jump through a call gate, the segment selector specified by the
target operand identifies the call gate. (The offset part of the target operand is
ignored.) The processor then jumps to the code segment specified in the call gate
descriptor and begins executing the instruction at the offset specified in the call gate.
No stack switch occurs. Here again, the target operand can specify the far address of
the call gate either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a
memory location (m16:16 or m16:32).
Executing a task switch with the JMP instruction is somewhat similar to executing a
jump through a call gate. Here the target operand specifies the segment selector of
the task gate for the task being switched to (and the offset part of the target operand
is ignored). The task gate in turn points to the TSS for the task, which contains the
segment selectors for the task’s code and stack segments. The TSS also contains the
EIP value for the next instruction that was to be executed before the task was
suspended. This instruction pointer value is loaded into the EIP register so that the
task begins executing again at this next instruction.
The JMP instruction can also specify the segment selector of the TSS directly, which
eliminates the indirection of the task gate. See Chapter 6 in Intel® 64 and IA-32
Architectures Software Developer’s Manual, Volume 3A, for detailed information on
the mechanics of a task switch.
Note that when you execute at task switch with a JMP instruction, the nested task
flag (NT) is not set in the EFLAGS register and the new TSS’s previous task link field
is not loaded with the old task’s TSS selector. A return to the previous task can thus
not be carried out by executing the IRET instruction. Switching tasks with the JMP
instruction differs in this regard from the CALL instruction which does set the NT flag