此篇文章出于完成作业的目的,同时也总结一下自己的学习的体会,巩固一下学习成果。是完全真实的作业过程。如需转载请保留以下信息:

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

今天计算机已经成为我们生活中重要不可分离的重要组成部分,从随身携带的手机到超级计算机,大部分都遵循冯诺伊曼体系结构:存储程序、顺序执行。程序编制好后,通过输入设备提供给计算机顺序执行。只要人可以将需要解决的问题描述为计算机可以顺序执行的指令序列,计算机就可以给出相应的结果。所以人们编制了计算机语言用来描述问题,现代计算机语言分为低级语言和高级语言,低级语言更接近机器,高级语言更接近人类。为了描述计算机的工作过程,我们采用接近机器的汇编语言(组合语言)描述计算机的执行过程。

实验环境的主机操作系统是Windows7 64位,运行VirtualBox 4.3.20 Edition,虚拟机安装CentOS7.0 64bit,Linux kernel 3.10.0。gcc版本4.8.2,gdb版本GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-51.el7。

以下是作业过程说明:

1.C语言源代码如下:

#include <stdio.h>

int g(int x) {
            return x+2;
        }
        int f(int x) {
            return g(x);
        }
        int main() {
            return f(7)+5;
        }

2.执行命令进行gcc -S main.s main.c生成汇编代码方便我们步进分析代码的执行情况。执行gcc -g main.c -o main生成可用gdb调试的执行代码。在linux终端下执行代码情况如下:

3.我们通过分析代码流程也可以得到正确答案:

程序从main开始执行,调用了f函数,把参数7传过去赋给x。f函数又调用了g函数,把x也就是7传过去,g函数得到参数x的值为7,返回7+2=9给f函数,f函数把9返回给main函数,main函数返回9+5=14作为程序的执行结果。在Linux终端下,14保存在系统变量$?中。

4.计算机系统我们可以抽象简化为CPU、内存、输入输出几部分。下面我们看一下这个程序在我的环境下,计算机是如何机械的的出这个14的。存在函数的程序会大量进行内存的堆栈操作,简单的加法运算在此不展开介绍,重点对于堆栈的操作进行跟踪。以下是cat main.s 所列出的汇编代码,仅保留可执行的部分。

g:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        addl    $2, %eax
        popq    %rbp
        ret
f:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $8, %rsp
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, %edi
        call    g
        leave
        ret
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $7, %edi
        call    f
        addl    $5, %eax
        popq    %rbp
        ret

(1)执行gdb main进入调试,l命令可以显示出C语言代码。break main设置断点,使程序直行到程序开始处停下来,然后单步执行,看一下计算机到底是如何工作的。run命令使程序开始执行。pushq %rbp;movq %rsp, %rbp后,此时rip指向rip=0x40051a。

(2)执行 info registers命令查看一下寄存器的情况。堆栈指针rbp和rsp指向相同的地址0x7fffffffe550,表明当前程序堆栈为空。    

这时汇编代码保存了堆栈原来的指针,操作系统开始调用main函数。可以看到rip指向下一条要执行指令的地址。

(3)有函数调用,我们在gdb中执行stepi命令。执行movl    $7, %edi。

(gdb) stepi
0x000000000040051f      10              return f(7)+5;

(gdb) print $rip

$1 = (void (*)()) 0x40051f <main+9>

(gdb) print $edi
$1 = 7

(4)这时把程序中传给函数f的7保存进了寄存器edi中,继续执行,调用f函数。call f,执行的操作是当前rip=0x00400524值压栈(在gdb中可以执行x %rsp命令查看),rsp-8,f函数所在地址放入rip中。计算机会执行f函数中的pushq $rbp;movq %rsp,%rbp;subq    $8, %rsp实际是保存调用f函数前main函数的指针。此时rbp=0x7fffffffe540,rsp=0x7fffffffe538;而(rbp)保存着调用前堆栈栈顶地址,当然栈顶移动8个字节用来接受传人的参数。

(5)执行3次stepi命令,movl %edi, -4(%rbp);movl -4(%rbp), %eax;movl %eax, %edi 这三行指令很明确,从main传过来的参数存入堆栈空间,然后通过eax寄存器保存一下,在此放到edi中,准备传给g函数。

(6)调用g函数时call g:rip值压栈;rsp-8;g地址赋给rip。

接下来执行两条初始化指令pushq %rbp;movq %rsp, %rbp,保存后rbp、rsp变成了0x7fffffffe528。movl %edi, -4(%rbp);movl -4(%rbp), %eax;addl $2, %eax,接受传入的参数,通过eax执行加法,此时结果保存在eax中。然后g函数执行恢复处理,popq  %rbp;ret,rsp指向0x7fffffffe538。

(7)g函数返回时结果保存在eax中。回到f函数代码继续执行。其中leave指令相当于

movq %rbp, %rsp

popq %rbp

程序执行后寄存器情况如下:

ret指令执行后rsp=0x7fffffffe548

(8)完成f函数调用后,回到main函数执行addl $5, %eax语句。结果保存在eax中。

(9)后面代码是完成main函数返回,原理和一般函数调用相同,在此不在分析。

总结:在我最初接触计算机的时候,上机的机时还是很奢侈的东西,那时就给自己制定了学习方法:首先根据教材所教的知识,在头脑中模拟计算机会如何执行,假定课本上的例子都是正确的,推导出机器应当给出什么样的结果,当有机会在计算机上操作时再进行验证。现在看来,那时的思路是对的,但由于没能坚持,今天的计算机水平还是一般。就本质而言,今天的计算机的确就是模拟人的操作过程,程序员如何设计的程序,计算机就会不折不扣的执行。

转载于:https://blog.51cto.com/swordautumn/1618288

计算机是如何工作的?相关推荐

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

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  2. 人工操作阶段计算机是如何工作的,第一章计算机基础概述全解.ppt

    第一章计算机基础概述全解 1.2.3 汉字编码 汉字的编码 国标码:中文内码之一,汉字信息交换的标准编码.国标码是不可能在计算机内部直接采用.于是, 汉字的机内码采用变形国标码 . 国标码:作为转换为 ...

  3. 计算机主板的工作原理,计算机主板的工作原理.doc

    计算机主板的工作原理 计算机主板构造和工作原理 主板通常拥有多种不同的内置功能,并且可以直接影响计算机的功能和升级潜力.在本文中,我们将了解一下主板的通用部件.随后,我们将仔细研究显著影响计算机性能的 ...

  4. 学校计算机老师工作总结,计算机老师年终工作总结

    计算机老师年终工作总结 作为一名计算机老师,在教学工作一段时间后,可以写一下教学总结.下面,小编在这给大家带来计算机老师年终工作总结,欢迎大家借鉴参考! 计算机老师年终工作总结1 回顾这一学年,本人能 ...

  5. 自动化C语言第一次月考试卷,145班《计算机组成与工作原理》第一次月考试卷...

    怀宁县职教中心2016~2017学年度第一学期九月份摸底考试 145班<计算机组成与工作原理>试卷 命题人:徐志清 班级:姓名:得分: 一.选择题(每题1分,共30分) 1.通常所说的MP ...

  6. 高中考试计算机课程,高中计算机课程的工作总结

    高中计算机课程的工作总结 本学期以来,在校领导的关心指导下,我班全体师生密切配合,团结协作.锐意进取,圆满地完成了本学期的各项工作,具体总结如下. 一. 井然有序的常规工作. 1.班级制度样样俱全. ...

  7. 企业怎样做好计算机应急响应工作

    随着电子商务和在线交易已经成为当今商业社会的一部分,越来越多的公司被发现网络中存在安全隐患而遭受计算机罪犯勒索.当企业的网络中出现安全漏洞时,公司的核心商业信息和业务的机密信息会被盗窃.另外与在线银行 ...

  8. 用计算机进行资料检索工作是,用计算机进行资料检索工作是属于计算机应用中的什么...

    用计算机进行资料检索工作是属于计算机应用中的数据处理.数据处理的基本目的是从大量的.可能是杂乱无章的.难以理解的数据中抽取并推导出对于某些特定的人们来说是有价值.有意义的数据. 用计算机进行资料检索工 ...

  9. 《Linux内核分析》第一周笔记 计算机是如何工作的

    一.计算机是如何工作的? 1.存储程序计算机工作模型 1)冯诺依曼体系结构 学习研究计算机的基本概念.就是指存储程序计算机.所有的有计算功能的电子设备小到计算器,大到超级计算机核心部分都可以用这种体系 ...

  10. 计算机学院 年度工作计划,计算机教研组年度工作计划

    为保证教师能够在将来的竞赛任务中脱颖而出,还必须加强实训室建设,并给教师们提供培训机会,让各教师提高自身技能.这里给大家分享一些关于计算机教研组年度工作计划600字,供大家参考. 计算机教研组年度工作 ...

最新文章

  1. python去实现链表_python实现链表
  2. u 20ubuntu 安装 postfix_极力推荐和田咨询问题U型钢托盘厂家
  3. 问题 L: 超超的中等意思
  4. Spark+Python+Pycharm在Windows下的配置
  5. 1195.最长最短文本
  6. linux之chroot命令
  7. 抢占计算机与通信设备未来产业制高点 ——《信息产业发展指南》解读
  8. 基本采样算法及Python实现
  9. 一种免费下载专利的方法
  10. java接口文档怎么写_如何写好API接口文档
  11. PS后期一键调出紫色梦幻红外线照片效果
  12. 在计算机中1 KB等于多少字节,字节、kb、MB、GB 等单位怎么换算的?1M等于多少kb,1g等于多少kb?...
  13. springboot jsonp 跨域请求,springboot使用jsonp跨域
  14. Navicat 解决问题:提示No All Pattern Found File Already Patched?
  15. mac bootcamp 安装 win7
  16. 3.3 测试实现标准的ZIO服务
  17. 内存类型UDIMM、RDIMM、LRDIMM
  18. CSR867x — 说说蓝牙音频常用的编解码格式
  19. 华为云弹性公网IP服务,为企业敲开互联网大门
  20. 生病还要被压榨,外包太惨了!

热门文章

  1. 鹏业云计价i20清单与定额录入
  2. 【深度剖析】小米CyberDog四足机器人的AI运动系统的实现
  3. Visio设计产品流程图
  4. 从iRedMail 创建web服务学习Nginx
  5. Yasm入门-hello world
  6. 微信小程序广告接入,小程序加广告
  7. 第三方登录之QQ登录(一)——QQ互联开放平台新建应用
  8. Python多行注释/取消注释快捷键
  9. H5 游戏 俄罗斯方块 双人互动游戏
  10. 机器人耗时 0.38 秒还原魔方;微软推出 Windows ML ,将机器学习带入桌面