cdelst的dcallfastcall函数调用约定区别学习指导.docVIP

cdelst的dcallfastcall函数调用约定区别学习指导.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在C语言中,假设咱们有这样的一个函数:      int function(int a,int b)      调历时只有用result = function(1,air force low,2)如许的方法就能利用这个函数。然而,当高档语言被编译成计算机可以识另外呆板码时,有一个题目就凸现进去:在CPU中,盘算机没有措施知道一个函数调用必要几多个、甚么样的参数,也没有硬件可以保留这些参数。也便是说,计算机不晓得怎么给这个函数传递参数,传递参数的事情必需由函数调用者和函数自己来和谐。为此,计算机供给了一种被称为栈的数据结构来支撑参数通报。?   栈是一种先辈后出的数据布局,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上偏向栈中参加数据,这个操纵被称为压栈(Push),压栈之后,栈顶主动酿成新加入数据项的地位,栈顶指针也随之修正。用户也能够从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之改动。  函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中获得数据,并举行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。  在参数传递中,有两个很紧张的问题必须失去明确说明:      当参数个数多于一个时,按照什么顺序把参数压入堆栈   函数调用后,由谁来把堆栈恢回复复兴装   在高级语言中,通过函数调用约定来讲明这两个问题。常见的调用约定有:   stdcall   cdecl   fastcall   thiscall   naked call?   stdcall调用约定   stdcall不少时间被称为pascal调用约定,air force 1 mid,因为pascal是初期很常见的一种讲授用计算机程序设计语言,其语法谨严,使用的函数调用约定就是stdcall。在Microsoft C++系列的C/C++编译器中,经常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK。  stdcall调用约定声明的语法为(曩昔文的谁人函数为例):      int __stdcall function(int a,int b)      stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,背面紧跟一个@符号,厥后紧随着参数的尺寸  以上述这个函数为例,参数b起首被压栈,而后是参数a,函数调用function(1,2)挪用处翻译成汇编语言将变为:  push 2        第二个参数入栈   push 1        第一个参数入栈   call function    调用参数,注意此时自动把cs:eip入栈  而对于函数本身,Life, health habits - Qzone log,则可以翻译为:   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  而在编译时,这个函数的名字被翻译成_function@8   注意差别编译器会插入自己的汇编代码以提供编译的通用性,但是大要代码如斯。此中在函数开端处保存esp到ebp中,匈牙利超人奶奶走红 - Qzone日记,在函数收场恢复是编译器罕用的法子。  从函数调用看,2和1挨次被push进堆栈,而在函数中又通过相对付ebp(即刚进函数时的堆栈指针)的偏移量存取参数。函数竣事后,ret 8表现清算8个字节的货仓,函数本身规复了堆栈。     cdecl调用约定   cdecl调用约定又称为C调用约定,是C语言缺省的调用约定,它的定义语法是:  int function (int a ,int b) //不加修饰就是C调用约定   int __cdecl function(int a,int b)//明确指出C调用约定  在写本文时,出乎我的料想,发明cdecl调用约定的参数压栈顺序是和stdcall是同样的,参数首先由右向左压入堆栈。所不同的是,函数自身不清理堆栈,调用者卖力清理堆栈。由于这种变化,C调用约定容许函数的参数的个数是不固定的,这也是C语言的一大特点。对于后面的function函数,使用cdecl后的汇编码变成:   调用场   push 1   p

文档评论(0)

phl805 + 关注
实名认证
文档贡献者

建筑从业资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2023年05月12日上传了建筑从业资格证

1亿VIP精品文档

相关文档