"stdcall介绍" stdcall 调用约定是高级语言中的一种函数调用约定,用于解决函数调用时参数传递问题。在计算机中,没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。因此,计算机提供了一种被称为栈的数据结构来支持参数传递。栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。 stdcall 调用约定是微软公司推出的一个函数调用约定,很多时候被称为 pascal 调用约定,因为 pascal 是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是 stdcall。在 Microsoft C++系列的 C/C++编译器中,常常用 PASCAL 宏来声明这个调用约定,类似的宏还有WINAPI 和 CALLBACK。 stdcall 调用约定的特点是: 1. 参数从右向左压入堆栈 2. 函数自身修改堆栈 3. 函数名自动加前导的下划线,后面紧跟着一个@符号,其后紧跟着参数的尺寸。 例如,一个函数的声明语法为:int __stdcall function(int a,int b) 在函数调用时,参数 b 首先被压栈,然后是参数 a,函数调用 function(1,2)调用处翻译成汇编语言将变成: push 2 push 1 call function 注意此时自动把 cs:eip 入栈 对于函数自身,则可以翻译为: push ebp 保存 ebp 寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp 保存堆栈指针 mov eax,[ebp + 8H] 堆栈中 ebp 指向位置之前依次保存有 ebp,cs:eip,a,b,ebp +8 指向 a add eax,[ebp + 0CH] 堆栈中 ebp + 12 处保存了 b mov esp,ebp 恢复 esp pop ebp ret 8 stdcall 调用约定在编译时,这个函数的名字被翻译成_function@8 cdecl 调用约定是 C 语言缺省的调用约定,它的定义语法是: int function (int a ,int b) int __cdecl function(int a,int b) cdecl 调用约定的特点是: 1. 参数从右向左压入堆栈 2. 函数本身不清理堆栈,调用者负责清理堆栈 例如,一个函数的声明语法为:int __cdecl function(int a,int b) 在函数调用时,参数首先由右向左压入堆栈,然后是参数 a,函数调用 function(1,2)调用处翻译成汇编语言将变成: push 1 push 2 call function add esp,8 注意:这里调用者在恢复堆栈被调用函数_function 处 push ebp 保存 ebp 寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp 保存堆栈指针 mov eax,[ebp + 8H] 堆栈中 ebp 指向位置之前依次保存有 ebp,cs:eip,a,b,ebp +8 指向 a stdcall 调用约定和 cdecl 调用约定都是高级语言中常用的函数调用约定,它们的特点和使用方法都是非常不同的。
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助