Arguments are passed to functions via the thread's function call
stack. Every thread has its own call stack, which is a small region
of contiguous, fixed-size memory that extends downwards into lower
addresses. The stack is allocated when the thread is instantiated
and deallocated when the thread terminates thus there is minimal
cost in using the stack. Data is pushed and popped from the stack
while a stack pointer keeps track of the top of the stack (the
lowest unused address).