background image

6-4 Vol. 1

PROCEDURE CALLS, INTERRUPTS, AND EXCEPTIONS

in the current code segment (near return) or another code segment (far return). Performing such an operation, 
however, should be undertaken very cautiously, using only well defined code entry points.

6.2.5 

Stack Behavior in 64-Bit Mode

In 64-bit mode, address calculations that reference SS segments are treated as if the segment base is zero. Fields 
(base, limit, and attribute) in segment descriptor registers are ignored. SS DPL is modified such that it is always 
equal to CPL. This will be true even if it is the only field in the SS descriptor that is modified. 
Registers E(SP), E(IP) and E(BP) are promoted to 64-bits and are re-named RSP, RIP, and RBP respectively. Some 
forms of segment load instructions are invalid (for example, LDS, POP ES).
PUSH/POP instructions increment/decrement the stack using a 64-bit width. When the contents of a segment 
register is pushed onto 64-bit stack, the pointer is automatically aligned to 64 bits (as with a stack that has a 32-
bit width).

6.3 

CALLING PROCEDURES USING CALL AND RET

The CALL instruction allows control transfers to procedures within the current code segment (near call) and in a 
different code segment (far call). Near calls usually provide access to local procedures within the currently running 
program or task. Far calls are usually used to access operating system procedures or procedures in a different task. 
See “CALL—Call Procedure” in Chapter 3, “Instruction Set Reference, A-L,” of the Intel® 64 and IA-32 Architectures 
Software Developer’s Manual, Volume 2A,
 for a detailed description of the CALL instruction.
The RET instruction also allows near and far returns to match the near and far versions of the CALL instruction. In 
addition, the RET instruction allows a program to increment the stack pointer on a return to release parameters 
from the stack. The number of bytes released from the stack is determined by an optional argument (n) to the RET 
instruction. See “RET—Return from Procedure” in Chapter 4, “Instruction Set Reference, M-U,” of the Intel® 64 and 
IA-32 Architectures Software Developer’s Manual, Volume 2B,
 for a detailed description of the RET instruction.

6.3.1 

Near CALL and RET Operation

When executing a near call, the processor does the following (see Figure 6-2):
1. Pushes the current value of the EIP register on the stack.
2. Loads the offset of the called procedure in the EIP register.
3. Begins execution of the called procedure.
When executing a near return, the processor performs these actions:
1. Pops the top-of-stack value (the return instruction pointer) into the EIP register.
2. If the RET instruction has an optional n argument, increments the stack pointer by the number of bytes 

specified with the n operand to release parameters from the stack.

3. Resumes execution of the calling procedure.

6.3.2 

Far CALL and RET Operation

When executing a far call, the processor performs these actions (see Figure 6-2):
1. Pushes the current value of the CS register on the stack.
2. Pushes the current value of the EIP register on the stack.
3. Loads the segment selector of the segment that contains the called procedure in the CS register.
4. Loads the offset of the called procedure in the EIP register.
5. Begins execution of the called procedure.
When executing a far return, the processor does the following: