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

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/dust/p/1190641.html
Copyright © 2011-2022 走看看