zoukankan      html  css  js  c++  java
  • 函数调用约定

    x86 msvc编译下  函数调用约定

    void __stdcall ShowStd(int a, int b, int c, int d) {
        printf("%d %d %d %d
    ", a, b, c, d);
    }
    void __cdecl ShowCde(int a, int b, int c, int d) {
        printf("%d %d %d %d
    ", a, b, c, d);
    }
    void __fastcall ShowFast(int nOne, int nTwo, int nThree, int nFour)
    {
        printf("%d %d %d %d
    ", nOne, nTwo, nThree, nFour);
    }
      108:     ShowCde(1, 2, 3, 4);     //__cdecl 调用,参数从右向左入栈,调用者平衡栈,(不定参数函数使用cdcel)
    000E845E 6A 04                push        4  
    000E8460 6A 03                push        3  
    000E8462 6A 02                push        2  
    000E8464 6A 01                push        1  
    000E8466 E8 7F B0 FF FF       call        ShowCde (0E34EAh)  
    000E846B 83 C4 10             add         esp,10h  //平衡栈
       109:     ShowStd(1, 2, 3, 4);   //__stdcall,参数从右向左入栈,被调用者平衡栈(即函数内取消参数空间)
    000E846E 6A 04                push        4  
    000E8470 6A 03                push        3  
    000E8472 6A 02                push        2  
    000E8474 6A 01                push        1  
    000E8476 E8 92 A1 FF FF       call        ShowStd (0E260Dh)  
       110:     ShowFast(1, 2, 3, 4);  //__fastcall,参数1使用ecx,参数2使用edx,其他参数入栈,自右向左。被调用者平衡栈
    000E847B 6A 04                push        4  
    000E847D 6A 03                push        3  
    000E847F BA 02 00 00 00       mov         edx,2  
    000E8484 B9 01 00 00 00       mov         ecx,1  
    000E8489 E8 D1 C2 FF FF       call        ShowFast (0E475Fh) //函数内会将edx和ecx中的值保存到临时变量

    调用规则

    入栈顺序

    平衡栈者

    __cdecl

    从右到左

    调用者

    __stdcall

    从右到左

    被调用者

    __fastcall

    从右到左(参数1EDX、参数2ECX,其他参数使用堆栈)

    被调用者

    PASCAL

    从左到右

    被调用者

                                       

    x64 下:

                                   

                                  

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/DirWang/p/12160982.html
Copyright © 2011-2022 走看看