zoukankan      html  css  js  c++  java
  • 调用约定分析

    常见的函数调用方式有__cdecl、__stdcall、__fastcall前面为双下划线)。

    1.__cdecl:

            按从右至左的顺序压参数入栈,由调用者把参数弹出栈.

    int __cdecl func1(int a,int b,int c)
    {
       return a+b+c;
    }
    int  main()
    {
    //函数调用
       func1(1,2,3); 
       return 0;
    }

    a.压栈顺序

      //main

    .text:00401108                 push    3               ; int
    .text:0040110A                 push    2               ; int
    .text:0040110C                 push    1               ; int
    .text:0040110E                 call    func1(int,int,int)

    b.清除栈上参数

    //main

    .
    .text:00401113                 add     esp, 0Ch

    2.__stdcall:

          按从右至左的顺序压参数入栈,由被调用者把参数弹出栈

    #include <stdio.h>
    int __stdcall func2(int a,int b,int c)
    {
        return a+b+c;
    }
    int main()
    {
        func2(1,2,3);
        return 0;
    }

      a.压栈顺序

    //main

    .text:00401116                 push    3               ; int
    .text:00401118                 push    2               ; int
    .text:0040111A                 push    1               ; int
    .text:0040111C                 call    func2(int,int,int)

    b.清除栈上参数

    //func2

    text:00401097                 retn    0Ch

    3.__fastcall:

            从右到左,前两个参数放在ecx, edx,由调用者把参数弹出栈.

    #include <stdio.h>
    int __fastcall func3(int a,int b,int c)
    {
        return a+b+c;
    }
    int main()
    {
        func3(1,2,3);
        return 0;
    }


    a.压栈顺序

    //main

    .text:00401121                 push    3               ; int
    .text:00401123                 mov     edx, 2          ; int
    .text:00401128                 mov     ecx, 1          ; int
    .text:0040112D                 call    func3(int,int,int)

    b 清除栈上参数

    //func3

    .text:004010DF                 retn    4

     

  • 相关阅读:
    装饰器的用法——用装饰器来记录函数被调用的次数
    类和对象(上) C++
    数据结构—树(二叉树)
    数据结构—顺序表
    c++入门

    Cypress博客
    自动化测试框架总结2
    前端测试框架Jest总结
    关于redux和react书籍源码系列代码
  • 原文地址:https://www.cnblogs.com/sklww/p/3379558.html
Copyright © 2011-2022 走看看