Intel 64 and IA-32 Architectures Software Developers Manual Volume 1, Basic Architecture
6-8 Vol. 1
PROCEDURE CALLS, INTERRUPTS, AND EXCEPTIONS
use the stack-frame base pointer (in the EBP register) to make a frame boundary for
easy access to the parameters.
The stack can also be used to pass parameters back from the called procedure to the
calling procedure.
6.3.3.3 Passing Parameters in an Argument List
An alternate method of passing a larger number of parameters (or a data structure)
to the called procedure is to place the parameters in an argument list in one of the
data segments in memory. A pointer to the argument list can then be passed to the
called procedure through a general-purpose register or the stack. Parameters can
also be passed back to the calling procedure in this same manner.
6.3.4 Saving Procedure State Information
The processor does not save the contents of the general-purpose registers, segment
registers, or the EFLAGS register on a procedure call. A calling procedure should
explicitly save the values in any of the general-purpose registers that it will need
when it resumes execution after a return. These values can be saved on the stack or
in memory in one of the data segments.
The PUSHA and POPA instructions facilitate saving and restoring the contents of the
general-purpose registers. PUSHA pushes the values in all the general-purpose
registers on the stack in the following order: EAX, ECX, EDX, EBX, ESP (the value
prior to executing the PUSHA instruction), EBP, ESI, and EDI. The POPA instruction
pops all the register values saved with a PUSHA instruction (except the ESP value)
from the stack to their respective registers.
If a called procedure changes the state of any of the segment registers explicitly, it
should restore them to their former values before executing a return to the calling
procedure.
If a calling procedure needs to maintain the state of the EFLAGS register, it can save
and restore all or part of the register using the PUSHF/PUSHFD and POPF/POPFD
instructions. The PUSHF instruction pushes the lower word of the EFLAGS register on
the stack, while the PUSHFD instruction pushes the entire register. The POPF instruc-
tion pops a word from the stack into the lower word of the EFLAGS register, while the
POPFD instruction pops a double word from the stack into the register.
6.3.5 Calls to Other Privilege Levels
The IA-32 architecture’s protection mechanism recognizes four privilege levels,
numbered from 0 to 3, where a greater number mean less privilege. The reason to
use privilege levels is to improve the reliability of operating systems. For example,
Figure 6-3 shows how privilege levels can be interpreted as rings of protection.