最近在看王爽的《汇编基础》。通过阅读函数调用那一章,同时结合debug研究C的代码,明白了函数调用时的一些动作。把我的心得写在这里请大家指正。
程序采用调用者压栈时,一个程序进入后第一件事是将bp寄存器压栈,然后将sp赋给bp,然后sp -=40h。同样函数退出的时候,最后也会反过来执行这套组合。这样做可以一举两得,通过bp我们可以知道调用者的sp,从而获得传入参数地址。而sp自 减40h则是为了在栈空间给这个函数分配新的一段栈内存,以免和调用者的栈内存太近,容易异常。注意,如果函数声明了函数内部的变量,sp则要自减 40h+变量长度。
接下来函数会将调用者的三个偏移地址寄存器bx,si,di压栈,函数就可以使用这三个寄存器了。同样在函数退出的时候需要出栈。
然后函数会将bp到sp之间内存赋值为0CCCCCCCCH。
如果这个函数需要调用另外一个子函数,那么它需要先将参数按照从左到右的顺序挨个赋到ax(或别的寄存器)中并将ax压栈。然后调用子函数,子函数退出后将参数出栈——一般直接sp+参数长度就表示出栈了。
1157

被折叠的 条评论
为什么被折叠?



