编译链接运行原理---函数调用约定

一、定义:函数调用约定,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值。

调用约定,约束的是:

          1.实参入栈顺序

          2.形参的开辟和清理方式

          3.约定函数符号的生成

二、几种类型:__stdcall,__cdecl,__fastcall,__thiscall,__nakedcall,__pascal

__caecl c标准调用约定

__stdcall windows标准的调用约定

__fastcall 快速调用约定

__thiscall 类成员方法调用约定

三、函数参数传递顺序和方式:

1.从右到左依次入栈:__stdcall,__cdecl,__thiscall

2.从左到右依次入栈:__pascal,__fastcall

四、栈的维护方式(开辟和清理方式)

__caecl c     调用方开辟,调用方清理

__stdcall      调用方开辟,被调用方清理

__fastcall      若为内置类型<=4 前两个形参不开辟内存,寄存器带入

                    其他情况调用方开辟内存,被调用方清理内存

五、名字修饰的策略(符号生成):

C语言的函数名的修饰规则为:直接在函数名前加一个下化线,(__functionname@number;(functionname为函数名,number为参数字节数))

C++的函数名的修饰规则为:(?functionname@@YA******@Z;(“******”为函数返回值类型和参数类型表))

例:

extern int __cdecl sum(int,int)   //?sum@@YAHHH@Z

extern int __stdcall sum(int,int)  //?sum@@YGHHH@Z

extern int __fastcall sum(int,int) //?sum@@YIHHH@Z

例:__stdcall表示:

编译链接运行原理---函数调用约定_第1张图片

参数从右向左压入堆栈;
函数被调用者清理堆栈;
C编译器函数名的修饰规则为:__sum@8
C++编译器函数名的修饰规则为:?sum@@YGHHH@Z;
使用场合:Windows 标准调用协议;

编译链接运行原理---函数调用约定_第2张图片

编译链接运行原理---函数调用约定_第3张图片

编译链接运行原理---函数调用约定_第4张图片

__cdecl表示

编译链接运行原理---函数调用约定_第5张图片
参数从右向左压入堆栈;
函数调用者清理堆栈;
C编译器函数名的修饰规则为:__sum@8;
C++编译器函数名的修饰规则为:?sum@@YHHH@Z;
使用场合:C标准调用约定;

编译链接运行原理---函数调用约定_第6张图片

编译链接运行原理---函数调用约定_第7张图片

你可能感兴趣的:(编译链接运行原理---函数调用约定)