攥写人:李鹏举 学号: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. 安装android Studio和运行react native项目(跳坑篇)

    1.需配环境变量,值为sdk的地址. ANDROID_HOME  值:E:\Users\HP\AppData\Local\Android\sdk 2.下载gradle-2.14.1-all.zip 包 ...

  2. Laravel开发:Laravel核心——Ioc服务容器

    服务容器 在说 Ioc 容器之前,我们需要了解什么是 Ioc 容器. Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 在理解这句话之前,我们需要先了解一下服务容器的来龙去脉:  ...

  3. iOS ARC也会有内存泄露

    本文转载至 http://blog.csdn.net/allison162004/article/details/38753219  iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用A ...

  4. [APIO2008]免费道路

    [APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...

  5. 5.Django数据库配置

    Django默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver需要安装第三方的支持 配置Django数据库:\hello_django\hello ...

  6. MainWindows

    开发带有菜单栏状态栏等常用windows应用时候使用

  7. C#DataSet/DataAdapter

    DataReader必须持续连接,所以在调用方法SqlDataReader作为返回类型时候,必须在方法外关闭流,很不方便. DataAdapter用于对数据源检索数据并填充到DataSet中的表.Da ...

  8. LeetCode:验证回文串【125】

    LeetCode:验证回文串[125] 题目描述 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: ...

  9. php......调研投票练习

    调研题目与调研选项显示页面<style type="text/css"> #list{ width:400px; height:200px;} #jieguo{ wid ...

  10. UITableViewCell高度自适应的关键点

    iOS开发中对于UITableViewCell高度自适应的文章已经很多很多,但如果cell内容比较复杂,刚使用autolayout配置自使用时还是总不能一次性成功. KEY POINT 这里只说设置的 ...