• 汇编  cdecl 函数调用约定,stdcall 函数调用约定


    知识点:
      cdecl  函数调用约定
      stdcall 函数调用约定
      CALL堆栈平衡
    
    配置属性--> c/c++ -->高级-->调用约定
    一、cdecl调用约定
     VC++默认约定__cdecl
    1、源代码
    int  __cdecl  add1(int a,int b)
    {
        return a+b;
    }
    2、生成汇编代码
    00401000  /$  55            PUSH EBP
    00401001  |.  8BEC          MOV EBP,ESP
    00401003  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
    00401006  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
    00401009  |.  5D            POP EBP
    0040100A  .  C3            RETN                                     ;  POP EIP
    
    3、调用代码
    push b
    push a
    call add1
    add esp,8
    00401031  |.  6A 02         PUSH 2                                   ;  0012FF7C
    00401033  |.  6A 01         PUSH 1
    00401035  |.  E8 C6FFFFFF   CALL stdcall_.00401000                   ;  __cdecl add1
    0040103A  |.  83C4 08       ADD ESP,8                                ;  RETN 8
    
    二、stdcall调用约定
    API函数约定 __stdcall
    1、源代码
     int __stdcall add2(int a,int b)
    {
        return a+b;
    }
    
    2、生成汇编代码
    00401010  /$  55            PUSH EBP
    00401011  |.  8BEC          MOV EBP,ESP
    00401013  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
    00401016  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
    00401019  |.  5D            POP EBP
    0040101A  .  C2 0800       RETN 8                                   ;  RETN 8   //ADD ESP,8
    
    
    3、调用代码
    push b
    push a
    call add2
    0040103D  |.  6A 04         PUSH 4                                   ;  0012FF7C
    0040103F  |.  6A 03         PUSH 3
    00401041  |.  E8 CAFFFFFF   CALL stdcall_.00401010                   ;  __stdcall add2 PUSH 下一个EIP
    三、fastcall 函数调用约定
     直接用寄存器传递参数,由于寄存器相对于栈(存储器)速度要快上许多,所以这类的调用约定叫fastcall
    1、源代码
     int __fastcall add2(int a,int b)
    {
        return a+b;
    }
    2、汇编代码
    00401020  /$  55            PUSH EBP
    00401021  |.  8BEC          MOV EBP,ESP
    00401023  |.  83EC 08       SUB ESP,8                                   ;  int a,b;
    00401026  |.  8955 F8        MOV DWORD PTR SS:[EBP-8],EDX             ;  b=edx
    00401029  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX             ;  a=ecx
    0040102C  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
    0040102F  |.  0345 F8        ADD EAX,DWORD PTR SS:[EBP-8]
    00401032  |.  8BE5          MOV ESP,EBP                               ;  add esp,8
    00401034  |.  5D            POP EBP
    00401035  .  C3            RETN
    
    
    3、调用代码
    00401096  |.  BA 02000000   MOV EDX,2
    0040109B  |.  B9 01000000   MOV ECX,1
    004010A0  |.  E8 7BFFFFFF   CALL fastcall.00401020                   ;  3
  • 相关阅读:
    hihoCoder week20 线段树的区间修改
    hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询
    hihoCoder week17 最近公共祖先·三 lca st表
    hihoCoder week16 RMQ-ST算法
    hihoCoder week15 最近公共祖先·二
    eclipse 分屏显示同一文件
    eclipse 每次以debug方式启动springboot之后都会在SilentExitExceptionHandler类中的throw new SilentExitException()处断开,但是我明明没有下断点啊
    eclipse alt+/智能提示错误问题
    SpringBoot 之 普通类获取Spring容器中的bean
    kafka常用命令
  • 原文地址:https://www.cnblogs.com/whzym111/p/6366111.html
Copyright © 2020-2023  润新知