zoukankan      html  css  js  c++  java
  • Calling Convention

    Calling Convention是指程序在函数调用时传递参数和获取返回值所采用的方法:通过寄存器、或通过栈、或者是两者的混合。
    在Visual C++中,用于指定Calling Convention的修饰符主要有:__cdecl, __stdcall, __fastcall等。它们各自的特征如下:

    C Calling Convention __cdecl:
        1> 参数按从右到左的顺序传递,放于栈中
        2> 栈的清空由主调函数完成
        3> 在生成的汇编代码中,函数名以下划线 _ 开头
    编译选项:/Gd
    对于变参函数,如printf,只能用这种方式

    Standard calling Conventions __stdcall:
        1> 参数按从右到左的顺序传递,放于栈中
        2> 栈的清空由被调函数完成
        3> 在生成的汇编代码中,函数名以下划线 _ 开头,以@和所有参数所占用的字节数结尾。如  call     _sumExample@8
    编译选项:/Gz
    Win32程序中的WINAPI即是__stdcall:#define WINAPI __stdcall
    由于栈是由被调函数自己清空,其产生的执行代码要小于__cdecl方式所产生的代码

    Fast Calling Convention __fastcall:
        1> 前两个参数要求不超过32bits,分别放入ECX和EDX,其余参数按从右到左的顺序传递,放于栈中
        2> 参数由被调函数弹出栈
        3> 在生成的汇编代码中,函数名以@开头,以@和所有参数所占用的字节数结尾
    M$有可能将前两个参数放在不同的寄存器中
    编译选项:/Gr

    除这三种之外,还有Thiscall,但它仅用于C++中类的成员函数:
        1> 参数按从右到左的顺序传递,放于栈中。this放于ECX中
        2> 栈的清空有被调函数完成
    这是C++中类成员函数默认的calling convention。但如果类的成员函数包含可变参数,那该函数的call convention则是__cdecl

    在MSDn中还描述了一种修饰符__clrcall,适用于托管代码。没看~~~

    Reference: Calling Conventions Demystified

  • 相关阅读:
    [CentOS]Centos设置网卡
    [C#]创建Windows用户及组
    [C#]读取指定路径的配置文件[转]
    [C#]安装WindowsService的关键步骤
    [C#]如何解决修改注册表受限问题(转)
    [C#]DES再一例(转)
    [C#]获取当前程序运行路径的方法集合(转)
    [Postgres]Postgres复制表
    [Postgres]postgresql.conf : Permission denied处理一法
    【转】/proc/sysrq-trigger 详解
  • 原文地址:https://www.cnblogs.com/dust/p/1190641.html
Copyright © 2011-2022 走看看