Caller's frame | |
last arg | |
%esp+4 | 1st arg |
%esp | return address |
To get an idea of how this can be used, let us say we have the following function:
int isum(int N, int *v);
So, we want to sum up the vector v, and return the sum. Let us say that we are going to use all 7 integer registers, and put N into eax and v into edx. Our function prologue would then look like:
# int isum(int N, int *v) .global isum .type isum,@function isum: # # Save non-scratch registers # subl $16, %esp movl %ebx, (%esp) movl %ebp, 4(%esp) movl %esi, 8(%esp) movl %edi, 12(%esp) # # Load N and v # movl 20(%esp), %eax movl 24(%esp), %edx
Assuming we accumulated our integer sum into ecx, the function epilogue would then consist of:
# # Set return value # movl %ecx, %eax # # Restore registers # movl (%esp), %ebx movl 4(%esp), %ebp movl 8(%esp), %esi movl 12(%esp), %edi addl $16, %esp ret