攥写人:李鹏举 学号:20179203

原创作品转载请注明出处

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

一、 Linux反汇编一个简单的C程序的技术准备

1.1 vim编辑器

 想要反汇编一个C程序首先就需要编写一个C语言的程序,确保其可以正确执行,然后再就行反汇编。而编写C语言程序最简单的方式就是通过vim编辑器进行文字编辑。对于我在实践当中感受到的vim中最重要的几个命令。第一个是当想加入任何内容的时候通过i字母可以将模式切换到插入模式下。此外虽然vim中有直接删除的命令,但是我还是建议在插入这种模式下进行全部的修改,毕竟在这种模式下的修改基本和我们常接触的编辑方式一样,比较方便。然后就是需要记住退出与保存的方式,首先要按按键,然后输入wq!代表保存修改并且强制退出,q!代表只退出不保存。初步的文本编辑基本掌握以上技巧就可以进行,随着学习的深入,我也会深入的讲述vim的其他各类技巧。

 备注: 命令行的左下角会提示当前vim编辑器的模式,如果处于某种模式下,例如插入等,则需要按ESC按键,退出这一模式再选择进入其他模式。.

1.2 C程序完整编译过程

 通过课上所学我们知道C语言程序的完整编译过程,本次实验的目的在于观察一个C语言在Linux中的汇编代码,分析其堆栈变化等,了解Linux中的编译全过程。因此首先我们要先知道完整的编译过程。首先我们通过gcc进行C语言的汇编,gcc的完整编译过程大致为:预处理->编译->汇编->链接。前三个步骤分别对应了-E、-S、-c三个选项。而本次实验主要用到的语句实验指导书中已经提供给了我们gcc –S –o main.s main.c -m32.

二、 实验具体步骤

2.1 实验代码

int g(int x)
{
return x + 8;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(12) + 2;
}

2.2 实验过程截图

1.建立文件并写入实验所用代码



2.使用gcc -S -o lipengju.s lipengju.c -m32 将lipengju.c编译成汇编代码lipengju.s



3.打开lipengju.s文件,会看到机器转换之后的汇编代码



4.将以"."开头的行删去,得到纯净的汇编代码



2.3 实验结果分析:栈的变化

1.开始时eip指向18行,ebp esp都在堆栈0的位置



2.执行eip处的指令,pushl %ebp,将ebp值压栈



3.eip执行至19行,movl %esp,%ebp,将esp值赋给ebp



4.eip执行至20行,subl $4,%esp,将esp向下移一格



5.movl $24,(%esp),将24存入此时esp所指的位置



6.call f,调用f函数,将eip 23压栈,此时eip指向f函数



7.pushl %ebp,将此时ebp值压栈



8.movl %esp,%ebp,将esp值赋给ebp



9.subl $4,%esp,esp向下移一格

10.movl 8(%ebp),%eax,将ebp向上两格装的值赋给eax,所以此时eax=24

11.movl %eax,(%esp),将eax的值赋给esp此时指向的格



12.call g,调用g函数,eip 15压栈,此时eip指向g函数



13.pushl %ebp,将此时ebp值压栈

14.movl %esp,%ebp,将esp值赋给ebp



15.movl 8(%ebp),%eax,将ebp上两格的装的值赋给eax,此时eax=33

16.addl $11,%eax,给eax加11,加上之后,eax=44

17.popl %ebp,弹栈,此时ebp赋值为栈中所存的ebp 4,esp缩进退一格



18.ret,弹栈,此时eip赋值为栈中所存eip 15,esp缩进一格

19.leave(leave指令为如下步骤)

leave

movl %ebp,%esp

popl %ebp

所以此时堆栈指针会变为



20.ret,弹栈,此时eip指向弹栈的eip 23

21.addl $1,%eax,将eax加1,此时eax为45

22.leave操作(先 movl %ebp,%esp,将ebp赋值给esp)

此为C语言过程中所有的堆栈变化。.

三、实验体会:

 本次实验为Linux核心的学习打下了一个很好的基础。对于Linux内核分析的学习分析语言是最基础的,这样根据堆栈一步步的进行汇编语言的分析让我重新回忆起了汇编语言,相信这对于未来的学习非常的重要。而对应的内容在书本上也有很详细的介绍,对于程序的调试分析,是一个程序员的基础,由于对于Linux系统编程方面接触较少,很少有机会在这个环境下进行C的编程,就更不要说具体的调试工作了。学习Linux系统、分析其内核基础编程都是很重要的,本次实验分析中我暂时没有遇到问题,老师同学们如果看到我的分析中有错误欢迎指出,我好思考改正;或者在分析汇编过程中有哪里觉得不知道原因的,欢迎提出我们共同探讨。

2017-2018-1 20179203《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  10. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

随机推荐

  1. Composer的Autoload源码实现1——启动与初始化

    前言 上一篇文章,我们讨论了 PHP 的自动加载原理.PHP 的命名空间.PHP 的 PSR0 与 PSR4 标准,有了这些知识,其实我们就可以按照 PSR4 标准写出可以自动加载的程序了.然而我们为 ...

  2. 使用3DES+Base64来加密传输iOS应用数据

    本文转载至 http://www.erblah.com/post/objective-c/shi-yong-3des-base64lai-jia-mi-chuan-shu-iosying-yong-s ...

  3. iPhone缓存网络数据

    本文转载至 http://blog.csdn.net/wwang196988/article/details/7542918   在iPhone应用程序中,我们经常要用去网络下载一些文件,比如xml, ...

  4. ArcGIS API for js InfoWindow

    说明:有关该示例中怎么引用部署在iis上的离线arcgis api请参考我前面的博文 1.运行效果 2.HTML代码 <!DOCTYPE html> <html> <he ...

  5. 九度OJ 1354:和为S的连续正数序列 (整除)

    时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:2028 解决:630 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不 ...

  6. java 分布式锁 -图解- 秒懂

    目录 写在前面 1.1. 分布式锁 简介 1.1.1. 图解:公平锁和可重入锁 模型 1.1.2. 图解: zookeeper分布式锁的原理 1.1.3. 分布式锁的基本流程 1.1.4. 加锁的实现 ...

  7. Android Studio实现代码混淆

     1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...

  8. Bootstrap学习4--Table样式(转载:https://blog.csdn.net/Fanbin168/article/details/53208869)

    备注:最新Bootstrap手册:http://www.jqhtml.com/bootstraps-syntaxhigh/index.html 将<table>标签添加class=‘tab ...

  9. spark0.9.0安装

    利用周末的时间安装学习了下最近很火的Spark0.9.0(江湖传言,要革hadoop命,O(∩_∩)O),并体验了该框架下的机器学习包MLlib(spark解决的一个重点就是高效的运行迭代算法),下面 ...

  10. jQuery源码分析_工具方法(学习笔记)

    expando:生成唯一JQ字符串(内部使用) noConflict():防止冲突 isReady:DOM是否加载完成(内部) readyWait:等待多少文件的计数器(内部) holdReady() ...