Linux内核分析(-)——反编译C代码

翁高剑  原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

初学网易云课堂的Linux内核分析课程,从反编译一个简单的C程序开始,编译用的main.c程序如下:
在Linux系统中打开超级终端(快捷键 Ctrl+Shift+T),输入命令:gcc -S -o main.s main.c -m32
在目录下会生成main.s文件,在初始生成的main.s文件中会有很多的以.开头的语句(如下图)
都是一些辅助的链接文件,实际运行的时候是不起作用的,可以删除,删除掉以.开头的语句的完整汇编程序如下:
简单分析下这个汇编程序,程序中包括3个函数,其中一个为main主函数,函数先从main函数开始运行,此时计算机会创建一个内存堆栈,寄存器ebp指向堆栈的栈底,寄存器esp指向堆栈的栈顶,了解这些就可以开始分析代码了
main:
           pushl     %ebp    //创建堆栈把ebp存入第一个内存中,栈顶向下移动一位(pushl 表示的                  
                                      //是32的操作)     
           movl     %esp,  %ebp  //把栈底ebp移动到栈顶
          subl     $4,  %esp   //栈顶向下移一位
         movl     $6,  (%esp)  //往寄存器esp中写入数字6
          call       f      //调用函数f,此时寄存器epi会写入函数f所在的地址
          addl     $1,  %eax //将当前寄存器eax中的数据加1即11+1=12
          leave  //实际表示: movl %ebp,%esp          popl %ebp
          ret
f:
          pushl     %ebp   //把ebp存入内存中,此时ebp是第1个内存地址
            movl    %esp,  %ebp  //把栈底ebp移动到栈顶
            subl     $4,  %esp   //栈顶向下移一位
          movl     8(%ebp),  %eax  //变址寻址,将ebp寄存器往上两位的数据存入寄存
                                                  //器eax中
          molv     %eax,   (%esp)  //把寄存器eax中的数据存入当前内存中
          call       g     //调用函数g,此时寄存器epi会写入函数g所在的地址
          leave    //实际表示: movl %ebp,%esp          popl %ebp
          ret   //返回到主函数继续执行call f后面的语句
g:
          
            pushl     %ebp   //把ebp存入内存中,此时ebp是第4个内存地址
            movl    %esp,  %ebp  //把栈底ebp移动到栈顶
            movl     8(%ebp),  %eax  //变址寻址,将ebp寄存器往上两位的数据即6存入
                                                   //寄存器eax中         
          addl     $5,   %eax   //将eax寄存器中的数据加上5,即6+5=11
          popl      %ebp   //将ebp出栈
          ret  //返回 到f函数继续执行call g后面的语句
以上就是该汇编程序的简单分析,算是对第一堂课所学内容的一个总结,如有错误请不吝赐教。

                                                                                                                                                                                                                  2015年3月8日夜
                                                 

你可能感兴趣的:(Linux内核分析(-)——反编译C代码)