通过分析汇编代码理解计算机是如何工作的

网易云课堂《Linux内核分析》作业

实验目的:

通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

实验过程:

登陆实验楼虚拟机http://www.shiyanlou.com/courses/195

准备main.c源码

通过分析汇编代码理解计算机是如何工作的_第1张图片
main.c

打开终端shell,输入以下命令:

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

生成汇编代码main.s

通过分析汇编代码理解计算机是如何工作的_第2张图片
main.s.part1
通过分析汇编代码理解计算机是如何工作的_第3张图片
main.s.part2
通过分析汇编代码理解计算机是如何工作的_第4张图片
main.s.part3

精简后的汇编代码

通过分析汇编代码理解计算机是如何工作的_第5张图片
main.s

实验分析:

先看C语言代码,该程序由3个函数组成,分别是main()、f()、g(),实现了2+7+5的简单数学计算。

程序首先从main()开始,将数字2传入f(),f()又将main()传入的数字2原封不动的传给g(),g()实现了将传入2加5的操作,结果7返回给f(),f()获得7后直接返回给main(),mian()将获得的7加7后返回最终结果14.

理论上编译后的汇编语言也应该实现上述功能,即计算2+5+7值。

下面我们来分析精简后的汇编代码:

左边代码行标表示eip,红框表示当前运行的代码,eax初始化为未知变量,右边蓝色格子表示内存段,为简化描述在32位环境下1个内存单元格表示4byte,ebp和esp初始值均为0

程序从main开始

通过分析汇编代码理解计算机是如何工作的_第6张图片
1

将ebp压栈,相当于执行以下两条语句:

subl $4, %esp //esp减4byte,向下移动1格,此时esp指向1

movl %ebp, (%esp) //将ebp的值存入esp指向的存储单元内

通过分析汇编代码理解计算机是如何工作的_第7张图片
2

将esp的值赋值给ebp,即ebp也指向1

通过分析汇编代码理解计算机是如何工作的_第8张图片
3

将esp的值减4,即esp向下移动1格,此时esp指向2

通过分析汇编代码理解计算机是如何工作的_第9张图片
4

将数字2存入esp指向的内存块

通过分析汇编代码理解计算机是如何工作的_第10张图片
5

调用f,相当于执行以下两条语句:

pushl %eip

move f, %eip

通过分析汇编代码理解计算机是如何工作的_第11张图片
6

call f执行完后的状态,此时程序完成由main跳转到f

通过分析汇编代码理解计算机是如何工作的_第12张图片
7
通过分析汇编代码理解计算机是如何工作的_第13张图片
8
通过分析汇编代码理解计算机是如何工作的_第14张图片
9
通过分析汇编代码理解计算机是如何工作的_第15张图片
10

该条指令将ebp-8的位置,即标号为2的内存单元所存放的数字2赋值给eax,此时eax等于2

通过分析汇编代码理解计算机是如何工作的_第16张图片
11
通过分析汇编代码理解计算机是如何工作的_第17张图片
12

跳转到g

通过分析汇编代码理解计算机是如何工作的_第18张图片
13
通过分析汇编代码理解计算机是如何工作的_第19张图片
14
通过分析汇编代码理解计算机是如何工作的_第20张图片
15
通过分析汇编代码理解计算机是如何工作的_第21张图片
16
通过分析汇编代码理解计算机是如何工作的_第22张图片
17

将eax的值加5后再存入eax,此时eax等于7

通过分析汇编代码理解计算机是如何工作的_第23张图片
18

出栈操作,相当于以下两条语句:

movl (%esp), %ebp

addl $4, %esp

通过分析汇编代码理解计算机是如何工作的_第24张图片
19

ret相当于执行以下语句:

popl %eip

通过分析汇编代码理解计算机是如何工作的_第25张图片
20

leave相当于执行以下两条语句:

movl %ebp, %esp

popl %ebp

g没有leave指令语句的原因是它没有再调用其他函数

通过分析汇编代码理解计算机是如何工作的_第26张图片
21
通过分析汇编代码理解计算机是如何工作的_第27张图片
22
通过分析汇编代码理解计算机是如何工作的_第28张图片
23

将数字7累加到eax,此时eax等于14

通过分析汇编代码理解计算机是如何工作的_第29张图片
24
通过分析汇编代码理解计算机是如何工作的_第30张图片
25
通过分析汇编代码理解计算机是如何工作的_第31张图片
26

至此整个程序完成了所有操作,结果存放在eax,即14为最终计算结果,与C语言代码一致。

实验总结:

计算机有一套规则来控制程序运行,在C语言和汇编语言中,CPU从程序main函数所在的内存地址开始做取指操作,根据当前状态和输入计算出新值,并且进入一个新的状态,同时改变寄存器所存储的数值。

参考:计算机实际上是如何工作的

PS:由于超过了提交作业时间,本篇作业未参与评分

互评作业:

作业1

作业2

作业3

作业4

作业5

作业6(该篇作业未完成,提交了无效链接)

作业7

作业8

作业9

作业10(QZONE)

作业12

作业13(未提供博客链接,仅给出精简后的汇编代码)

作业14

作业15(onedrive)

作业16

作业17

作业18

作业19

作业20

作业21(未提供博客链接,仅给出C源码和精简后的汇编代码)

作业22(给个微博链接是要互粉吗?)

作业23

作业24(QZONE)

作业25

作业26

作业27

作业28

作业29(QZONE需要密码无法查看)

作业30

作业31

通过分析汇编代码理解计算机是如何工作的_第32张图片
评分

aapu原创作品转载请注明出处《Linux内核分析》MOOC课

你可能感兴趣的:(通过分析汇编代码理解计算机是如何工作的)