zoukankan      html  css  js  c++  java
  • 函数调用的细节实现

    函数调用的细节实现

    这个问题当时感觉答得还可以,不过很多细节记不清晰了。所以下面反汇编一段小程序,进行分析,因为我比较熟悉的是arm汇编,所以我选择了一台安装了交叉工具链的ubuntu,而没有使用之前的centos。所以可能画风会有些不同。

    下图是我写了一个简单的程序和makefile。程序中是由main函数调用fun()函数。

     

    编译程序,生成可执行文件,并对其进行反汇编,将反汇编之后的信息写入dump文件,打开dump文件,分析其中的关键源码。

     

    可以看出函数调用的过程如下:

    1.传递参数,如果参数小于四个,则使用R0-R3 4个寄存器传递,多余4个的通过压栈传输,而压栈选择压变量e而不是选择压变量a,则说明了压栈是从右向左的。

    2.使用跳转指令,跳转到相应的函数段。

    3.增加栈帧,保存现在的栈基址指针fp,然后重新给栈基址指针fp和栈顶指针sp赋予新值。

    4.将通过寄存器传递进来的参数保存入栈。





  • 相关阅读:
    LVM
    linux在线添加硬盘、扫盘
    django 的用户认证组件
    django组件-cookie与session
    django组件 分页器
    Django 与 Ajax
    Djange 模型层2
    Django 模型层
    Djange 的模板层
    Django的视图层
  • 原文地址:https://www.cnblogs.com/dchipnau/p/5043581.html
Copyright © 2011-2022 走看看