程序是怎样跑起来的[试读]
1.1 CPU的内部结构解析
热身问题 阅读正文前,让我们先回答下面的问题来热热身吧。 问题 1. 程序是什么? 2. 程序是由什么组成的? 3. 什么是机器_语言? 4. 正在运行的程序存储在什么位置? 5. 什么是内存地址? 6. 计算机的构成元件中,负责程序的解释和运行的是哪个? 怎么样?是不是发现有一些问题无法简单地解释清楚呢?下面是笔者的答案和解析,供大家参考。 答案 1. 指示计算机每一步动作的一组指令 2. 指令和数据 3. CPU可以直接识别并使用的语言 4. 内存 5. 内存中,用来表示命令和数据存储位置的数值 6. CPU 解析 1. 一般所说... 查看全部[ 1.1 CPU的内部结构解析 ]
1.2 CPU是寄存器的集合体
CPU的四个构成部分中,程序员只需要了解寄存器即可,其余三个都不用太过关注。那么,为什么必须要了解寄存器呢?这是因为 程序是把寄存器作为对象来描述的 。 首先我们来看一下代码清单1-1。这是用汇编语言(assembly)①编写的程序的一部分。 汇编语言 采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言②指令都会有一个与其相应的助记符,助记符通常为指令功能的英语单词的简写。例如,mov和add分别是数据的存储(move)和相加(addition)的简写。汇编语言和机器语言基本上是一一对应的。这一点和C语言、Java语言等高级编程语言③有很大不同,这也是我们使用汇编语言来说... 查看全部[ 1.2 CPU是寄存器的集合体 ]
1.3 决定程序流程的程序计数器
只有1行的有用程序是很少见的,机器语言的程序也是如此。在对CPU有了一个大体印象后,接下来我们看一下程序是如何按照流程来运行的。 图1-4是程序起动时内存内容的模型。用户发出启动程序的指示后,Windows等操作系统①会把硬盘中保存的程序复制到内存中。示例中的程序实现的是将123和456两个数值相加,并将结果输出到显示器上。正如前文所介绍的那样,存储指令和数据的内存,是通过地址来划分的。由于使用机器语言难以清晰地表明各地址存储的内容,因此这里我们对各地址的存储内容添加了注释。实际上,一个命令和数据通常被存储在多个地址上,但为了便于说明,图1-4中把指令、数据分配到了一个地址中。 ① 操作系... 查看全部[ 1.3 决定程序流程的程序计数器 ]
1.4 条件分支和循环机制
程序的流程分为顺序执行、条件分支和循环三种。 顺序执行 是指按照地址内容的顺序执行指令。 条件分支_是指根据条件执行任意地址的指令。 循环_是指重复执行同一地址的指令。顺序执行的情况比较简单,每执行一个指令程序计数器的值就自动加1。但若程序中存在条件分支和循环,机器语言的指令就可以将程序计数器的值设定为任意地址(不是+1)。这样一来,程序便可以返回到上一个地址来重复执行同一个指令,或者跳转到任意地址。接下来,我们就以条件分支为例,来具体说明循环时程序计数器的数值设定机制也是一样的。 图1-5表示把内存中存储的数值(示例中是123)的绝对值输出到显示器的程序的内存状态。程序运行的开始位置是01... 查看全部[ 1.4 条件分支和循环机制 ]
1.5 函数的调用机制
接下来,我们继续介绍程序的流程。哪怕是高级语言编写的程序,函数A调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,因为单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。因此,如果只是跳转到函数的入口地址,处理流程就不知道应该返回至哪里了。 图1-7是给变量a和b分别代入123和 456后,将其赋值给参数(parameter)来调用MyFunc函数的C语言程序。图中的地址是将C语言编译成机器语言后运行时的地址。由于1行C语言程序在编译后通常会变成多行的机器语言,所以... 查看全部[ 1.5 函数的调用机制 ]
1.6 通过地址和索引实现数组
接下来我们看一下表1-1中出现的 基址寄存器_和 变址寄存器_。通过这两个寄存器,我们可以对主内存上特定的内存区域进行划分,从而实现类似于数组①的操作。 首先,我们用十六进制数②将计算机内存上00000000~FFFFFFFF的地址划分出来。那么,凡是该范围的内存区域,只要有一个32位的寄存器,即可查看全部的内存地址。但如果想要像数组那样分割特定的内存区域以达到连续查看的目的,使用两个寄存器会更方便些。例如,查看10000000地址~1000FFFF地址时,如图1-9所示,可以将10000000存入基址寄存器,并使变址寄存器的值在00000000~0000FFFF变化。CPU则会把基址寄存... 查看全部[ 1.6 通过地址和索引实现数组 ]
1.7 CPU的处理其实很简单
可能有些读者不知道机器语言和汇编语言的指令到底有多少种,因而对CPU的运行没什么概念。为了消除大家心中的这个疑团,接下来我们就来看一下机器语言到底有哪些种类。表1-2按照功能对CPU能执行的机器语言指令进行了大体分类。这里没有列出指令的具体名称(汇编语言的助记符)。看完表后你会惊奇地发现,原来 CPU可以进行的处理非常少。虽然高级编程语言编写的程序看起来非常复杂,但CPU实际处理的事情就是这么简单。这样一来,大家是不是能够消除“计算机机制看起来很难”这个印象了呢? 表1-2 机器语言指令的主要类型和功能 如果大家读完上文后有种恍然大悟的感觉,对程序的运行机制有了一个整体的印象,那么本书的目... 查看全部[ 1.7 CPU的处理其实很简单 ]