【原创+整理】简述何为调用约定,函数导出名以及extern C
调用约定指的是函数在调用时会按照不同规则,翻译成不同的汇编代码。这和参数的压栈顺序和栈的清理方式相关,也就是说不同的调用约定,这些方式会做相应改变。一般编译器是以默认的调用约定编译一份代码,但当一个项目使用不同调用约定的库会产生链接错误。
int __cdecl f1(int a)
{
return a +;
}
int __stdcall f2(int b)
{
return b +;
}
int __fastcall f3(int c)
{
return c +;
}
int main()
{
//函数导出名为_f1、_f2@4、@f3@4
int i = f1();
int j = f2();
int k = f3();
return0;
}
@f3@:
: push ebp
:8B EC mov ebp,esp
: EC CC sub esp,0CCh
: push ebx
0000000A: push esi
0000000B: push edi
0000000C: push ecx
0000000D:8D BD FF FF FF lea edi,[ebp+FFFFFF34h]
: B9 mov ecx,33h
: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001D: F3 AB rep stos dword ptr es:[edi]
0000001F: pop ecx
:894D F8 mov dword ptr [ebp-],ecx
:8B45 F8 mov eax,dword ptr [ebp-]
: C0 add eax,
:5F pop edi
0000002A:5E pop esi
0000002B:5B pop ebx
0000002C:8B E5 mov esp,ebp
0000002E:5D pop ebp
0000002F: C3 ret
_f1:
: push ebp
:8B EC mov ebp,esp
: EC C0 sub esp,0C0h
: push ebx
0000000A: push esi
0000000B: push edi
0000000C:8D BD FF FF FF lea edi,[ebp+FFFFFF40h]
: B9 mov ecx,30h
: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001C: F3 AB rep stos dword ptr es:[edi]
0000001E:8B4508 mov eax,dword ptr [ebp+]
: C0 add eax,
:5F pop edi
:5E pop esi
:5B pop ebx
:8B E5 mov esp,ebp
:5D pop ebp
0000002A: C3 ret
_f2@:
: push ebp
:8B EC mov ebp,esp
: EC C0 sub esp,0C0h
: push ebx
0000000A: push esi
0000000B: push edi
0000000C:8D BD FF FF FF lea edi,[ebp+FFFFFF40h]
: B9 mov ecx,30h
: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001C: F3 AB rep stos dword ptr es:[edi]
0000001E:8B4508 mov eax,dword ptr [ebp+]
: C0 add eax,
:5F pop edi
:5E pop esi
:5B pop ebx
:8B E5 mov esp,ebp
:5D pop ebp
0000002A: C2 ret
_main:
: push ebp
:8B EC mov ebp,esp
: EC E4 sub esp,0E4h
: push ebx
0000000A: push esi
0000000B: push edi
0000000C:8D BD 1C FF FF FF lea edi,[ebp-0E4h]
: B9 mov ecx,39h
: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001C: F3 AB rep stos dword ptr es:[edi]
0000001E:6A01 push
: E8 call _f1
: C4 add esp,
: F8 mov dword ptr [ebp-],eax
0000002B:6A02 push
0000002D: E8 call _f2@
: EC mov dword ptr [ebp-14h],eax
: B9 mov ecx,
0000003A: E8 call @f3@
0000003F: E0 mov dword ptr [ebp-20h],eax
: C0 xor eax,eax
:5F pop edi
:5E pop esi
:5B pop ebx
: C4 E4 add esp,0E4h
0000004D:3B EC cmp ebp,esp
0000004F: E8 call __RTC_CheckEsp
:8B E5 mov esp,ebp
:5D pop ebp
: C3 ret
//把获得obj函数导出名,存储到d:\\1.txt文件
dumpbin OBJ文件路径/all /rawdata:none > d:\\.txt //获得汇编代码,存储到d:\\2.txt
dumpbin OBJ文件路径/disasm d:\\.txt
extern"C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistry)
{
//do something
return STATUS_SUCCESS;
}#ifdef __cplusplus
extern"C"
{
#endif
#include<NTDDK.h>
#ifdef __cplusplus
}
#endif
【原创+整理】简述何为调用约定,函数导出名以及extern C的更多相关文章
- C/C++/动态链接库DLL中函数的调用约定与名称修饰
参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
转自:https://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.html 函数在C++编译方式与C编译方式下的主要不同在于:由 ...
- C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...
- C++调用约定和名字约定
C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...
- DLL中调用约定和名称修饰(一)
DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来 ...
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- 关于函数调用约定-thiscall调用约定
函数调用约定描述了如何以正确的方式调用某些特定类型的函数.包括了函数参数在栈上的分配顺序.有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等. 函数调用约定的几种类型 stdcall,cd ...
- C++调用约定和名字约定 thiscall
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...
- VC与JavaScript交互(二) --- 调用JS函数
这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: //[html] <script type="text/javascript"& ...
随机推荐
- SAS 分组与排序
SAS 分组与排序 SAS对数据集进行操作时,经常需要在SET.MERGE.MODIFY或 UPDATE语句中使用分组数据.使用分组数据最基本的方法是使用BY 语句,其基本形式如下: BY 变量列表; ...
- Turtle库的建立——汉诺塔
Turtle库的建立——汉诺塔 1.首先是要用递归方法来完成这个汉诺塔法则 2.其次,就要编程好代码以及熟练掌握Turtle函数库 一. 相关代码如下: import turtle class St ...
- C语言的数据类型的本质和提高学习
一.数据类型的概念 类型是对数据的抽象 类型是相同的数据有相同的表示形式.存储格式以及相关的操作 程序中使用的数据必定属于某一种数据类型 1.算术类型: 包括三种类型:整数类型.浮点类型,枚举型. ...
- Windows批处理命令学习中遇到的坑--持续更新中
再次拾起windows批处理命令,下边将一些遇到的小问题写出来,希望可以帮到大家 1.set命令:set主要的作用是为变量赋值,类似于编程语言中的var i = Value:但是在使用的过程中一定要注 ...
- JMS Cluster modules
是GeoServer实现集群还是在数据库实现集群? Hadoop.Spark.HBase与Redis的适用性见解:https://blog.csdn.net/cuiyaonan2000/article ...
- 微软develop apps在QQ上部分功能的实现
最近我对微软的develop apps的文档进行了简读,在感叹UWP在支持服务上的全面的同时,我不禁在在常用的APP上对于这些功能支持进行了部分的寻找对应.而我进行功能对照的,就是平时很常用的一款手机 ...
- Debian 8.x / Ubuntu 16.04.x 搭建 Ghost 教程
Ghost 是一款使用 Node.js 开发的博客系统,相对于使用 PHP 开发的 WordPress 更轻巧友好,所以本站已经从 WordPress 切换至 Ghost,本文介绍在 Debian 8 ...
- java面试问题收集(2)
1 Integer int相等问题 Integer对象和int比较的时候会有一个拆箱的过程,始终相等 Integer和new Integer对象不会相等,引用不同 两个Integer对象比较,Inte ...
- 关于使用jquery.cookie.js存cookie中文出现乱码问题
一.在Web开发中,有事为了页面之间传值,我们会用到cookie.但是当在cookie中存值为中文汉字时就会出现乱码! 这是一个简单例子: <!DOCTYPE html><html ...
- 利用Qt Designer 进行 空间提升propomotion 的时候异常: NO such file or directory
1. 因为在提升的时候,只设置了 类名,以及文件名,但是没有给定Qt 的uic 的指定搜索路径,因此报错 在生成的ui_xxxx.h文件必然找不到这个文件. 如下图: 2. 解决方法 在项目的属性中: ...