说到计算机,你们都知道现代计算机都是由冯诺依曼体系结构组成的,也就是储存程序计算机。让我先从它的工做模型提及。编程
冯诺依曼体系结构由运算器、控制器、存储器、输入设备和输出设备组成,其中指令与数据同时存放在储存区中。它们工做时的状态如图所示:spa
咱们的程序运行时,通常都是操做系统当作程序与硬件之间的“中间人”,而应用程序与操做系统之间的交互,则依赖于ABI(Application Binary Interface)。固然,个人水平还远不到读写二进制机器码的程度,天然也不会深究这个ABI。操作系统
下面,咱们来对一个简单的C程序进行汇编,C语言源代码以下:code
int func1(x) { return x + 10; } int func2(x) { return func1(x); } int main(int argc, char * argv[]) { return func2(20) + 8; }
笔者使用了实验楼的Linux环境来实现得到程序编译所得的X86(32位)汇编程序,连接在此: https://www.shiyanlou.com/courses/195orm
使用gcc便可,命令以下:rem
gcc –S –o main.s main.c -m32
其中,-S表示在程序编译期间,在生成汇编代码后中止,-o参数输出汇编代码文件main.s,而-m32天然就是生成32位的汇编代码。get
其中以.开头的命令都是做为连接的命令,咱们把以.开头的行所有删除,获得汇编代码以下:io
func1: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $10, %eax popl %ebp ret func2: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax movl %eax, (%esp) call func1 leave ret main: pushl %ebp movl %esp, %ebp subl $4, %esp movl $20, (%esp) call func2 addl $8, %eax leave ret
至此,咱们就完成了对程序的汇编,而后咱们来看看程序的执行过程:asm
在堆栈增增减减的过程当中,计算机也不断的取指令、执行指令,完成对程序的执行。
Author : 陈政 / arc001
原创做品转载请注明出处 《Linux操做系统分析》MOOC课程