通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

时间:2023-01-19 00:55:55

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

 

实验一  

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

一、C语言源代码:

  

  1. int g(int x)
  2. {
  3.   return x + 3;
  4. }
  5.  
  6. int f(int x)
  7. {
  8.   return g(x);
  9. }
  10.  
  11. int main(void)
  12. {
  13.   return f(8) + 1;
  14. }

 

二、实验楼截图:

  通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

 

  通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

 

三、分析汇编代码的工作过程中堆栈的变化:

 

跟C语言一样,汇编代码也是从main函数开始执行的,计算机利用eip从main开始获取指令并执行,每次自加一,顺序执行,具体如下注释:

g:

  pushl  %ebp        //ebp压栈

  movl   %esp,%eax      

  addl    $3,%eax      //eax=8+3=11

  popl    %ebp       //ebp弹栈

  ret            //popl eip,跳转f函数eip(15)即leave处

f:

  pushl  %ebp        //ebp压栈

  movl   %esp,%ebp       //ebp跟esp指向同一位置

  subl    $4,%esp      //esp-4

  movl   8(%ebp),%eax    //变址寻址8,对应值赋值给eax

  movl   %eax,(%esp)    //把eax赋值给esp对应位置

  call     g          //push eip;movl g,eip

  leave             //movl %ebp,%esp;popl %edp

  ret              //popl eip,执行main函数里addl $1,%eax

main:

  pushl  %ebp                               //把ebp压栈,ESP的值加一个字节

  movl   %esp,%ebp        //ebp指向esp同一位置

  subl    $4,%esp          //esp减4

  movl   $8,(%esp)         //esp所指向位置存储立即数8

  call      f              //push eip;movl f eip  即跳转函数f的指令

  addl   $1,%eax          //eax=11+1=12

  leave                //movl %ebp,%esp;popl %edp,又一次变成空栈

  ret                  //popl eip

  

P.S.  1.函数返回值默认使用eax寄存器存储返回给上一级函数。

 

四、总结

  这次实验利用一个简单的c语言小程序,转换成汇编语言,通过对汇编代码的分析了解了计算机如何工作。汇编语言是介于高级编程语言

和机器语言之间的一种语言,更易于分析计算机工作过程。

  计算机利用一系列的寄存器,获取内存中的指令,通过依次执行,来完成指令流所对应的函数或者说功能。