程序是如何被计算机所执行的?

转载 2016年08月29日 17:15:27

一、计算机程序 
要明白程序是如何被计算机所执行的,首先要明白什么是程序?先看看一下几个问题: 
这里写图片描述

  • 程序的概念? 
    程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。一般分为系统程序和应用程序两大类。

  • 程序由什么组成? 
    程序由数据和指令组成。

  • 什么是机器语言? 
    机器语言是直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,它们有一定的位数,并分成若干段,各段的编码表示不同的含义。

  • 运行中的程序存储在什么位置? 
    程序加载时首先到寄存器中,寄存器会将程序复制到内存中从而进行存储,,当程序运行时,CPU会把主从的程序的数据和指令调用到寄存器特定的位置,从而执行。

  • 什么是内存地址? 
    内存地址指系统 RAM 中的特定位置,通常以十六进制的数字表示,如同计算机内部特定位置的编号。

  • 程序的解释和运行的计算机部件叫什么? 
    CPU的控制器是计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件需要的操作控制命令.,程序的解释和运行也是由CPU的控制器来完成。

    程序=指令+数据
    

二、程序的执行过程 
当我们输入以下程序,编译运行,计算机从屏幕输出hello, world!。整个过程计算机都怎么运作的呢?

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> main()
{
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hellow,world!\n"</span>);
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

计算机内部存储的是0和1,计算机通过位信息以及上下文来解读这些0、1信息的。 
hellow,world是由0和1组成的序列,将这些程序代码转换成相应的文本字符,每8位表示一个字节,用来存储一个字符。

hellow,world的ASCII码表示 

因为我们输入的hellow,world是人可以阅读和编写的,但是机器并不能直接识别他们,我们需要把这些文字翻译成机器可执行的二进制文件,这一部分的工作是由编译系统完成的。编译系统由预处理器、编译器、汇编器、连接器四部分组成。以hello, world程序为例,各部分共同完成将源文件编译成二进制可执行文件。各个部分完成的具体工作如下: 
这里写图片描述

  • 预处理器:根据以#开头的命令,将包含的头文件加载进入源程序源程序。预处理器读取系统头文件stdio.h中的内容,代替此行内容。源程序经过预处理后,得到另一个c程序,此程序通常以.i为后缀保存。

  • 编译器:将预处理后的.i文件转换成汇编程序。编译器将不同的高级语言(如c语言,C++语言)转换成严格一致的汇编语言格式进行输出。汇编语言以标准的文本格式确切的描述每机器语言指令。编译器得到的文件通常以.s为后缀保存。

  • 汇编器:将汇编语言(.s文件)翻译成机器语言指令,并将这些指令打包成一种可定位目标程序格式。汇编后得到的文件即为二进制文件,通常以.o为后缀。

  • 链接器:hello, world程序中调用过printf函数,它是一个c标准库里的函数。Printf函数存放在一个名为printf.o的单独预编译的文件中。而这个文件必须以适当的方式并入到我们的程序中,这个工作由链接器完成。将外部的.o文件并入后,得到一个完整的hello, world可执行文件。可执行文件加载到存储器后,由系统复制执行。

    程序加载进入CPU的过程 
    这里写图片描述

  • Shell:命令行解释器,当用户输入一行命令后,shell先判断它是不是一个shell内置命令,如果不是,shell会假定用户输入为一个可执行文件的名字,从而去加载并执行该文件。因此,当我们通过编译系统将源文件编译成可执行二进制文件后,在shell中输入我们得到的可执行二进制文件名,shell将其从磁盘中加载到主存当中,通过CPU进行解释运行,最终通过终端设备(屏幕)将他显示出来,程序运行结束。

  • 主存储器:简称主存,是处理器执行程序时用于临时存放程序及其数据。主存由一组动态随机存储器芯片组成。

  • 运算器:计算机中执行各种算术和逻辑运算操作的部件。

  • 控制器: 计算机中执行各种算术和逻辑运算操作的部件。

三、CPU的组成 
CPU是由四大部分所构成的:寄存器、控制器、运算器、时钟。

  • 寄存器 
    • CPU内部的内存,程序加载进CPU内部的寄存器中从而被用来解释和运行。
  • 控制器 
    • 计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件需要的操作控制命令。
  • 运算器 
    • 计算机中执行各种算术和逻辑运算操作的部件。
  • 时钟 
    • 它是处理操作的最基本的单位,影响着指令的取出和执行时间。

CPU中的主要寄存器 
这里写图片描述

累加寄存器(AC) :主要进行加法运算。 
标志寄存器(PSW) :记录状态,做逻辑运算。 
程序计数器(PC) :是用于存放下一条指令所在单元的地址的地方。 
基质寄存器(BX) :储存当前数据内存开始的位置。 
变址寄存器 :储存基质寄存器的相对位置。 
通用寄存器(GPRs) :支持有所的用法。 
指令寄存器(IR) :CPU专用,储存指令。 
堆栈寄存器(SP) :记录堆栈的起始位置。

  寄存器寄存器是中央处理器内主要组成结构成分,它是CPU当中有限存贮容量的高速存贮部件,它在工作时能将计算机指令数据进行暂时的存储。

  内存地址=基质+变址

处理器读取并解释存储在存储器中的指令 
这里写图片描述

处理器的操作主要是围绕程序计数器、算术/逻辑运算单元、主存来进行运作的。处理器首先从PC所指向的主存存储单元读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC寄存器,使其指向下一条要执行的指令。CPU会执行的操作有:

  • 加载:把一个字节或一个字从主存复制到寄存器,覆盖掉寄存器中原来的值。

  • 存储:把一个字节或一个从寄存器复制到主存,并覆盖主存中原来的值。

  • 操作:把两个寄存器的内容复制到ALU,ALU对两个字做算术运算后存回其中的一个寄存器,该寄存器中原来的值会被覆盖。

  • 跳转:从cpu执行的指令抽取一个字的内容存入PC,覆盖掉原来的值,从而改变下一条要执行的指令,达到跳转的目的。

这里写图片描述

hellow,world程序首先被加载,从磁盘中复制到寄存器中,寄存器将hwllow,world程序复制到主存中进行存储。程序运行过程中,CPU执行hellow,world机器指令,指令的结果是将”hellow,world”字符由内存复制到寄存器,寄存器再将结果复制到显示设备上显示出来。

程序是如何被计算机所执行的?

一、计算机程序 要明白程序是如何被计算机所执行的,首先要明白什么是程序?先看看一下几个问题: 程序的概念? 程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的...

安装WINDOWS缺少计算机所需的介质驱动程序解决方法

新的主板安装WINDOWS会出现"缺少计算机所需的介质驱动程序" 有网友建议拔插USB,可是不一定启作用 后来我找到了一种更快的方法: 注入USB安装盘驱动,我的主板是华硕B150I PRO...

查看本地计算机所注册的控件

  • 2010年11月05日 14:33
  • 16KB
  • 下载

北京大学2013计算机所本科生保研夏令营考试——E:Oil Deposits

原题链接:http://poj.grids.cn/jss2013/E/ 题目描述: 总时间限制: 1000ms 内存限制: 65536kB 描述The GeoSurvComp g...

(改进)北京大学2013计算机所本科生保研夏令营考试——E:Oil Deposits

上一篇给出的参考代码个人觉得太差,然后就重新改进写了一个,直接上代码了,具体描述什么的见上一篇博客:http://blog.csdn.net/smarteryu/article/details/117...

计算机程序的执行过程分析

曹越+原创作品转载请注明出处+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 程序的正确执行靠堆栈来维持,堆栈是一块...

Win7 计算机-右键-管理“该文件没有与之关联的程序来执行该操作”问题的解决方法

何解决Windows7"计算机"右键菜单中"管理"打不开问题   当单击"计算机"右键菜单中"管理"出现“该文件没有与之关联的程序来执行操作。请安装一个程序,或者,如果已安装程序,请在"默...
  • ashic
  • ashic
  • 2015年07月03日 09:13
  • 1772

通过分析一个C程序的汇编指令执行过程,理解计算机的工作。

郑德伦 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 首先创建一个C程序的文件,m...

linux_编译执行程序,分析计算机的工作原理

linux_编译执行程序,分析计算机的工作原理 From: USTC_SA6196 实验:请使用Example的c代码分别生成.cpp,.s,.o和ELF可执行文件,并加载运行,分析.s汇编代码 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序是如何被计算机所执行的?
举报原因:
原因补充:

(最多只允许输入30个字)