写一段简单的c代码,表征函数之间的嵌套调用,如下:
#include <stdio.h>
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
用如下gcc编译命令进行编译:
gcc -S -o helloworld.s helloworld.c -m32 // -m32指按照32位汇编指令编码
得到的汇编代码如下(删除了跟具体指令无关的文本):
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $3, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $8, %esp
call f
addl $1, %eax
leave
ret
其中一些特殊指令解释如下:
enter:
pushl %ebp
movl %esp, %ebp
leave:
movl %ebp, %esp
popl %ebp
call:
pushl %eip
movl f, %eip
ret:
popl %eip
完整的栈调用流程整理成如下表格: