函数调用约定

编程
Article Directory

概述

80x86 函数调用约定,主要是 cdecl 、stdcall 、fastcall、thiscall

函数调用约定通常规定一下内容:

  1. 参数的传递方式和传递顺序

    规定参数以何种方式和顺序传递

  2. 栈的维护方式

    规定是由调用函数还是被调用函数负责将参数清理出栈

  3. 产生函数修饰名的方法

    在编译程序时,编译器为了区分不同的函数或方法,对函数或方法名进行修饰。

cdecl

C/C++语言默认的调用方式。

传递顺序:从右到左 顺序入栈

栈维护方式:调用者清除参数,被称为手动清栈,返回值在EAX中

函数名修饰方法:使用_作为前缀,

stdcall

Win32API 的调用方式

传递顺序:从右到左 顺序入栈

栈维护方式:被调用函数在返回后清栈,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。

fastcall

MicroSoft 专用,改约定只适用于x86 cpu

传递顺序:自作向右,前两个DWORD 值或更小变量在 ECX 和 EDX 中其他参数在堆栈上,自右向左传递

栈维护方式:被调函数被在返回前,清除栈中参数。

thiscall

c++ 类中默认的函数方法调用方式,只适用于c++。

传递顺序:thiscall调用约定函数参数按照从右向左的顺序入栈。若参数数目固定,则类实例的this指针通过ECX寄存器传递给被调函数。若参数数目不定,则this指针在所有参数入栈后再入栈,主调函数清理堆栈。

栈维护方式:被调函数自身清理堆栈;

Author: 哒琳

Permalink: http://blog.jieis.cn/2021/cccf0b22-653c-48ea-ad95-457354c1bcf1.html

Comments