• 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码


    1.C语言源码

    #include <stdio.h>
    
    int g(int x){
        return x+3;
    }
    
    int f(int x){
        return g(x);
    }
    
    int main(){
        return f(8)+1;
    }

    2.生成汇编代码

    gcc命令

    gcc -S -o main.s main.c -m32

      

    3.汇编代码分析

     首先程序从main函数开始运行

       pushl %ebp
       movl  %esp,%ebp   这两步是建立自己的堆栈,
       subl  $4,%esp   
       movl  $8,(%esp)   这两步是将数值8放入%esp所指的栈内存中。
       call  f           进入f函数, call 等价于 push %eip   movl f %eip,将指令23行入栈,然后将eip寄存器指向f函数首地址。

     call f之后,eip指向f函数的首地址

    pushl %ebp
    movl  %esp,%ebp   //建立f函数自己的堆栈
    subl  $4, %esp
    movl  8(%ebp),%eax  //将f函数中传来的参数8存入eax寄存器中。
    movl  %eax,(%esp)  //将eax寄存器中的值(8)存入esp指向的栈内存中
    call  g  //进入g函数 ,将g指令的下一行入栈,然后使eip寄存器指向g函数的首地址。

      call g之后,eip指向g函数的首地址

    前面的指令类似,
    pop %ebp  //将g函数的堆栈基地址重新复制给ebp.
    ret   //等价于 pop %eip,使得g函数返回至f上次最后执行的下一条指令

      f继续执行leave ret两条指令 两条指令的作用就是让程序又重新回到main函数中上次执行的最后一条指令到下一条指令。

      最后对exa 加1,获取最后计算的结果。

    4.总结

        通过上述的实验,让我更加深刻的理解了计算机程序存储工作的原理。计算机内存中顺序存放着指令,通过顺序执行指令来对数据进行操作而获取最后的结果。

      

  • 相关阅读:
    (转)使用InfluxDB+cAdvisor+Grafana配置Docker监控
    Linux cut命令
    php 三种数组
    Linux httpd源码编译安装
    Linux yum如何下载rpm包到本地
    linux yum 工具
    windows phpstudy 本地添加自定义域名
    php.ini
    Linux rpm 查询
    linux rpm 安装和卸载
  • 原文地址:https://www.cnblogs.com/sixue/p/4363176.html
Copyright © 2020-2023  润新知