您的位置:首页 > 理论基础

Linux内核分析课程--通过反汇编一个简单的c程序,分析汇编代码并理解计算机如何工作的

2017-02-26 00:38 1416 查看
齐昱博 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

一、计算机:辅助人脑的好工具

      计算机其实是:接收用户输入指令与数据,经过中央处理器的数据与逻辑单元运算处理后,以产生或储存成有用的信息。
     
冯.诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯.诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。冯.诺依曼也因此被人们称为“计算机之父”。将指令和数据同时存放在存储器中,是冯·诺依曼计算机方案的特点之一计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成冯·诺依曼提出的计算机体系结构,奠定了现代计算机的结构理念。




二、反汇编一个C语言程序,深入理解计算机如何工作

实验步骤如下:
首先打开终端,创建一个.c文件,在文件中敲入想要反汇编的c语言程序,c程序如下:


使用gcc进行编译编译成功后,使用代码gcc -S -o lab1.s lab1.c -m32反汇编成汇编代码,如下图:






把.开头不必要的汇编程序删掉,如下:


分析汇编代码:
line17:所有的程序都是由main函数开始的,所以找到main函数开始执行
line18:ebp的数值压入栈中,以便程序调用时能返回到main函数的最开始
line19:esp的值赋给ebp,现在ebp和esp指向一个位置
line20:esp的数值减4,也就是说esp和ebp中间间隔一个单元格
line21:8存在esp所指的空间
line22:调用函数f,即:pushl eip;jmp f
line8:进入函数f
line9:同理把ebp压入栈中
line10:esp的值赋给ebp
line11:esp的数值减4
line12:ebp加上8,储存在eax中
line13:把eax的值放到esp所指向的空间
line14:调用函数g,即:pushl eip;jmp g
line1:进入函数f
line2:ebp的数值压入栈中
line3:esp的值赋给ebp,现在ebp和esp指向一个位置
line4:ebp加上8,储存在eax中
line5:把4加到eax中
line6:ebp从堆栈中弹出
line7:执行ret指令,也就是popl %eip,此时跳到第15行

三、课程总结

经过本次课程,可以归纳出一下几点:
1、计算机的运行流程是按照冯诺一曼框架的,CPU将内存中的代码和数据读取到自身的寄存器中,进行运算。
2、在运行每个程序之前,CPU都会将上一个的eip和ebp压栈,为了退出函数时更好的找到原来的位置。
3、经过反汇编一个简单的C语言程序后,看到了一个汇编程序要比C语言程序复杂的多,坚定我好好学习本门课的决心。

$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux
相关文章推荐