函数调用堆栈

来源:互联网 发布:找工作软件软件排行榜 编辑:程序博客网 时间:2024/06/01 13:09
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调用方式一样

原创粉丝点击