理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码相关的知识,希望对你有一定的参考价值。

Author: 翁超平

Notice:原创作品转载请注明出处

See also:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

 

本文通过汇编一个简单的C程序,并分析汇编代码,来理解计算机是如何工作的。整个过程都在实验楼上完成,感兴趣的读者可以通过上面给出的课程链接自行动手学习。以下是实验过程和结果。

 

一、操作步骤

 1、首先在通过vim程序建立main.c文件。代码如下:

技术分享

图1

 

2、使用如下命令将main.c编译成汇编代码,并保存在main.s文件中。由于实验楼的环境使用的是64位Linux系统中,所以命令中使用-m32选项表示将结果汇编为32位系统兼容的代码。汇编结果如下:

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

 

技术分享

 

图2

 

 

3、删除无关代码,得到汇编程序如下。下面开始分析。

技术分享

图3

二、结果分析

 我们从程序入口mian函数开始分析计算机的执行过程,以及堆栈的变化行为。假设ebp和esp寄存器的初始值均为100,初始状态如下图所示。

技术分享

接下来我们以截图方式说明代码执行过程和堆栈、寄存器的变化,每幅截图的右侧都标注了当前执行的代码

技术分享技术分享技术分享技术分享   技术分享   技术分享

 

 

技术分享 技术分享 技术分享

技术分享  技术分享 技术分享

 

 

技术分享技术分享技术分享

 

 

技术分享技术分享技术分享

 

技术分享技术分享技术分享

三、实验总结

    从上述程序执行过程的详细分析可以看出,栈以及程序寄存器eip构成了计算机工作的基础:每个函数都有独立的运行时栈,通过栈基址寄存器ebp和栈指针寄存器esp标识栈边界;eip寄存器存放执行指令的地址并自动增加,形成了程序执行的路径。栈通过记录返回地址等信息保存了函数的调用路径。栈还用于函数调用时的参数传递。函数的返回值则一般保存在eax寄存器中。

 

 

以上是关于理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的

20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程