《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

 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码_第1张图片 

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.总结

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

  

 

你可能感兴趣的:(linux)