What are primitives?
What are calling conventions?
What is the stack?
How do pushl and popl affect the stack? What special-purpose register do they affect?
What are local variables and what are they used for?
Why are local variables so necessary in recursive functions?
What are %ebp and %esp used for?
What is a stack frame?
Write a function called square which receives one argument and returns the square of that argument.
Write a program to test your square function.
Convert the maximum program given in the Section called Finding a Maximum Value in Chapter 3 so that it is a function which takes a pointer to several values and returns their maximum. Write a program that calls maximum with 3 different lists, and returns the result of the last one as the program's exit status code.
Explain the problems that would arise without a standard calling convention.
Do you think it's better for a system to have a large set of primitives or a small one, assuming that the larger set can be written in terms of the smaller one?
The factorial function can be written non-recursively. Do so.
Find an application on the computer you use regularly. Try to locate a specific feature, and practice breaking that feature out into functions. Define the function interfaces between that feature and the rest of the program.
Come up with your own calling convention. Rewrite the programs in this chapter using it. An example of a different calling convention would be to pass parameters in registers rather than the stack, to pass them in a different order, to return values in other registers or memory locations. Whatever you pick, be consistent and apply it throughout the whole program.
Can you build a calling convention without using the stack? What limitations might it have?
What test cases should we use in our example program to check to see if it is working properly?