如果一个第三方提供的函数要能被使用,那么必须有约定的函数调用规则。
函数调用规则指的是调用者和被调用函数间传递参数及返回参数的方法
在windows上,常用的有 pascal方式 ,WINAPI 方式(_stdcall),C方式(_cdecl)
_cdecl C调用规则:
参数从右到左进入堆栈
在函数返回后,调用者要负责清除堆栈
_stdcall WINAPI调用规则:
参数从右到左进入堆栈
被调用的函数在返回前自行清理堆栈,所以生成的代码比cdecl小
Pascal 调用规则:win16函数库中的规则,现在基本弃用。
在C语言的程序中,堆栈用来传递函数参数
dword 双字 就是四个字节
ptr pointer缩写 即指针
[]里的数据是一个地址值
这个地址指向一个双字型数据
比如mov eax, dword ptr [12345678]
把内存地址12345678中的
双字型(32位)数据赋给eax
_cdecl 方式下 被调用函数 需要
1 .保存ebp
ebp 被用来保存这个函数执行之前的esp地址
执行完毕后,用ebp 恢复 esp
同时,调用此函数的上层函数也用ebp做同样的事情
所以先把ebp压入堆栈中
返回之前弹出
2 .保存esp 到 ebp 中
3. 在堆栈中腾出一个区域用来保存局部变量
这就是常说的所谓局部变量是保存在栈空间中的