通过cc编译c代码来学习,c代码如下:
1 2 3 4 5 6 | extern int a(); int b() { return a(); } |
编译:cc -m32 -S -O0 call.c
1 2 3 4 5 6 7 | b: pushl %ebp movl %esp, %ebp subl $8, %esp call a leave ret |
最主要是维护栈,gcc默认栈对齐到16字节,可以通过-mpreferred-stack-boundary=n选项修改。上述返回地址和ebp已经压入栈了,所以再增长8,即16个字节。
这里由于没有用到caller-saved registers,所以不需要将他们压入栈中。不用再考虑b的父函数,因为b的父函数自己会保存caller-saved registers,如果它用到了这些寄存器的话。
所以,这里直接调用call即可,a已经把返回值放入EAX,所以这里啥也不用做,直接返回即可。
参考
https://stackoverflow.com/questions/1061818/stack-allocation-padding-and-alignmen