在SDK中输出API函数时,我们经常使用函数约定。 在WIN32中,它被定义为函数调用契约。 功能有很多种。 这里简单介绍一下。 在程序软件中,要注重内容分析。 :
1、调用约定相当于16位动态库常用的调用约定。 在 32 位 VC++ 5.0 中,不再支持调用约定(实际上它已被定义为 ,并且也不支持)并已被调用约定取代。 两者本质上是一样的,即函数的参数从右向左通过栈进行传递,被调用函数在返回前将传递参数的内存栈清空,但不同的是函数修改的部分name(关于函数名的修改部分,后面会详细解释)。 【软件破解教程】
它是程序默认的调用方式,通常用于Win32 API。 函数从右到左使用出栈方法,退出时清空堆栈。 VC编译函数后,会在函数名前面添加下划线前缀,在函数名后面添加“@”和参数的字节数。
2. C 调用约定(即使用关键字)将参数从右向左压入堆栈,调用者将参数从堆栈中弹出。 用于传递参数的内存堆栈由调用者维护(因此,实现可变参数的函数只能使用此调用约定)。 另外,函数名修饰的约定也存在差异。 【软件破解教程】
它是C和C++程序的默认调用方式。 每个调用它的函数都包含清除堆栈的代码,因此生成的可执行文件大小将大于调用函数。 函数从右到左压入堆栈。 VC编译函数后,会在函数名前添加下划线前缀。 这是MFC默认的调用约定。
3. 调用约定正如其名,是“人类”的。 它的主要特点是速度快,因为它通过寄存器传输参数(事实上,它使用ECX和EDX来传输前两个双字(DWORD)或更小的参数。,其余参数仍然从右到右压入堆栈左,被调用函数在返回之前清除传输参数的内存堆栈)。 在函数名修饰约定方面,与前两者有所不同。
该模式下的函数使用寄存器来传递参数。 VC编译函数后,会在函数名前面添加“@”前缀,在函数名后面添加“@”和参数的字节数。
4. 仅适用于“C++”成员函数。 this指针存放在CX寄存器中,参数从右向左按。 不是关键字,因此程序员无法指定。
5. 当裸调用使用1-4的调用约定时,如果需要,编译器会在进入函数时生成保存ESI、EDI、EBX、EBP寄存器的代码,并在进入函数时生成恢复这些寄存器内容的代码退出该功能。 裸调用不会生成此类代码。 bare call 不是类型修饰符,因此必须与 with 一起使用。