函数堆栈调用

函数堆栈调用

对以下代码进行分析:

#include <stdio.h>

int sum(int a,int b)
{
    int tmp = 0;
    tmp = a + b;
    return tmp;
}

int main()
{
    int a = 10;
    int b = 20;
    sum(a,b);
    return 0;
}

我们进入到这段代码的反汇编代码中进行分析

被调用方开辟栈过程:

形参初始化

压入下一行指令地址

压入被调用方的栈底指针寄存器的值

移动edp到被调用方的栈底

开辟局部变量活动需要的栈空间,并初始化为cccc

调用约定

 约定  函数符号的生成

 约定  实参入栈顺序

 约定  形参的开辟和清理方式

 

 __cdecl  (c标准调用约定)

      调用方开辟栈帧,调用方清理

 

 

 

 __stdcall  (windows标准调用约定)

      调用方开辟,被调用方清理

 

 

 

 __fastcall  (快速调用约定)

      最多使用两个寄存器来带入实参

      其他参数和__stdcall调用约定的处理方式相同

 __thiscall  (成员方法的调用)

返回值的返回方式(内置类型)

   返回值大于0小于等于4    eax带回

   返回值大于4小于等于8    eax和ebx带回

   返回值大于8                    临时量带回

函数形参的默认值

 1、从左向右  依次赋默认值

 2、默认值  只能赋一次

 3、一般在声明上赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值