当前位置: 首页 > 编程日记 > 正文

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

反汇编一个简单的C程序

1、实验要求

使用:

gcc –S –o test.s test.c -m32

命令编译成汇编代码,对汇编代码进行分析总结。其中test.c的具体内容如下:

int g(int x)
{return x + 3;
}int f(int x)
{return g(x);
}int main(void)
{return f(8) + 1;
}

2、实验过程

  • 使用vim对test.c进行编辑,将上述代码键入
  • 使用gcc对test.c编译,产生test.s文件
gcc -S -o test.s test.c -m32

如下图所示:
1508801-20181019085611987-1103018409.png

  • 使用vim查看test.s文件
    查看test.s文件,如下图所示:
    1508801-20181019085753443-1145792296.png
    “.”开通的所有代码为链接时候的辅助信息,不会被实际执行,我们可以把这些代码删除,删除后的代码即为纯净的汇编代码,如下图所示:
    1508801-20181019090118224-1008461625.png

3、实验分析

  • 寄存器&寻址方式
    • 通用寄存器:
      • AX:累加器
      • BX:基地址寄存器
      • CX:计数寄存器
      • DX:数据寄存器
      • BP:堆栈基址针
      • SI、DI:变址寄存器
      • SP:堆栈顶指针
    • 段寄存器
      • CS:代码段寄存器,指向包含程序指令的段。
      • SS:栈段寄存器,指向包含当前程序栈的段。
      • DS:数据段寄存器,指向包含静态数据或者全局数据段。
      • ES:附加寄存器,指向附加数据段。
    • 寻址方式
      • movl %eax,%edx <-> edx=eax 寄存器寻址
      • movl $0x123,%edx <-> edx=0x123 立即寻址
      • movl 0x123,%edx <-> edx=*(int32_t*)0x123 直接寻址
      • movl (%ebx),%edx <-> edx=*(int32_t*)ebx 间接寻址
      • movl 4(%ebx),%edx <-> edx=*(int32_t*)(ebx+4) 变址寻址
  • 汇编代码流程分析
    • 汇编代码依然从main函数读起
      • eip寄存器从main函数起自+1,指向当前执行的指令语句(未遇到特殊指令时)
      • ebp寄存器始终指向栈底,esp寄存器始终指向栈顶,eax寄存器用来暂存一些数值(如函数的返回值)
      • ebp入栈
      • 把ebp值赋予给esp
      • 将esp值减4,指向下一栈存储空间
      • 将数值2018存在esp所指的存储空间中
    • 调用f函数
      • ebp入栈
      • 把ebp值赋予给esp
      • 将esp减4,指向下一栈地址空间
      • 将ebp变址寻址8,即向上退两个栈空间,并将此空间值赋给eax
      • 将eax的内容赋予给esp
    • 调用g函数
      • 对ebp进行压栈
      • 把ebp值赋予给esp
      • 将ebp变址寻址8,即向上退两个栈空间,并将此空间值赋给eax
      • 将eax储存的数值加9228
      • 出栈
      • 返回f函数call语句的下一句(leave)
    • 返回main函数
      • 返回main的call指令下一句(addl)
      • 将eax储存的数加9228
      • esp指向ebp位置,ebp指向栈中指向的位置(leave作用)
      • 返回
  • 堆栈变化分析
    初始化状态esp和ebp都在栈底:
    1508801-20181019222359081-681919685.png
    后指令代码从main函数顺序执行:
    1508801-20181019222450888-702845480.png
    1508801-20181019222459765-1479984325.png
    1508801-20181019222512349-330450418.png
    执行到call f指令,eip记录call指令的下一条语句位置,此时代码跳转至f函数执行:
    1508801-20181019222742379-1477510568.png
    1508801-20181019222804845-23353751.png
    1508801-20181019222822829-138048303.png
    1508801-20181019222827399-266667027.png
    1508801-20181019222832037-911254436.png
    1508801-20181019222844055-1020198558.png
    执行到call g指令,eip记录call指令下一条语句位置,此时代码跳转至g函数执行:
    1508801-20181019222951937-242594242.png
    1508801-20181019222958105-2028171077.png
    1508801-20181019223009566-335058494.png
    1508801-20181019223014617-537282128.png
    此时,g函数执行到ret,返回f函数call的下一条语句leave:
    1508801-20181019223131134-1133945857.png
    1508801-20181019223139578-1507871448.png
    1508801-20181019223152864-498658547.png
    1508801-20181019223158859-32043667.png
    1508801-20181019223206138-256945619.png
    至此,整个指令运行完成,堆栈为空。

4、实验总结

汇编语言是计算机的低级语言,真正的深入了解汇编语言对于我们深入理解计算机系统有着极大的帮助,更是为我们未来linux内核分析的深入学习打下坚实基础。本次使用C语言反编译成汇编语言,利用我们熟悉的C语言代码来对照理解汇编指令代码、分析堆栈的变化让我们更好的理解计算机在执行程序的时候是如何工作的。具体来说:

  • 加深了esp、ebp、eip以及eax各自作用的印象
  • 更好的理解了变址寻址的具体过程
  • 更加熟悉了常用的汇编指令
  • 了解了计算机在执行程序时是如何工作的

其他问题

在进行makefile的测试时,在vim中写好了Makefile,在进行make时,shell提示没有找到make指令,我意识到应该是没有内置此指令,便使用sudo apt-get install make获取make指令,但shell提示:

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set

应该是账户的权限不够,但我想要切换到系统内置的root账户,要求我输入密码,但我好像并不知道root的密码……
经过一系列的资料查询,参考了此篇博文的方法,进入recovery模式更改root账户密码。重启后,使用root账户,sudo apt-get install make执行成功,make命令成功安装。
出现这样的小插曲,也算是在本次作业之外的一个小收获。

转载于:https://www.cnblogs.com/intoxication/p/9819835.html

相关文章:

首次!腾讯全面公开整体开源路线图

6月25日&#xff0c;由Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会在上海举办&#xff0c;腾讯开源联盟主席、腾讯开源管理办公室委员、Apache Member堵俊平首次公开了腾讯整体的开源战略路线图。 堵俊平表示&#xff1a;“腾讯开源提倡‘开放、共享、合力…

201771010111李瑞红《面向对象的程序设计》第八周实验总结

实验八接口的定义与使用 实验时间 2018-10 理论部分 6.1 接口:用interface声明&#xff0c;是抽象方法和常量值定义的集 合。从本质上讲&#xff0c;接口是一种特殊的抽象类。 在Java程序设计语言中&#xff0c;接口不是类&#xff0c;而是对类 的一组需求描述&#xff0c;由常…

崛起的Python,真的影响了76万人?

随着AI的兴起&#xff0c;Python彻底火了。据Stack Overflow调研报告&#xff1a;Python的月活用户已超越了Java、成为第一&#xff0c;全民Python已为“大势所趋”。那么&#xff0c;程序员有必要学Python吗&#xff1f;如何高效掌握Python&#xff1f;程序员为啥要学Python&a…

OpenCV查找轮廓

转自&#xff1a;http://westice.javaeye.com/blog/721225 主要函数是 cvFindContours(tour_buf,storage,&contour,sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); tour_buf 是需要查找轮廓…

非阻塞socket的连接

引用自&#xff1a;http://blog.csdn.net/cccallen/article/details/6619994 连接套接字&#xff0c;阻塞的套接字超时时间很长无法接受&#xff0c;而是用非阻塞套接字时使用的方案也有多种。后者是个比较好的方法 方案1&#xff1a;不断重试&#xff0c;直到连接上或者超时&a…

OpenCV下车牌定位算法实现代码

转自&#xff1a;http://blog.csdn.net/heihei723/archive/2006/05/14/728046.aspx#FeedBack 车牌定位算法在车牌识别技术中占有很重要地位&#xff0c;一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。 车牌定位有很多种算法&#xff0c;从最简单的来&#xff0…

2018-2019-1 20165310 20165315 20165226 实验一 开发环境的熟悉

2018-2019-1 20165226 20165310 20165315 实验一 开发环境的熟悉 目录 一、实验目的 二、实验步骤 三、实验过程中遇到的问题及解决 四、实验感想 一、实验目的 熟悉Linux开发环境并学会Linux开发环境的配置和使用&#xff0c;熟悉arm箱的使用&#xff0c;熟悉以下知识点&#…

上海居民被垃圾分类逼疯!这款垃圾自动分类器也许能帮上忙

作者 | 视说君来源 | 授权转载自视说AI&#xff08;ID:techtalkai&#xff09;让垃圾自动分类近期垃圾分类成为了一个热门话题&#xff0c;原来直接一次性扔掉的垃圾&#xff0c;现在都需要分门别类进行投放。从今年7月1日起&#xff0c;新的《上海市生活垃圾管理条例》正式开始…

虽被BERT碾压,但还是有必要谈谈BERT时代与后时代的NLP

作者 | 吴金龙&#xff0c;爱因互动技术合伙人&#xff0c;算法负责人来源 | 授权转载自AINLP&#xff08;ID:nlpjob&#xff09;2018年是NLP的收获大年&#xff0c;模型预训练技术终于被批量成功应用于多项NLP任务。之前搞NLP的人一直羡慕搞CV的人&#xff0c;在ImageNet上训练…

C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组

转自&#xff1a;http://hi.baidu.com/ctralt/blog/item/cde79fec87f841302697911c.html fstream提供了三个类&#xff0c;用来实现c对文件的操作。&#xff08;文件的创建、读、写&#xff09;。ifstream -- 从已有的文件读 ofstream -- 向文件写内容 fstream - 打开文件供读写…

Exchange 2007迁移2010时的公用文件夹多个公用树错误

近期在项目中&#xff0c;客户Exchange 从2007迁移到2010&#xff0c;Microsoft Exchange从2007开始就逐渐弱化了公用文件夹&#xff0c;outlook 2007和2010都不需要使用到公用文件夹了。但客户现状存在90%的outlook 2003客户端&#xff0c;因此需要使用到公用文件夹。在Exchan…

约瑟夫环问题的两种解法(详解)

约瑟夫环问题的两种解法&#xff08;详解&#xff09; 题目&#xff1a; Josephus有过的故事&#xff1a;39 个犹太人与Josephus及他的朋友躲到一个洞中&#xff0c;39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式&#xff0c;41个人排成一个圆圈&#xff0c;由第1个…

Linux下多播的配置【十全十美】

单播地址标识单个IP接口&#xff0c;广播地址标识某个子网的所有IP接口。多播地址表示某一组IP接口&#xff0c;单播和广播是寻址方案中的两个极端(要么单个要么全部)&#xff0c;多播则意在两者之间提供一种折中方案。多播是用于建立分布式系统的重要工具&#xff0c;例如&…

CvSeq相关函数

转自&#xff1a;http://hi.baidu.com/pengjun/blog/item/a72fc8ea030e79d4d439c906.html 函数原型说明CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)功能&#xff1a;创建一序列 参数&#xff1a;seq_flags为序列的符号标志。如果序…

10月份机房技术指标

下载syslinux&#xff0c;dhcp&#xff0c;http&#xff0c;tftp-serveryum -y install syslinux dhcp httpd tftp-serveryum -y install system-config-kickstart挂载sr0是镜像用system-config-kickstart工具来生成一个自动的安装的配置文件ip填自己的ip地址。目录填挂载光盘的…

5G时代,微软又走对了一步棋!

2019年4月&#xff0c;CSDN采访微软&#xff08;中国&#xff09;首席技术官韦青&#xff0c;期间谈到5G。他认为&#xff0c;5G绝对是一个划时代的革命性突破&#xff0c;但是这个突破不止于现在所说的“5G”通讯技术&#xff0c;它为未来以“万物互联”为基础的智能社会开创了…

6426C Lab3 部署证书和管理注册

共有4个练习&#xff1a;练习1&#xff1a;配置证书模板练习2&#xff1a;配置自动注册练习3&#xff1a;管理证书 Revocation练习4&#xff1a;配置Key Recovery练习1&#xff1a;任务1&#xff1a;复制、安装和手动注册一个证书1. 转到HQDC1.contoso.com服务器&#xff0c;添…

CreateStructuringElementEx

转自&#xff1a;http://baike.baidu.com/view/4819443.htm CreateStructuringElementEx 创建结构元素 IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* valuesNULL ); cols 结构元素的列数目 rows 结构…

阿里AI再摘一冠,大幅提高视觉对话世界纪录

近日&#xff0c; 在第二届视觉对话挑战赛Visual Dialogue Challenge中&#xff0c;阿里AI击败了微软、首尔大学等十支参赛队伍&#xff0c;获得冠军。 &#xff08;阿里AI在视觉对话竞赛中得冠&#xff09;视觉对话竞赛由美国佐治亚理工大学、Facebook人工智能实验室&#xff…

OSChina 周一乱弹 —— 嫂子我帮你们照顾放心吧

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 clouddyy &#xff1a;#每日一歌# 《绿光 - 孙燕姿》 《绿光》 - 孙燕姿 手机党少年们想听歌&#xff0c;请使劲儿戳&#xff0…

十一月工作小记--上线前的冲刺

加班不是目的&#xff0c;重要的是找到加班的意义。尽管程序猿们有很多个不愿意&#xff0c;他们却依然要面对加班的现实。加班就是程序猿们生活中的一张牌&#xff0c;既然不能决定这张牌是什么&#xff0c;那就想想如何去打好这张牌吧。本月&#xff0c;我们的生活依然是那么…

Java跌落神坛,Python继续夺冠....凭啥?

编程语言流行指数(PYPL)排行榜近日公布了2019年6月份榜单。相比 5 月编程语言榜单&#xff0c;Python 不仅超过了 C&#xff0c;成功占据第三名位置&#xff0c;还以 2.77% 的涨幅成为增速最快的编程语言&#xff0c;与此同时&#xff0c;拥有 8.53% 份额的 Python 达到了 TIOB…

opencv实现二值图像细化的算法

转自&#xff1a;http://blog.csdn.net/byxdaz/archive/2010/06/02/5642669.aspx 细化算法通常和骨骼化、骨架化算法是相同的意思&#xff0c;也就是thin算法或者skeleton算法。虽然很多图像处理的教材上不是这么写的&#xff0c;具体原因可以看这篇论文&#xff0c;Louisa Lam…

@芥末的糖----------《管理系统后台架构逻辑》

mongo逻辑 //1.创建mongoose对象链接数据库&#xff0c;并暴露 var mongoose require(mongoose) mongoose.connect(mongodb://localhost:27017/lagou, {useNewUrlParser: true })var db mongoose.connection db.on(error, console.error.bind(console, connection error:)) d…

PHP函数之无极分类

无极分类属于现在比较难攻克的一关&#xff0c;现在就把代码贴出来&#xff0c;有需要的朋友可以根据实际需要扩展一下。 //假设分类关系为“ 地球”&#xff08;id为1&#xff0c;父id为0&#xff09;&#xff0c;“国家”&#xff08;id为2&#xff0c;父id为1&#xff09;&a…

我发现了一个非常酷的软件,用自然语言编程!

作者 | 刘欣&#xff0c;前IBM架构师&#xff0c;用15年的技术工作经验去总结提炼&#xff0c;以故事讲解技术本质&#xff0c;让大家看过以后有一种“原来如此”的感觉。来源 | 码农翻身&#xff08;公众号id&#xff1a;coderising&#xff09;周六晚上10点半&#xff0c; 张…

Matlab中去除exe执行时文件的DOS窗口的方法

转自&#xff1a;http://www.matlabsky.com/thread-547-1-1.html 方法1在command window中输入如下命令&#xff1a; cd(prefdir) edit compopts.bat 此时compopts.bat打开&#xff0c;在文件最后添加 A.VC环境下&#xff1a; set LINKFLAGS%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENT…

ubuntu14.04 升级gcc的方法

Ubuntu12..4版本也可正常安装。 1、添加软件源 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update2、安装gcc高版本&#xff0c;gcc4.8&#xff0c;gcc4.9&#xff0c;gcc5 gcc4.8 sudo apt-get upgrade sudo apt-get install gcc-4.8 g-4.8gcc4.9 sud…

Java 基础【04】Swing 组件事件注册

聪明出于勤奋&#xff0c;天才在于积累。——华罗庚 对上次的三个问题的个人理解&#xff1a; 1&#xff09; 程序首先是从main函数开始执行的&#xff0c;假设main 函数不是 static &#xff0c;就要先实例化这个类&#xff0c;然后调用 main 方法&#xff0c;这似乎是不现实…

VC++ 隐藏控制台程序窗口

转自&#xff1a;http://hi.baidu.com/sicceer/blog/item/d9c35a810d15c4c8bc3e1ec8.html 设置 #pragma comment( linker, "/subsystem:/ "windows/ " /entry:/ "mainCRTStartup/ " " ) // 设置入口地址 这样就ok了 在控制台程序中隐藏控制台窗口…