JMP (x86 instruction)
In the x86 assembly language, the
JMP instruction performs an unconditional jump. Such an instruction transfers the flow of execution by changing the program counter. There are a number of different opcodes that perform a jump; depending on whether the processor is in real mode or protected mode, and an override instruction is used, the instructions may take 16-bit, 32-bit, or segment:offset pointers. There are many different forms of jumps: relative, conditional, absolute and register-indirect jumps.
The following examples illustrate:
- a relative jump with a 16-bit pointer;
- a long jump, a relative jump with a 32-bit pointer;
- and a register-indirect absolute jump using the EAX register.
0x89AB, then load CS with 0xACDC and IP with 0x5578.JMP 0x89AB
JMP 0xACDC:0x5578
Example two: Load EIP with the value
0x56789AB1, only in protected mode or unreal mode.JMP 0x56789AB1
Example three: Jump to the value stored in the EAX register, only in protected mode.
JMP EAX
The
JMP instruction transfers the program's control to a specified location in the code. Unlike function calls, it doesn’t save return information. Instead, it directs execution to a target address, which can be:- An immediate value,
- A general-purpose register, or
- A memory location.
Types of Jumps
TheJMP instruction supports four types of jumps:- Short Jump
- * A jump within the range of -128 to +127 bytes relative to the current instruction pointer.
- Near Jump
- * A jump within the current code segment.
- * The target can be an absolute offset or a relative offset.
- Far Jump
- * A jump to a different code segment, but at the same privilege level.
- * Typically used in intersegment jumps.
- Task Switch
- * A jump to a different task, used in protected mode.
- * The
JMPinstruction can reference a task gate or directly specify a Task State Segment .
Short and Near Jumps
Short Jump
- The relative offset is an 8-bit signed value, specifying the distance from the current
EIP. - The
CSregister remains unchanged.
Near Jump
- The target is within the current code segment and can be:
- * An absolute offset.
- * A relative offset, calculated from the current
EIP.
- For absolute offsets:
- * 16-bit mode clears the upper two bytes of
EIP. - * 32-bit mode allows the full offset range.
- For relative offsets, the size depends on the instruction opcode and operand size attribute.
Far Jumps
Real-Address or Virtual-8086 Mode
- The target address includes both:
- * A segment selector, and
- * An offset.
- Directly: Encoded as a pointer in the instruction.
- Indirectly: Stored in memory and fetched by the instruction.
Protected Mode
In protected mode, far jumps can be used for:- Switching Code Segments
- * A jump to a conforming or non-conforming code segment.
- * The
CSregister is updated with the target segment selector, andEIPis updated with the offset. - Using a Call Gate
- * The target operand specifies a call gate descriptor, which defines the segment and offset to jump to.
- * This approach allows indirect jumps and is preferred for transitions between 16-bit and 32-bit segments.
- Performing a Task Switch
- * The target specifies a task gate or directly references a TSS.
- * The task's segment selectors and the
EIPare loaded from the TSS.