函数调用的细节实现
函数调用的细节实现
这个问题当时感觉答得还可以,不过很多细节记不清晰了。所以下面反汇编一段小程序,进行分析,因为我比较熟悉的是arm汇编,所以我选择了一台安装了交叉工具链的ubuntu,而没有使用之前的centos。所以可能画风会有些不同。
下图是我写了一个简单的程序和makefile。程序中是由main函数调用fun()函数。
编译程序,生成可执行文件,并对其进行反汇编,将反汇编之后的信息写入dump文件,打开dump文件,分析其中的关键源码。
可以看出函数调用的过程如下:
1.传递参数,如果参数小于四个,则使用R0-R3 4个寄存器传递,多余4个的通过压栈传输,而压栈选择压变量e而不是选择压变量a,则说明了压栈是从右向左的。
2.使用跳转指令,跳转到相应的函数段。
3.增加栈帧,保存现在的栈基址指针fp,然后重新给栈基址指针fp和栈顶指针sp赋予新值。
4.将通过寄存器传递进来的参数保存入栈。