Linux内核分析1

来源:互联网 发布:明教知乎 编辑:程序博客网 时间:2024/05/22 06:33

实验目的是通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的,深入了解存储程序计算机工作原理

C程序源代码如下

int g(int x){    return x + 2;}int f(int x){    return g(x);}int main(void){    return f(3) +1;}
在自己的CentOS虚拟机经过反汇编,去除其他信息后的汇编代码如下

使用命令行

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

删除其他内容之得到后的汇编指令如下



逐条分析汇编指令

g:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向esp

这两步目的是初始化本函数的调用堆栈

          movl      8(%ebp),%eax       ebp上8位指向的地址赋给eax寄存器

获取参数

          addl      $2,%eax            eax寄存器+2

执行指令

          popl      %ebp                ebp出栈

          ret                            

功能是通过清理本函数的调用堆栈返回函数调用之前代码继续执行

f:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向ebp

初始化

          subl      $4,%esp            esp减4

          movl      8(%ebp),%eax      ebp+8指向的值赋给eax

          movl      %eax,(%esp)        eax赋给esp指向的值

          call      g                   调用g

          leave

清理g的调用堆栈

          ret                            返回函数调用之前代码继续执行

main:

          pushl     %ebp                当前函数调用基址压栈

          movl      %esp,%ebp          esp指向ebp

          subl      $4,%esp            esp减4

          movl      $3,(%esp)          esp指向的内存地址存储的数值+3

执行函数

          call      f                   执行f函数

          addl      $1,%eax            eax寄存器指向的地址+1

          leave

清理调用堆栈

          ret  函数返回



总结

存储程序计算机一步步从寄存器读取并执行指令,通过操作寄存器和内存实现指令结果的输出。

函数调用堆栈展示了计算机调用函数的过程。

王靖志原创作品转载请注明出处 

Powered by

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

0 0