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