第二节 2.2调用约定

1、参数是如何传入堆栈?
2、如何平衡堆栈的?

————————————————————————-


调用约定 参数压栈 平衡堆栈
_cdecl              (C和C++默认的调用约定) 从右至左 调用者清理
_stdcall       API使用的调用约定 从右至左 自身清理
_fastcall ecx/edx传送前两个剩下的从右至左 自身清理(只有2个参数,不需要内平栈)

————————————————————————

_cdecl

cdecl(C declaration,即C声明)是源起C语言的一种调用约定,也是C语言的事实上的标准。

1.函数实参在线程栈上按照从右至左的顺序依次压栈

2.函数结果保存在寄存器EAX/AX/AL中

3.浮点型结果存放在寄存器ST0中

4.编译后的函数名前缀以一个下划线字符    例:sumExample 编译后:_sumExample

5.调用者负责从线程栈中弹出实参(即清栈

6.8比特或者16比特长的整形实参提升为32比特长

7.受到函数调用影响的寄存器(volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS

8.不受函数调用影响的寄存器: EBX, EBP, ESP, EDI, ESI, CS, DS

9.RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)

10.堆栈平衡是由调用函数来执行的(在call [地址],之后会有add esp xx表示参数的字节数

———————————————————-