|

Here’s
what happens when a program, running on a PC under
DOS, branches to a function:
1.
The address in the instruction pointer is incremented
to the next instruction past the function call.
That address is then placed on the stack, and it
will be the return address when the function returns.
2.
Room is made on the stack for the return type you’ve
declared. On a system with two-byte integers, if
the return type is declared to be int, another two
bytes are added to the stack, but no value is placed
in these bytes.
3.
The address of the called function, which is kept
in a special area of memory set aside for that purpose,
is loaded into the instruction pointer, so the next
instruction executed will be in the called function.
4.
The current top of the stack is now noted and is
held in a special pointer called the stack frame.
Everything added to the stack from now until the
function returns will be considered
"local" to the function.
5.
All the arguments to the function are placed on
the stack.
6.
The instruction now in the instruction pointer is
executed, thus executing the first instruction in
the function.
7.
Local variables are pushed onto the stack as they
are defined.
When
the function is ready to return, the return value
is placed in the area of the stack reserved at step
2. The stack is then popped all the way up to the
stack frame pointer, which effectively throws away
all the local variables and the arguments to the
function.
The
return value is popped off the stack and assigned
as the value of the function call itself, and the
address stashed away in step 1 is retrieved and
put into the instruction pointer. The program thus
resumes immediately after the function call, with
the value of the function retrieved.
Some
of the details of this process change from compiler
to compiler, or between computers, but the essential
ideas are consistent across environments. In general,
when you call a function, the return address and
the parameters are put on the stack. During the
life of the function, local variables are added
to the stack. When the function returns, these are
all removed by popping the stack.
In
coming chapters we’ll look at other places in memory
that are used to hold data that must persist beyond
the life of the function.
|