函数堆栈调用

函数堆栈调用

/*
struct Tmp
{
    int a;
    int b;
    int c;
};
struct Tmp fun2(int a, int b)
{
    struct Tmp c;
    c.a = a;
    c.b = b;
    c.c = a + b;
    return c;
}

int main()
{
    int a = 10;
    int b = 20;


    struct Tmp c;

    c = fun2(a, b);

    return 0;
}*/
 

 

1.函数栈帧的开辟:

  • 压入实参 形参初始化  自右向左
  • 压下一行指令地址
  • 压调用方栈底地址
  • 跳转到被调用方函数栈帧
  • 被调用方函数活动开辟空间

2.返回值:

         <=4字节               用寄存器eax带回

        >4字节 <=8字节   用寄存器eax edx

        >8字节                  临时量(提前开辟内存)

3.调用约定:

_cdecl:    C标准调用约定

_stdcall:   windows标准调用约定

_fastcall:   快速调用约定

_thiscall:    类成员方法的调用约定

1.符号的生成
2.实参的入栈顺序
3.形参的开辟和清理方式

                        栈帧开辟                  栈帧回退                       参数清除

cdecl              调用方开辟               调用方回退                     调用方做

stdeall            调用方开辟               调用方回退                     被调用方做

fastcall            调用方开辟              调用方回退                     被调用方做

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值