通过一个简单的C程序汇编代码理解计算机是怎么工作的

刘文-原创作品转载请注明出处 -Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

       经过这一周时间在网易云课堂上对孟宁老师的《Linux内核分析》MOOC课程的学习,已经基本理解了冯·诺依曼体系结构也就是

存储程序计算机的基本工作模型。经过一次简单C语言程序的编译和汇编代码分析的实验,又加深对其的印象,现在简单总结一下收获。

       ·诺依曼体系结构由运算器、存储器、控制器和IO设备等组成,指令和数据一般存放在存储区中。当我们写的程序运行时,操作系统通过总线将代码和指令一行一行地从内存中读入到CPU中执行。CPU中有很多寄存器,比较重要的寄存器是IP,指向内存中的代码段,CPU根据CS、IP读取执行指令。下面通过一个简单的实验来分析其工作过程。(实验环境:实验楼64位Linux虚拟机环境https://ww w.shiyanlou.com/courses/195),实验楼截图如下:

       

      这是一个简单的C语言程序,使用指令:gcc -S -o main.s main.c -m32将其编译成汇编代码,去除无关的部分,对留下的

汇编代码进行分析:

 

       我们对汇编代码进行分析,从main函数开始执行。一般情况下,CPU中的ip寄存器将指令一条一条地读入进行执行,当发生函数调用、返回等情况时再进行特别的说明。汇编代码的分析如下:


函数的堆栈变化如下图:

  

执行完g函数时eax的值为5,然后开始执行poplret

 

返回到f函数中,eax的值依然是5,继续执行leaveret

 

返回到main函数中,这时会执行 addl$1,%eaxeax的值变为6,再执行leaveret指令,函数会重新变成空栈。

至此,程序全部执行完毕。

总结:

     ·诺依曼计算机的基本工作原理就是将指令和数据存放在存储区中,当我们写的程序运行时,操作系统利用eip寄存器通过总线将代码和指令一行一行地从内存中读入到CPU中执行。在程序运行的过程中,通过函数调用等手段可以改变eip中的值来改变指令的执行顺序,从而完成函数调用等的工作。同时有espebpeax等重要的寄存器在其中起到至关重要的作用。而汇编语言是介于高级语言和机器语言之间方便计算机进行程序执行的语言,通过对照C语言代码和汇编语言来分析计算机的工作原理,对理解计算机是怎么工作的有很大的帮助效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值