X86/Win32函数调用规范研究
一、函数调用总体框图如下:
二、C语言函数如下:
四、解释如下:
1、程序把esp的老值先压入堆栈,然后把esp赋值给ebp,ebp不变,esp变化。
2、esp=esp-12,这样做是为了放入局部变量。程序往ebp-4和ebp-c分别存入3和2,留ebp-8的位置存 以后计算出来的两数和。
3、压入堆栈参数2和3,此时esp又减了8。call指令把返回地址压入堆栈。
4、子函数先把上面的EBP的值压入堆栈,把把esp赋值给ebp,ebp不变,esp变化。
5、又一条无效的指令把ecx压入堆栈,此时esp又减了12。用bp+8和bp+12娶到局部变量,相加后复制给eax。
6、把ebp赋给esp,之后把上面ebp的值恢复(pop bp),ret指令把返回地址。
7、esp=esp+8,因为调用子函数时压入了两个参数。
8、把ebp赋给esp,之后把再上面ebp的值(图中没有显示)恢复,ret指令把返回地址。
注:红色标注表示图中esp的位置。