background image

Vol. 1 6-3

PROCEDURE CALLS, INTERRUPTS, AND EXCEPTIONS

word boundary). One exception to this rule is when the contents of a segment register (a 16-bit segment selector) 
are pushed onto a 32-bit wide stack. Here, the processor automatically aligns the stack pointer to the next 32-bit 
boundary.
The processor does not check stack pointer alignment. It is the responsibility of the programs, tasks, and system 
procedures running on the processor to maintain proper alignment of stack pointers. Misaligning a stack pointer 
can cause serious performance degradation and in some instances program failures.

6.2.3 

Address-Size Attributes for Stack Accesses

Instructions that use the stack implicitly (such as the PUSH and POP instructions) have two address-size attributes 
each of either 16 or 32 bits. This is because they always have the implicit address of the top of the stack, and they 
may also have an explicit memory address (for example, PUSH Array1[EBX]). The attribute of the explicit address 
is determined by the D flag of the current code segment and the presence or absence of the 67H address-size 
prefix.
The address-size attribute of the top of the stack determines whether SP or ESP is used for the stack access. Stack 
operations with an address-size attribute of 16 use the 16-bit SP stack pointer register and can use a maximum 
stack address of FFFFH; stack operations with an address-size attribute of 32 bits use the 32-bit ESP register and 
can use a maximum address of FFFFFFFFH. The default address-size attribute for data segments used as stacks is 
controlled by the B flag of the segment’s descriptor. When this flag is clear, the default address-size attribute is 16; 
when the flag is set, the address-size attribute is 32.

6.2.4 Procedure 

Linking 

Information

The processor provides two pointers for linking of procedures: the stack-frame base pointer and the return instruc-
tion pointer. When used in conjunction with a standard software procedure-call technique, these pointers permit 
reliable and coherent linking of procedures.

6.2.4.1  

Stack-Frame Base Pointer

The stack is typically divided into frames. Each stack frame can then contain local variables, parameters to be 
passed to another procedure, and procedure linking information. The stack-frame base pointer (contained in the 
EBP register) identifies a fixed reference point within the stack frame for the called procedure. To use the stack-
frame base pointer, the called procedure typically copies the contents of the ESP register into the EBP register prior 
to pushing any local variables on the stack. The stack-frame base pointer then permits easy access to data struc-
tures passed on the stack, to the return instruction pointer, and to local variables added to the stack by the called 
procedure.
Like the ESP register, the EBP register automatically points to an address in the current stack segment (that is, the 
segment specified by the current contents of the SS register). 

6.2.4.2  

Return Instruction Pointer

Prior to branching to the first instruction of the called procedure, the CALL instruction pushes the address in the EIP 
register onto the current stack. This address is then called the return-instruction pointer and it points to the 
instruction where execution of the calling procedure should resume following a return from the called procedure. 
Upon returning from a called procedure, the RET instruction pops the return-instruction pointer from the stack 
back into the EIP register. Execution of the calling procedure then resumes.
The processor does not keep track of the location of the return-instruction pointer. It is thus up to the programmer 
to insure that stack pointer is pointing to the return-instruction pointer on the stack, prior to issuing a RET instruc-
tion. A common way to reset the stack pointer to the point to the return-instruction pointer is to move the contents 
of the EBP register into the ESP register. If the EBP register is loaded with the stack pointer immediately following 
a procedure call, it should point to the return instruction pointer on the stack.
The processor does not require that the return instruction pointer point back to the calling procedure. Prior to 
executing the RET instruction, the return instruction pointer can be manipulated in software to point to any address