• 调用惯例


    调用惯例 出栈方 参数传递 名字修饰
    cdecl 函数调用方 从右至左的顺序压参数入栈 下划线+函数名
    stdcall 函数本身 从右至左的顺序压参数入栈 下划线+函数名+@+参数字节数,如函数int func(int a, double b)的修饰名是_func@12
    fastcall 函数本身 头两个DWORD(4字节)类型或者占用更少字节的参数被放入寄存器,其他剩下的参数按从右到左的顺序压入栈 @+函数名+@+参数的字节数
    pascal 函数本身 从左至右的顺序压参数入栈 较为复杂,参加pascal文档

    此外,不少编译器还提供一种称为naked call的调用惯例,这种调用惯例用在特殊的场合,其特点是编译器不产生任何保护寄存器的代码,故称naked call。

    对c++而言,以上几种调用惯例的名字修饰策略都略有所改变,因为c++支持函数重载以及命名空间和成员函数等等,因此实际上一个 函数名可以对应多个函数定义,那么上面提到的名字修饰策略显然无法区分各个不同同名函数定义的。所以c++有自己更加复杂的名字修饰策略。最后,c++还有自己一种特殊的调用惯例,称为thiscall,专门用于类成员函数的调用,其特点随编译器不同而不同,在vc里是将this指针存放于eax寄存器,参数从右到左压栈,而对于gcc、thiscall和cdecl完全一样,只是将this看作是函数的第一参数。

  • 相关阅读:
    java ,js获取web工程路径
    js 无刷新分页代码
    js 获取时间对象代码
    jquery 文本框失去焦点显示提示信息&&单击置空文本框
    CodeForces
    nth_element() O(n)复杂度求第k+1小元素
    CodeForces
    HDU
    杜教BM
    J
  • 原文地址:https://www.cnblogs.com/fr-ruiyang/p/13714114.html
Copyright © 2020-2023  润新知