函数调用堆栈

1.函数调用堆栈

 

压栈

       调用函数:
           1.压入形参变量的地址和值
           2.压入函数调用返回后要执行的指令的地址
      被调用函数:
          1.压入调用函数的栈底指针,把栈底指针寄存器指向被调用函数的栈底

          2.开辟被调用函数的栈帧大小,并初始化为CC

清栈

     被调用函数
          1.清理被调用函数开辟的栈帧大小
          2.回退栈底指针到调用函数的栈底
          3.把回退到调用函数要执行的指令地址给pc寄存器
    调用函数:

         1.清理形参变量的内存




2.函数的返回值
   1.    <=4 eax  值
   2.    <4<=8 eax edx
   3.    >8 开辟一个临时量(函数调用之前就产生,被调用函数return处通过ebp-8访问)
    eax  带出临时量的地址

    循环拷贝到接收返回值的变量的地址空间


3.函数的调用约定
_cdecl           c的调用约定
_stdcall         Windows下的标准调用约定
_fastcall        快速调用约定
_thiscall        C++的成员函数调用约定

1.符号的生成方式不同
ld 合并符号表
  main: 符号表 _cdecl    ?sum@@YAHHH@Z  *UND*  global
   符号解析    
  test:        _stdcall  ?sum@@YGHHH@Z  .text  global
               _fastcall ?sum@@YIHHH@Z
2.参数的压栈方式不同(参数入栈顺序不同)
3.函数的形参内存清理
    _cdecl  调用方开辟  调用方清理
    _stdcall 调用方开辟  被调用方清理
    _fastcall
     <= 8  
     寄存器带值   不需要形参变量的清理
     >  8
     前2个形参寄存器带值   不需要形参变量的清理
     后面的和stdcall调用方式一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值