美文网首页
函数调用约定

函数调用约定

作者: jiango86 | 来源:发表于2016-12-16 13:55 被阅读0次

1. c调用约定 _cdecl

调用方将参数从右面到左压栈,被调用函数完成后,调用方负责从栈中清除参数。

// c代码
void sum(int a, int b);
int main() {
  sum(10, 20);
}
// 汇编代码
push 20
push 10
call sum
add esp 8
// 或者 编译器预先在栈顶分配了存储空间 
mov [esp + 4], 20
mov [esp], 10
call sum 
这种方式调用sum之后 不需要调整栈指针,GUN(g++和gcc)采用这个技巧。

2. stdcall 调用约定

参数压栈顺序跟cdel一样,只是恢复esp是在被调用者内进行,被调用这采用ret指令。
这种方式的有点是:生成的程序体积稍小 速度稍快, 但是缺点是:对于可变参数的方法不能采用这种方式,只能使用cdecl。

3. fastcall 调用约定

mov edx 20
mov ecx 10
call sum

fastcall是stdcall的变体, 区别是fastcall会使用ecx和edx保存前两个参数。fastcall负责清理esp, 返回的大小减去ecx和edx的大小。

4. c++调用约定

c++静态成员函数就不需要写了,因为他跟普通函数没有区别。
非静态成员函数调用约定,因为需要一个this指针,这个各家编译器有自己的实现,vs系列把this放到ecx里,GUN系列把this作为第一个隐藏参数,this被放到栈顶。

相关文章

  • C函数的调用过程

    函数调用过程 当主函数调用子函数的时候: 在主函数中,将子函数的参数按照一定调用约定(参考调用约定),一般是从右向...

  • 函数调用约定

    援引《C++ Primer(Fifth Edition)》4.1.3节: Order of operand eva...

  • 函数调用约定

    函数调用约定 在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只...

  • 函数调用约定

    1. c调用约定 _cdecl 调用方将参数从右面到左压栈,被调用函数完成后,调用方负责从栈中清除参数。 2. s...

  • 函数调用约定

    最近在研究反汇编相关的东西,看到了一些汇编中函数调用的约定,顺便记录下来。 cdeclx86体系结构的许多C编译器...

  • 11-27函数

    函数 函数的重点是识别调用约定、参数类型和返回值类型 调用约定: cdecl调用方平栈 stdcall被调用方平栈...

  • 各主流处理器与系统平台的ABI和函数调用约定

    System V ABI AMD64在System V ABI上的函数调用约定 MSVC上x64模式的函数调用约定...

  • 常见函数调用约定

    _cdecl 传参顺序:从右到左 参数栈维护:调用者 __stdcall 传参顺序:从右到左 参数栈维护:被调用者...

  • 函数的调用约定

    __cdecl __stdcall

  • 函数调用约定(Calling convention)

    一.基本介绍 函数调用约定,是指当一个函数被调用时,函数的[参数]会被传递给被调用的函数和[返回值]会被返回给调用...

网友评论

      本文标题:函数调用约定

      本文链接:https://www.haomeiwen.com/subject/dagimttx.html