ILD

i386汇编实战:函数调用
作者:Herbert Yuan 邮箱:yuanjp89@163.com
发布时间:2017-7-5 站点:Inside Linux Development

通过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

Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.