`
lovnet
  • 浏览: 6870881 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Calling Convention的总结

阅读更多

因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下:

清理堆栈

参数压栈顺序

命名规则 (MSVC++)

备注

Cdecl

调用者 (Caller)

从右往左

FuncName

因为是调用者清理Stack,因此允许变参 (printf)

Pascal

被调用者 (Callee)

从左往右

已不再支持

__pascal, __fortran, __syscall

Stdcall

被调用者 (Callee)

从右往左

_FuncName@N

N表示所有参数大小字节数,如4

一般在Windows APICOM中使用,也是.NETNative代码调用的缺省Calling Convention。

顺便提一下,Windows中API的Calling Convention所使用到的WINAPI宏在PC机上是__stdcall,而在WinCE上则是__cdecl,并非一成不变。

Fastcall (Microsoft)

被调用者 (Callee)

从右往左

@FuncName@N

N表示参数大小字节数,如4

Stdcall类似,但是会选择两个从左往右数最先可以放在寄存器里面的参数放在ECXEDX

Thiscall (Microsoft)

被调用者 (Callee)

从右往左

编译器会将名字,类名,参数等编码到名字里面,具体方式和编译器相关,如:

?Func@MyClass@@QAEXPAX@Z

基本上等价stdcall, 除了this指针用ECX传递

稍微解释一下其中不是特别明显的几个列的意义:

解释

清理堆栈

调用函数的时候,一般的参数都被调用者压栈(除了需要用寄存器传递的参数除外)。问题在于,谁来清理调用者压入堆栈的参数内容,是调用者还是被调用者。清理的意义是将压入的参数退栈,从机器的角度来讲则是调整堆栈指针ESP。当调用者也负责清理栈的时候,由于调用者知道实际参数的个数,因此可以正确处理变参的情况(如printf),就算是压入的参数和所期望的参数不一致也不会造成栈的不平衡,这正是printf可以很容易直接传入不同参数,而Windows API必须显式传入va_list参数(如FormatMessage)来获得变参能力的原因。

压栈顺序

参数被压栈的时候,如果有多个参数,参数可以以从左往右依次压入的顺序压入,也可以以从右往左的顺序,不同的Calling Convention之间存在区别。


分享到:
评论

相关推荐

    arm smc calling convention

    ### ARM SMC调用规范详解 #### 概述 ARM SMC(Secure Monitor Call)调用规范是ARM架构中安全模式与非安全模式之间进行通信的一种标准方式。它定义了如何在不同安全级别的软件间传递参数、返回值以及执行特定功能...

    [OPTIMIZING]CALLING_CONVENTION

    ### 调用约定(Calling Convention)详解 #### 一、引言 调用约定(Calling Convention)是指在程序设计语言中定义的过程或函数与其调用者之间如何传递参数的一套规则。它不仅包括参数传递的方式,还包括了返回值...

    DEN0028E-SMC-Calling-Convention-1.4eac0

    ARM DEN 0028E - SMC Calling Convention ARM DEN 0028E 是 Arm Limited 公司发布的一份关于 SMC 调用约定的文档,本文主要介绍了 SMC 和 HVC 调用约定的详细信息,包括 Secure Monitor Calls、Hypervisor Calls、...

    sophos 移动终端安全 SMC

    在当前的大数据时代,数据安全问题已成为企业必须面对的重大挑战之一。企业数据无时无刻不在面临安全威胁,无论是在内存、硬盘、U盘、移动智能终端、网络还是云端存储中,数据安全的保护都至关重要。...

    RISC-V Calling Conventions, Version 1.1

    总结来说,《RISC-V Calling Conventions,Version 1.1》为 RISC-V 架构提供了一套全面的过程调用规范,不仅涵盖了整数、浮点数和向量数据的传递规则,而且还定义了不同数据模型下的寄存器使用习惯和栈帧布局,旨在...

    80x86汇编 是32位的

    - **Calling Convention**:规定了函数调用时参数的传递方式、返回值的处理以及寄存器和堆栈的使用规则。 **Windows ABI**: - **C calling convention (__cdecl)**:编译器默认的调用约定。 - **Standard calling ...

    libxl-win-3.8.4.zip

    stdcall 32-bit dynamic library with stdcall calling convention changelog.txt change log libxl.url link to home page license.txt end-user license agreement readme.txt this file

    labview调用dll

    CLN节点的配置对话框有四个页面,第一页面用于设置函数的基本信息,包括Library name or path、Function name和Calling convention。Library name or path指定DLL文件的路径,如果是操作系统路径下的DLL,可以直接...

    C语言内存精讲,让你彻底明白C语言的运行机制!

    2. 虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的? 3. 虚拟地址空间以及编译模式 4. C语言内存对齐,提高寻址效率 5. 内存分页机制,完成虚拟地址的映射 ...13. 函数调用惯例(Calling Convention)

    微软暑期实习笔试题.docx

    1. 编程语言中的调用约定(Calling Convention) 在问题1中,考察了cdecl、stdcall、pascal 和 fastcall 四种调用约定中的哪些支持可变长参数(如 printf)。Calling Convention 是编程语言中的一种机制,用于定义...

    PaxCompiler_v2.1_27nov08 full source

    The default calling convention is stdcall. (You can change it by means of TPaxPascalLanguage.SetCallConv method). COM support. TPaxCompilerDebugger and TPaxCompilerExplorer components implement ...

    Intel - _vectorcall and __regcall Demystified-计算机科学

    _vectorcall and __regcall DemystifiedThe motivation to have the new vectorcall calling convention is to make use of as many registers aspossible to pass function arguments rather than pushing the ...

    xbat:通过 XBAT,您可以在 Windows BAT 文件中方便的调用 DLL 函数的功能。 You can call a DLL function easily in Windows BAT file by XBAT

    You can specify a DLL file, a function, calling convention and arguments. Simple array is supported. You can pass any argument and return value to an environment variable or program exit

    IAR EW8051入门

    - **调用约定 (Calling Convention)**:接着选择“Calling Convention”为“XDATA”,以匹配CC2430的存储结构。 - **堆栈大小 (Stack/Heap Size)**:根据实际需求调整堆栈大小。通常情况下,可以将堆栈大小设为一...

    Windows X64汇编入门

    ### Windows X64汇编入门知识点总结 #### 1. 概述 Windows X64汇编是指在64位Windows...此外, 对于调用约定(Calling Convention)的变化也需要开发者特别注意。对于初学者来说, 掌握这些基础知识是非常重要的第一步。

    3PerPawn

    3PerPawn 动机 는리는+ 3%〜5%없어서지추구하슴을...슴을가배제배기로했다。 前提 1.키움打开API +설치。 항은항은 참고。... (키움에서제바이너리가32bit가이너리로64bit실행시Calling Convention문제문。

    Improving Automated Analysis of Windows x64 Binaries - Uninformed v4a1 (April 2006)-计算机科学

    3.2 Calling Convention . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2.1 Stack Frame Layout . . . . . . . . . . . . . . . . . . . . . 5 3.3 Exception Handling on x64 . . . . . . . . . . . . ....

    Uninformed v4a1 - Improving Automated Analysis of Windows x64 Binaries (2006)-计算机科学

    3.2 Calling Convention . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2.1 Stack Frame Layout . . . . . . . . . . . . . . . . . . . . . 5 3.3 Exception Handling on x64 . . . . . . . . . . . . ....

    dll2pas能自动产生dll的pas头文件,方便编程人员对dll的调用。

    4. 如果DLL中的函数使用了非标准的调用约定(calling convention),需要在`.pas`文件中正确指定,否则可能会导致参数传递错误或栈不平衡。 5. 在生成的`.pas`文件中,可能会包含一些特定于DLL实现的类型定义,需要...

Global site tag (gtag.js) - Google Analytics