攥写人:李鹏举 学号: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. 【BZOJ2790】[Poi2012]Distance 筛素数+调和级数

    [BZOJ2790][Poi2012]Distance Description 对于两个正整数a.b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p, 如果选择变成a/p ...

  2. iOS Base64加密

    1.Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0 ...

  3. 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam

    由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...

  4. Django导出excel中文乱码解决方案

    Django官方文档有关于怎么生成csv文件的方法 import csv from django.http import HttpResponse def some_view(request): # ...

  5. linux c编程:管道

    2在前面介绍过,进程之间交换信息的唯一途径就是传送打开的文件.可以经由fork或者exec来传送.这一章将介绍新的进程共享方式 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都 ...

  6. python+NLTK 自然语言学习处理四:获取文本语料和词汇资源

    在前面我们通过from nltk.book import *的方式获取了一些预定义的文本.本章将讨论各种文本语料库 1 古腾堡语料库 古腾堡是一个大型的电子图书在线网站,网址是http://www.g ...

  7. java访问微信接口发送消息

    最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批人发送一个消息,提示有审批需要处理. 参考了一下微信的开发者文档和网络上的一些技术博客,现在记录一下.以便后续继 ...

  8. ABAP OO 开发语法整理

    [转自 http://blog.csdn.net/saphome/article/details/6956933] 在类中,只能用TYPE 附加关键字指定数据类型. •TYPES: 一般的类型定义方法 ...

  9. SAP basis 常用事物

    1.创建一个新的用户 完成client创建和拷贝后,在开始正式工作之前,需要创建新的用户.  用这个用户进行工作.默认ddic和sap*用户不要用于实际的业务.  创建用户的过程很简单,只要以su01 ...

  10. sql查询报错:Every derived table must have its own alias

    执行sql语句出现语法错误 Every derived table must have its own alias 翻译:每个派生表都有自己的别名