2017-2018-1 20179203《Linux内核原理与分析》第二周作业
攥写人:李鹏举 学号: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内核原理与分析》第二周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
随机推荐
- 安装Hadoop 1.1.2 (二 安装配置SSH)
1 查找SSH yum search ssh 2 如果没有安装, yum install openssh.x86_64 4 直接运行 ssh-keygen -t dsa -P '' -f /roo ...
- Python一些基础练习题
可变的数据类型:list, dict, set(可修改其中的元素) 不可变的数据类型:str, tuple 重点:str, list, dict (1).推导式练习 # 利用列表推导式: 找出100以 ...
- c3p0;maven;model;
- WebApi 中使用 Session
1. 在 Global.asax.cs 文件中加入session支持 protected void Application_Start() { AreaRegistration.RegisterAll ...
- docker安装并配置加速
安装 旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本: sudo apt-get remove docker \ docker-engine \ ...
- 我的Android进阶之旅------>Android SDK支持的配置标识符(有用的参考文件)
Android SDK支持的配置标致符 配置标识符 标识符值 描 述 MCC MNC 例子: mcc310: MCC310-MNC004: MCC208-MNC00 MCC(移动国家代码 ...
- Javaweb基础--->利用监听器统计在线用户数量和用户信息
首页布局:index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 3.09课·········for循环
for循环:反复执行某段代码.for循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变){ 循环体} 若初始条件满足循环条件,则进入循环体,执行完循环体,跳回到状态 ...
- 每天一个Linux命令(34)grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- CSS3垂直图标菜单
在线演示 本地下载