Calling Convention的总结】的更多相关文章

最近在开发的过程中遇到了几个很诡异的问题,造成了栈不平衡从而导致程序崩溃. 经过几经排查发现是和调用规约(calling convention)相关的问题,特此分享出来. 首先,讲一下什么是调用规约. 函数调用规约,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数.函数的调用规约就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值. 名称 谁负责参数出栈 参数压栈顺序 Cdecl Caller(调用者) 从右往左 Pascal Callee(被调用者) 从左往…
tkorays(tkorays@hotmail.com) 调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左到右还是从右到左压栈? 是否支持可变参数函数(vararg function or variadic function). 是否需要函数原型? 怎么修饰函数名,唯一标识函数? 调用者(caller)还是被调用者(called or callee)清理堆栈? 1. Calling Convention…
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling conventions). 调用约定描述了被调用代码的接口: 原子(标量)参数,或复杂参数独立部分的分配顺序; 参数是如何被传递的(放置在栈上,或是寄存器中,亦或两者混合); 被调用者应保存调用者的哪个寄存器; 调用函数时如何为任务准备堆栈,以及任务完成如何恢复; 这与编程语言中对于大小和格式的分配紧密相…
因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下: 清理堆栈 参数压栈顺序 命名规则 (MSVC++) 备注 Cdecl 调用者 (Caller) 从右往左 FuncName 因为是调用者清理Stack,因此允许变参 (如printf) Pascal 被调用者 (Callee) 从左往右 已不再支持 __pascal, __fortran, __syscall Stdcall 被调用者 (Callee) 从右往左 _FuncName@N N表…
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数参数的入栈顺序和清栈主体:而名称修饰也因调用约定而不同. 调用函数的主体和被调用函数的主体,可能会有不同的调用约定和名称修饰,两者的不匹配会引发问题. 使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时…
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=31 February 19, 2013 function calling convention Filed under: c++ — Tags: C convention, C optimization, multi-thread — Raison @ 4:29 am (original works by Peixu Zhu) Function calling conven…
调用惯例影响执行效率,参数的传递方式以及栈清除的方式.   调用惯例 参数传递顺序 谁负责清除参数 参数是否使用暂存器 register 从左到右 被调用者 是 pascal 从左到右 被调用者 否 cdecl 从右到左 调用者 否 stdcall 从右到左 被调用者 否 safecall 从右到左 被调用者 否 fastcall 头两个DWORD(4字节)类型或者占更少 字节的参数被放入寄存器,其它剩下的参数 按从右至左的顺序压入栈  被调用者  否 WINAPI 在WINDEF.H中定义:#…
http://stackoverflow.com/questions/28126082/where-does-the-jit-compiled-code-reside https://wiki.openjdk.java.net/display/HotSpot/CallingSequences https://wiki.openjdk.java.net/display/HotSpot/Linker+methods+for+direct+method+handles http://hg.openjd…
int bar( int a, int b, int c, int d, int e, int f, int g ) { ]; array2[ ] = a + b; array2[ ] = b + c; array2[ ] = c + d; array2[ ] = d + e; array2[ ] = e + f; array2[ ] = f + g; array2[ ] = g + a; ] + array2[ ] + array2[ ] + array2[ ] + array2[ ] + a…
main.c ; int main() { int a, b; int sum; a = ; b = ; sum = add(a, b); ; } int add(int a, int b) { int x, y; x = a; y = b; return (x+y); } int del() { ; } 汇编如下: main.elf: file format elf32-sparc Disassembly of section .text: <main>: : 9d e3 bf save %…
Code: http://www.atelierweb.com/calling-64-bit-assembly-language-functions-lodged-inside-the-delphi-source-code/ http://www.codeproject.com/Articles/262819/Finally-Bit-Delphi-is-here-and-with-Bit-BASM One thing you will notice immediately by looking…
calling c++ from golang with swig--windows dll 之前项目组开发的项目核心代码全部使用C++语言,新项目可能会引入golang,花了一天多时间研究了windows环境下golang调用C++动态链接库的方法. 谷歌加百度之后,很快发现官方推荐的方法,在官方FAQ页面可以找到答案: https://golang.org/doc/faq Do Go programs link with C/C++ programs? There are two Go co…
In computer science, a calling convention is an implementation-level (low-level) scheme for how subroutines receive parameters from their caller and how they return a result. Differences in various implementations include where parameters, return val…
先看看主流的ios设备的架构 armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch armv7 iPhone4 iPhone4S armv7s iPhone5 iPhone5C arm64 iPhone5S iPhone6 再看看目前Xcode8的默认设置 根据官方文档,app最后支持的架构是根据 Architectures 和 Valid Architectures 2个选项的交集确定的,比如说上图这种设置,生成release版后,app支持的架构就是…
本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比), 稍微调整了格式而成. 导读:PHP 是 Web 开发最常用的语言,每个大版本的更新都带来不少新特性和性能提升.特别是 PHP 7.0 的发布,带来 PHP 性能飞跃.本文作者对各个 PHP 版本进行了 CPU 性能基准测试,并且带来了PHP下个大版本的消息.本文…
本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比), 稍微调整了格式而成. 导读:PHP 是 Web 开发最常用的语言,每个大版本的更新都带来不少新特性和性能提升.特别是 PHP 7.0 的发布,带来 PHP 性能飞跃.本文作者对各个 PHP 版本进行了 CPU 性能基准测试,并且带来了PHP下个大版本的消息.本文…
对于以下程序: int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); } int main(void) { foo(, ); ; } 在编译时加上-g选项,用objdump反汇编时可以把C代码和汇编代码穿插起来显示:…
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cdecl是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.函数采用…
一.DllImportAttribute 1.属性介绍 using System; using System.Reflection; using System.Security; namespace System.Runtime.InteropServices { // Summary: // Indicates that the attributed method is exposed by an unmanaged dynamic-link // library (DLL) as a sta…
C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cd…
前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而编译失败的的项目都有一个共同点,就是链接了第三方二进制的库或者框架,而这些框架或者库恰好没有包含bitcode的东西(暂且称为东西),从而导致项目编译不成功.所以每当遇到这个情况时候大部分人都是直接设置Xcode关闭bitcode功能,全部不生成bitcode.也不去深究这一开关背后隐藏的原理.中枪…
Made of Bugs Blog Archives Author Amd64 and Va_arg OCT 3RD, 2010 A while back, I was poking around LLVM bugs, and discovered, to my surprise, that LLVM doesn't supportthe va_arg intrinsic, used by functions to accept multiple arguments, at all on amd…
转载自:http://www.cnblogs.com/lidabo/archive/2012/11/21/2781484.html stdcall, cdecl, pascal 区别 这三个参数都是告诉编译器参数的传递约定,参数的传递约定是指参数的传递顺序(从左到右还是从右到左)和由谁来恢复堆栈指针(调用者或者是被调用者),在 Win16下有两种约定: C 和 PASCAL. C约定规定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针. PASCAL约定和C约定正好相反,它规…
原帖 http://blog.sina.com.cn/s/blog_6b7c56870100l8rf.html __cdecl   __fastcall与   __stdcall 调用约定:  __cdecl   __fastcall与   __stdcall,三者都是调用约定(Calling   convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调…
以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命令同样也可以实现. 在这片文章中我们会通过一个简单的winform登录程序来演示将一系列简单调试命令联合运用,破解登录程序. 测试程序 登录程序界面 登录验证代码 private void btnLogin_Click(object sender, EventArgs e) { if (txtUse…
目录 . 简介 . 进程虚拟地址空间 . 内存映射的原理 . 数据结构 . 对区域的操作 . 地址空间 . 内存映射 . 反向映射 .堆的管理 . 缺页异常的处理 . 用户空间缺页异常的校正 . 内核缺页异常 . 在内核和用户空间之间复制数据 1. 简介 用户层进程的虚拟地址空间是Linux的一个重要抽象,它向每个运行进程提供了同样的系统视图,这使得多个进程可以同时运行,而不会干扰到其他进程内存中的内容,此外,它容许使用各种高级的程序设计技术,如内存映射,学习虚拟内存,同样需要考察可用物理内存中…
目录 1. C/C++中的关键字2. C/C++中的标识符3. 编译选项MD(d).MT(d)编译选项的区别4. C++类模板.函数模板5. C++修饰符6. 调用约定7. 错误处理8. 环境表 9. 内存管理与进程映射 10. 系统调用 11.  文件管理(Unix C) 12. 进程管理 1. C/C++中的关键字 0x1: extern关键字 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,这是什么原理呢? . C++语言在编译的时…
XBMC是一个相当酷的音频/视频播放器,号称家庭影视中心. 我是希望静态将一些库链接进可执行程序的,这样我用的ArchLinux就不用天天在更新一些东西了 但XBMC试了很多次,编译成功后,总是在运行是段错误. 后面没办法,走读代码发现XBMC使用了一个很巧妙的办法实现动态链接库的载入. XBMC定义了一个动态链接类DllDynamic,其中定义了Load/UnLoad/IsLoaded/ResolveExports几个接口 然后定义了一堆宏用于新类继承DllDynamic实现指定库的动态载入.…
MSVC在编译C/C++程序的时候,默认采用__cdecl调用约定来编译.__stdcall是Win32 API函数的默认调用规约. Calling Convention Internal* MSVC DLL (w/ DEF) MSVC DLL (dllexport) DMC DLL MinGW DLL BCC DLL __stdcall _Function@n Function _Function@n _Function@n Function@n Function __cdecl _Funct…
转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; 与 TMyProc = procedure;区别就是 TMyEvent可以再过程内部调用self,而TMyProc不可以 其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type  TMyEvent = procedure of ob…