美文网首页
2.3.2堆栈平衡fastcall

2.3.2堆栈平衡fastcall

作者: 记事本的记事本 | 来源:发表于2019-11-01 16:09 被阅读0次
00D21020 >/$  55            push ebp
00D21021  |.  8BEC          mov ebp,esp
00D21023  |.  83EC 08       sub esp,0x8
00D21026  |.  8955 F8       mov dword ptr ss:[ebp-0x8],edx
00D21029  |.  894D FC       mov dword ptr ss:[ebp-0x4],ecx
00D2102C  |.  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]                       ;  fastcall.00D210A5
00D2102F  |.  0345 F8       add eax,dword ptr ss:[ebp-0x8]
00D21032  |.  8BE5          mov esp,ebp
00D21034  |.  5D            pop ebp                                              ;  001AF888
00D21035  \.  C3            retn

和stdcall cdelc相比 fastcall直接课 在call调用完成后堆栈直接平衡完成了,不采用调用者来处理了

接下来然后来总结下

// fastcall.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int __cdecl add1(int a,int b)
{
    return a+b;
}
int __stdcall add2(int a,int b)
{
    return a+b;
}
int __fastcall add3(int a,int b)
{
    return a+b;
}
int __fastcall add3(int a,int b,int c,int d,int e)
{
    return a+b+c+d+e;
}
int _tmain(int argc, _TCHAR* argv[])
{
    printf("begin\n");
    add1(1,2);
    add2(1,2);
    add3(1,2);
    add3(1,2,3,4,5);
    return 0;
}


配置属性--> 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

相关文章

  • 2.3.2堆栈平衡fastcall

    和stdcall cdelc相比 fastcall直接课 在call调用完成后堆栈直接平衡完成了,不采用调用者来处...

  • Windows堆栈

    Windows堆栈特点 * 先进后出 * 向低地址扩展 什么是堆栈平衡(重点) Windows中的堆栈。我一块普通...

  • 32位和64位函数调用顺序

    32位 栈图左边为无堆栈平衡,右边为堆栈平衡 对于pop3次选用的寄存器不知道是否固定,有些题目不会采用eax,e...

  • C语言调用约定

    stdcall cdecl fastcall thiscall naked call

  • 堆栈传参和堆栈平衡、外挂

    堆栈传参 当函数需要同时处理多个参数,需要使用堆栈传参满足需求。例如:同时求5个数的和? 堆栈平衡 如果要返回父程...

  • 调用约定

    调用约定 调用约定参数压栈顺序平衡堆栈EAXAXAH - ALECXCXCH-CLEDXDXDH-DLEBXBXB...

  • 2.3堆栈平衡

    任何程序在运行过程中都需要使用堆栈,为每一个程序(进程及线程)设置一个堆栈。在使用高级语言编程时,源程序中使用的函...

  • 函数的工作原理

    函数调用约定:_cdecl, _stdcall, _fastcall 6 void _stdcall ShowSt...

  • 调用规约

    stdcall,cdecl,fastcall,thiscall,nakedcall 1、stdcall的调用约定意...

  • Guideline 2.3.2 - Performance -

    Guideline 2.3.2 - Performance - Accurate Metadata We noti...

网友评论

      本文标题:2.3.2堆栈平衡fastcall

      本文链接:https://www.haomeiwen.com/subject/drtqbctx.html