当前位置:文档之家› 菜鸟学编程(C语言版)

菜鸟学编程(C语言版)

菜鸟学编程(C语言版)
菜鸟学编程(C语言版)

菜鸟学编程五袋老丐著

第一章计算机的基本工作原理(初)

一种有着神奇的“魔力”和“智能”的人造设备,正在迅速地、彻底地、默默无闻或者令人震惊地改变和丰富我们所生活的大千世界。这个看起来很不起眼的,在一些场合被称为“电脑”的电器设备,是如何具有如此神奇的“魔力”和“智能”的?本章将带你开始解开这个谜。

1.1节介绍理想厨房系统,1.2节通过一个炒菜实例讲解理想厨房各部件是如何密切配合工作的。1.3是一张理想厨房系统与计算机系统的对照表1.4到1.8介绍了二进制、计算机、机器指令和指令集、数和码。1.09对计算机的重要特点进行了概括性的总结、1.11是计算机与理想厨房的一些重要区别。其中1.2、1.3、1.4、1.9和1.11是本章重点。

电子数字计算机从发明到现在,不过大约70年的时间。然而计算机的发明、改进和普及,却彻底地变革了人类社会。计算机本身也变得越来越复杂、快速、小巧、种类繁多。但大多数计算机都遵循冯.诺伊曼体系结构。这为我们理解大多数计算机的基本工作原理提供了方便。

本章是全书的重要基础。通过本章,为你真正揭开计算机究竟如何工作的神秘面纱。(但是要直到12.4、12.5节,才能彻底揭开计算机硬件如何在操作系统这个系统软件的调度管理下,并行运行多道程序的内在奥秘。)纠正你对计算机可能存在的一些错误认识和看法。并且为第2、12、13章的学习打下牢固的知识基础。

本章不需要任何的预备知识,只要你能把本章认真仔细地学习两遍,你就能够真正懂得看似极为神秘莫测、奥妙无穷,到目前为止人类有史以来最伟大、最神奇而又最为复杂的发明——计算机(又称为“电脑”。这个伟大发明,汇集了几代人中很多杰出人士的聪明才智和研究成果)是如何工作的基本原理。为达此目的,笔者付出了极大的努力,找到了一种比较好的比喻方法——理想厨房系统,由此开始我们的真正理解计算机工作原理的,激动人心的探索旅程。

1.1理想厨房系统:

理想厨房系统,是一个通过顺序执行菜谱中的各个加工步骤,把原材料加工成菜肴的系统。

它由硬件(理想厨房、自动冰箱和三条传送带)和软件(菜谱)组成。

1) 硬件部分:理想厨房系统,主要由以下三个硬件部件(即实物部件)构成——理想厨房、自动冰箱和三条传送带。

●自动冰箱:由非常多的大小一样的格子组成,每个格子都有一个唯一的编号,这个编号是从0开始逐1递增的。自动冰箱负责临时保存菜谱、原材料和菜肴。是不是很奇怪?菜谱竟然要和原材料一道,统一存放在冰箱中!

●三条传送带:负责理想厨房与自动冰箱之间的通信及物品(菜谱中的加工步骤、原料和菜肴)传送。

●理想厨房:负责根据从菜谱中取到的加工步骤,进行炒菜以及进行相关的控制工作。

2) 软件部分:菜谱是理想厨房系统中一个无重量、无体积、不会损坏、可经常更换的,但又极为重要的软件部件(即信息流部件)。菜谱由一个一个的加工步骤顺序组成。

注意:术语“理想厨房系统”与“理想厨房”是有区别的,理想厨房只是理想厨房系统中的一个组成部分。

理想厨房系统的构成简图如图1.1所示:

理想厨房自动冰箱

碟名碟中物品格子编号格子(存放加工步骤或原料)

材料传送带

地址传送带

控制传送带

图1.1理想厨房系统的构成简图(但图中没有放入软件)

●理想厨房中各种碟子的作用

R0、R1、R2碟是一些通用临时存放碟,用来临时存放从冰箱中取来的原材料或经过加工了的半成品或成品。

PC碟:存放一个大于或等于0的整数值,这个值表示:下一个要执行的加工步骤,位于自动冰箱的哪一格中。

IR碟:用来存放从冰箱中刚取过来的一个(立刻要执行的)加工步骤。

●理想厨房执行菜谱中的加工步骤,其流程完全是周期性的。

厨房管理员首先要根据PC碟中的值,通过三套传送带的协调工作,到自动冰箱的指定格中去取菜谱中的一个加工步骤。取到理想厨房并把它放到IR碟中后,PC碟中的值将会加上1(这是为取下一个加工步骤做好准备)。

然后,厨房管理员阅读并分析IR碟中刚取到的加工步骤。根据此加工步骤的指示,去做以下七类工作中的一种:

1.通过三套传送带,命令

..自动冰箱把指定地址格子中的(炒菜加工步骤马上要用到的)原材料(通过材料传送带)传送到理想厨房中来——即取物品;

2.命令

..厨师按照指令(即加工步骤)的要求,对原材料作一个基本加工操作(做“炒”,“蒸”,“煮”等基本操作步骤中的一个炒菜动作)——即加工原材料。

3.通过向三套传送带向自动冰箱发命令

..,把某个碟子中的成品(或半成品)送回到冰箱指定的格子中存放——即存物品;

4.在厨房的各个碟子或炊具之间传送原料或半成品——在厨房内部进行物品传送;

5.根据某个状态碟中的具体条件(比如:加工步骤的预定时间到了、温度够了),不

按正常顺序取出并且执行下一条指令,而是根据此指令中给出的(冰箱格子的相对

或绝对)地址,跳转到那一格中去取下一条指令——即进行(有条件的)跳转。

6.命令配菜员为某菜配原材料;——即输入(在本章不讨论,见第12章)。

7.命令传菜生端菜给顾客;——即输出(在本章不讨论)。

一个加工步骤执行完后,理想厨房立即自动进行下一个完全类似的、新的取加工步骤——执行加工步骤的周期。

注意:为了解说简洁起见,在以下叙述中,我们经常把一个加工步骤称为一条指令,因为一个加工步骤就是一条指导理想厨房如何工作的命令。

理想厨房一次只能执行一条指令。一条指令的执行周期,可分为取指子周期和执行子周期这两个阶段。

下面我们通过一个实例来讲述理想厨房系统的工作机制。这是本章的一个重点,因为计算机的工作原理,与之极其相似。

1.2理想厨房系统的一个炒菜实例(此节最好看光盘中的视频)

1.2.1

现在,我们通过炒制一道香菇炒菜心的例子来说明理想厨房系统的工作过程。

首先,把香菇放在冰箱地址为5的格子中,把菜心放在冰箱地址为6的格子中,冰箱地址为7号的格子,预留给炒好的菜使用。首先,把香菇放在冰箱地址为5的格子中,把菜心放在冰箱地址为6的格子中,冰箱地址为7号的格子,预留给炒好的菜使用。

菜谱的所有加工步骤(又称为指令)从冰箱地址0号格开始依次按照顺序存放,编写香菇炒菜心的菜谱如下:

地址0的格子中:取地址5(中的物品)到R0碟;

地址1的格子中:取地址6(中的物品)到R1碟;

地址2的格子中:将R0碟和R1碟倒入炒锅中炒好倒回R0碟;

地址3的格子中:送R0碟(中的物品)到地址7中;

可见,一共有4个加工步骤。

开始时理想厨房系统状态如下图1.3

(注意:冰箱格子以及理想厨房碟子中存放的物品都用了斜体字)

理想厨房自动冰箱

碟名碟中物品地址冰箱格子中物品

材料传送带

地址传送带

控制传送带

图1.3

菜谱设置完毕后,理想厨房系统开始自动化的工作。

1),厨房管理员根据PC碟子中的数字“0”,知道要到冰箱地址为0的格子中取第一条指令

(即加工步骤)。于是,厨房管理员向控制传送带上送出一个“取”信号,然后马上将PC 碟中的数字“0”复制后放到地址传送带上。这两个信号都会到达自动冰箱。自动冰箱收到这两个信号后,将0号格的内容复印件“取地址5到R0碟”放到材料传送带上,送往理想厨房。理想厨房收到后,将这条指令放到IR碟中。然后,厨房管理员将

......

.........PC

..碟中的原来值

增加

..1.,以便为取下一条指令做好准备。

...............取指令周期完成后,理想厨房系统处于如下图1.4状态:

理想厨房自动冰箱

碟名碟中物品地址冰箱格子中物品

材料传送带

地址传送带

控制传送带

图1.4

厨房管理员读到指令存放碟(即 IR碟)中的加工步骤后,知道要到冰箱地址号为5的格子中去取原材料,并且取来后要放到R0碟中。因此,管理员向控制传送带上送出一个“取”

信号,然后马上将5这个数放到地址传送带上。

冰箱收到“取”信号后,知道理想厨房要取物品。然后,冰箱从地址传送带得到了5,于是冰箱将地址为5的格子中的物品“香菇”取出来,放到材料传送带上。

材料传送带上的物品“香菇”,传到理想厨房后,按照指令的要求(通过厨房内部的传送带)送到了R0碟中。第一条指令执行完后,理想厨房系统处于如下图1.5所示的状态:理想厨房自动冰箱

材料传送带

地址传送带

5

控制传送带

图1.5

2)接下来,开始执行下一条指令的取指周期,类似于前一条指令,在取指周期完成后,理想厨房系统处于如下图1.6状态:

理想厨房自动冰箱

碟名 碟中物品 地址 冰箱格子中物品

材料传送带

地址传送带 1

控制传送带 取

图1.6

管理员分析指令存放碟中的加工步骤(指令)后,知道要到冰箱地址为6的格子中去取原材料,并且放到R1碟中。因此,管理员向控制传送带上发一个“取”信号,然后马上将6这个数放到地址传送带上。

冰箱收到“取”信号后,知道理想厨房要取东西,然后,冰箱从地址传送带得到了6,于是冰箱将地址为6的格子中的物品“菜心”取出,放到材料传送带上。 材料传送带上的物品“菜心”,传到理想厨房后,按照指令的要求通过厨房内部的传送带被自动送到R1碟中。第二条指令执行完后理想厨房系统处于如下图1.7状态:

理想厨房 自动冰箱

材料传送带

地址传送带 6

控制传送带 取

图1.7

3)在第3条指令的取指周期完成后,理想厨房系统处于如下图1.8状态:

理想厨房

自动冰箱

材料传送带

地址传送带 2

控制传送带

图 1.8 厨房管理员看到IR 碟中的内容后,命令厨师将R0碟和R1碟中的原材料倒入锅中炒好后,倒入R2碟中。完成后如图1.9

理想厨房 自动冰箱

材料传送带

地址传送带

控制传送带

图1.9

4)第4条指令在取指令周期完成后,理想厨房系统,处于如下图1.10状态:

理想厨房

自动冰箱

碟名 碟中物品

地址 冰箱格子中物品 材料传送带

地址传送带

控制传送带

图1.10

下面开始执行“送R2碟到地址7中”这条指令。厨房管理员分析指令存放碟中的加工步骤后,知道要将R2碟中的物品,送到冰箱地址为7的格子中去存放。于是,管理员向控制传送带上发一个“存”信号,然后马上将7这个数放到地址传送带上,最后将R2碟中的物品“香菇菜心”放到材料传送带上,送往冰箱。

冰箱收到“存”信号后,知道理想厨房要存放物品,然后,冰箱从地址传送带得到了7,于是自动冰箱(的机械手)在材料传送带旁,等待从理想厨房R2碟传来物品——“香菇菜心”,一旦到达,自动冰箱就将其取下,并将其存放到地址号为7的格子中。完成后系统状态如图1.11:

理想厨房 自动冰箱

碟名 碟中物品 地址 冰箱格子中物品

材料传送带

地址传送带

控制传送带

图1.11

至此,香菇菜心这道菜终于大功告成了。

1.2.2 现在,我们通过一些问答,对已经学到的重点知识作一个概括和讨论:

问题1.理想厨房将要执行的炒某道菜的所有指令是以何种形式,存放在何处的?

答:理想厨房将要执行的加工某道菜的全部指令(即加工步骤),必须按照加工的先后顺序,由小地址号到大地址号连续地存放在自动冰箱的多个格子中。也就是说:如果正在执行的指令,所在的地址是n的话;下一条要执行的指令,一定是在地址为n+1的冰箱的格子中——除非刚刚执行的是一条跳转指令。

问题2.理想厨房如何才能从自动冰箱取到一条指令?取到指令后存放到何处?

答:为了取一条指令,厨房管理员首先要把PC碟中的数据(假设是8)复制后放到地址传送带上,送往自动冰箱;与此同时,要在控制传送带上发送一个“取”信号,送往自动冰箱;然后,厨房管理员还要把PC碟中的数据加上1(PC碟中的数据现在变成了9,以便为取下一条指令作准备)。

自动冰箱根据从控制传送带上得到的“取”信号,知道理想厨房要取东西;根据从地址传送带上得到的地址信号:8。自动冰箱由此知道理想厨房要取第8格中的物品。于是自动冰箱将第8格的物品取出,放到材料传送带上。

厨房管理员收到自动冰箱从材料传送带上传来的第8格中指令后,把它放在IR碟中。

由以上过程可知,哪怕是要完成取一条指令这样的一件微不足道的小事,对于理想厨房系统来说也是非常麻烦的。厨房管理员、PC碟、地址传送带、控制传送带、自动冰箱、材料传送带、IR碟,缺一不可,而且相互之间要密切配合、协调工作才能完成此事。厨房管理员在其中起着核心控制作用。

与取指令类似,理想厨房在执行一条指令时,经常也是如此的麻烦和白痴(比如从冰箱取原材料的指令或送菜肴到冰箱的指令)。

问题3.如果没有保存在冰箱中的菜谱,理想厨房的厨师是否能够炒出一道菜来?

答:决对不会!厨师只会在厨房管理员的命令下,每次仅仅做“炒”、“煎”、“蒸”、“烤”、“炸”和“煮”等一些固定数量的基本操作中的一个基本操作。在这个厨师的大脑中,没有任何一道菜的全部加工过程。他也学不会新的基本炒菜动作。他只会一次次地、忠实地、快速地按照厨房管理员的命令,每次只做一个单一步骤的加工操作。而厨房管理员向厨师发出的加工命令,也都是来自于他所取到的菜谱中的指令。没有保存在冰箱中的菜谱,理想厨房系统中的管理员和厨师根本加工不出任何一道菜肴来。

理想厨房系统的炒菜“智能”来自于菜谱的编写者。正是由于人们编出来的可以让理想厨房执行的各种各样的菜谱,才使得原本白痴般的、能力极为有限的理想厨房系统在炒菜方面显得几乎无所不能!

问题4 编写特殊菜谱很困难吗?

答:确实很难编写。要想理想厨房系统做出任何一道菜肴,都要编写出它能自动执行的特殊菜谱,这种菜谱要非常精确、无二义性。在这种菜谱中,要用冰箱地址号来取代原料的名称(这导致了菜谱很难看懂)。还要知道,厨师究竟会做哪几种基本炒菜动作、厨房管理员懂得哪几种加工命令。此外,原料所放的位置不同,菜谱的内容也就有所不同,与给普通人看的菜谱有很大不同。

问题5 你能简要叙述一下,厨房管理员的工作步骤吗?

答:厨房管理员的工作完全是周期性的,即他永远在做:

取指

...............

....→.发出控制命令要求各部件执行指令

..令.→.分析指令

这一种周期性的动作。

只要一启动,理想厨房系统永远在按照这个周期性的动作,一条一条的顺序的取指令并执行指令(如果遇到跳转指令,则跳转到指定地址去,继续取下一条指令),…不停地快速运行着,直到停机或发生严重故障为止。

理想厨房系统的工作原理,到此已经全部介绍完毕。学完理想厨房系统的基本工作原理后,从整体上把握计算机的基本工作原理,就变成为一个比较轻松的名词替换的小游戏了。

1.3理想厨房系统与计算机系统术语对照表

理想厨房的工作原理,与计算机的工作原理是极为类似的。下面首先给出两个系统之间的术语对照表,见表1.1。

表1.1术语对照表

1.硬件设备

2.软硬件之间的接口(编写菜谱或程序的基本要素)

3.软件

4. 系统的使用者

在计算机上运行一个程序时,上表中列出的计算机的各个部件会协同工作,完成任务(参见1.6节)。如果没有对理想厨房工作原理的详细讲解,由于出现了太多新的专业术语和名词,人们决对很难在短时间内,全面把握和理解这个计算机系统的工作原理的(对于任何一个初学者,这都是一件极其困难的事)。

1.4预备知识:二进制及相关知识简介:

人类有十个手指,所以偏爱十进制记数法。可是,在人造数据处理设备中,使用十进制记数法通常却是愚蠢的选择。

虽然理论上可以使用任何进制(比如十进制)为基础来制造计算机,但现代计算机都是采用二进制的数字电子信号(制造电子计算机为何采用数字信号而不用模拟信号,不用其他进制而采用二进制,请参见本书附录D )进行工作的机器。也就是说,在现代计算机的内部,只能以二进制的形式来存储、传输需要执行的指令和需要加工的数据。

为了从底层彻底把握计算机的基本工作原理,读者必须事先对二进制的相关知识要有所

了解。以下进行简要介绍,更深入一些的讨论请参见《大学计算机基础》或《微机原理》等书籍。

1.4.1二进制数的概念及其数制之间的转换

首先,来看一张部分十进制数与二进制数的数值对照表:

十进制数所对应的二进制数(所对应的十六进制数)

0 0 0

1 1 1

2 10 2

3 11 3

4 100 4

5 101 5

6 110 6

7 111 7

8 1000 8

9 1001 9

10 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

16 10000 10

表1.2 部分十进制数与二进制数(和十六进制数)的数值对照表

一般情况下,用n位二进制可表示的最大正整数值是2n-1。比如:4位二进制可表示的最大正整数是24-1=15(即1111)2 。

可见,二进制只能用两个数字“0”和“1”来进行计数。二进制加法运算的重要规则是:1+1=10 ,即两个1相加产生向高位的进位。左边是高位数,右边是低位数(此外,其它加法规则还有:1+0=1、0+1=0、0+0=0)。

我们经常用一对圆括号括住一个数值,并在圆括号外面加一个数字下标,来表示一个数是几进制数。

比如(1011)10是一个十进制数;而(1011)2是一个二进制数。

1.4.2将二进制整数转化成十进制整数

一个十进制的整数,其数值可用以下展开式来表示:比如3785

(3785)10=3×103+7×102+8×101+5×100(1)

我们把(1)式中10的几次方称为权重,权重左边的乘数称为系数。(1)式中共有4个系数,从左到右依次是:“3”“7”“8”“5”。可见,在表示数值数据时,越左边的系数权重越大。权重中的基数(即底数)与该进制是一样大的,在这里都是10。

类似的,一个二进制数,其数值也可用以下展开式来表示:比如二进制数1011

(1011)2= 1×23+0×22+1×21 +1×20 (2)

此二进制数的值,等于十进制的1×8+0×4+1×2+1×1=8+2+1=(11)10 (3)

由此可以得到:

二进制整数转化成十进制整数的一般方法:只要将该二进制整数(即1011)展开后的(2)式中的每一位(小于2)的系数值,乘以这一位的转化成十进制数后的权重(即2的几次方),然后再将逐个乘积项的数值(用十进制加法规则)相加起来即可。

深入一步:

以上这种二进制整数转化成十进制整数的方法,其实适合将一个任意R 进制数转变成十

进制数。比如有8进制数(305)8,就可展开为: (305)8=3×82+0×81+5×80

= 3×64+0×8+5×1=(197)10

1.4.3 将十进制整数转化成二进制数: 1. 将十进制数转换成二进制数的短除法:

把一个整数(比如89)从十进制转换成二进制,需要用新基数2除这个数(89),余数(1)是结果左边的下一位数字,商(44)是新的被除数,…,整个过程直到商为0时终止。

短除法就是按照以上规则,把要转换的十进制整数不断的除以2然后取余数,商作为新的被除数,直到商为0的时候结束。然后把余数..

倒着写出来。 例如: 把84转换成二进制数

即: (89)10= (1011001)2

深入一步 :任意的R 进制实数表示法 一般情况下,任何一个R 进制实数..,都可以紧凑地表示为:(R 通常是2,8,10,16中的某个数)

(+ r n r n-1…r 1r 0 . r -1r -2...r -m )R (其中的任何一个r i 都是0到R-1之间的一个整数) 将任意一个R 进制数扩大R 倍(即乘以R ),只需将小数点右移一位即可;类似地,将任意一个R 进制数缩小R 倍(即除以R),只需将小数点左移一位即可。其中R=10是人们最为熟悉的十进制数,这种数的表示法,主要是由古代印度人发明的。

任何一个R 进制数,也都可以用多项式的展开表示为:

+(r n ×R n + r n-1×R n-1+…+ r 1×R 1+ r 0×R 0 + r -1×R -1+ r -2×R -2+…+ r -m ×R -m ) (r i 称为系数,R i 称为权重)

R 进制数值的多项式展开表示法中,不使用小数点。

一个数的各种进制表示法之间的数值是一样大的,只不过表现形式不同而已。

1 2

2

2

2

2 2 2 0 0 0 1 1 0 1

注意:短除法也适用于将一个十进制整数转换为一个任意R(R>2)进制的整数,只需将除数由2替换为R即可(参见例题)。

可选练习:将十进制整数89用短除法转化为8进制整数。

*1.4.4将十进制纯小数转化成二进制纯小数

10进制纯小数转换为2进制纯小数的转换过程,与整数的进制转换过程有些类似而又有些相反:不是用新的基数2除这个数,而是用新基数2去乘它。乘法的进位将成为答案右边的下一位数字,乘法结果中的小数部分将成为新的被乘数,整个过程直到乘法结果中的小数部分为0时终止。

例如:把十进制小数0.375转换成二进制小数:

0.375×2 = 0.750 0 //进位0,小数点后第一位

0.75×2 = 1.50 1 //进位1,小数点后第二位

0.5 ×2 =1.0 1 //进位1,小数点后第三位

所以,(0.375)10=(0.011)2

1.5预备知识:数和码的含义和区别

如果计算机仅仅只能够对一些数进行数值运算(在计算机刚发明的早期年代确实是如此),那么它的应用范围就很窄。然而,现代计算机的应用范围却是极其广泛的。根本原因在于:现代计算机不仅能对数进行运算,还能对各种各样的“码”进行处理。所以,我们想要真正懂得计算机并且学好编程,就不仅要熟悉二进制的“数”,还必须对二进制的“码”也有一个比较清晰的整体了解。

以下这些内容虽然比较繁琐,然而理解起来却并不太困难。

1.5.1十进制的数和码:

我们通过一个例子,先来来说明十进制数字系统中数与码的区别

如果3785用于表示数,则越高位(即越左边的位)的数字越重要(因为权重越大,在十进制数3785中,“3”的权重是103,而“5”的权重是100)。

而3785用于表示非数值的码,则每一位都同样重要。码值仅相差一位,所表示的文字(或代表的事物)就可以有巨大的区别(比如:3785可代表汉字“前”,而3786可代表汉字“后”)。

十进制的数字串“3785”,既可以表示一个值为三千七百八十五的十进制数,也可以表示一个码为3785的汉字(或者表示任何别的什么10000个同类型事物中的码值为3785的一个特定事物)。

对于数值可以进行各种数学运算,而对于表示非数值的码进行数学运算,通常毫无意义。

1.5.2 二进制的位、位串、字节

与十进制一样,二进制数与二进制码也有类似的区别。只不过在二进制中,只能用0和1组成的一个二进制数字串,来构成任何大小的数值或者表示具有任何含义的码。

我们先来熟悉一些与二进制有关的术语。

●位:单个二进制数字——不是0就是1,再没有别的可能数字——我们将其称为“位”(bit)。

●位串及其长度:任意多个二进制“位”顺序排列在一起(比如:11011011100),我们称之为位串(有的教科书称为“位模式”)。位串中数字的个数,我们称为位串的长度。

●字节——8位二进制位串

在计算机、通信及其大量相关应用中,人们最为关心的是长度为8位的二进制位串。

这是由于现代的绝大多数计算机和数字化的通信网络设备,都是以8位二进制位串作为计量(部件的)数据存储容量和(传输过程中的)数据传输量的一种基本单位。

我们把 一个8位二进制位串称为一个字节(Byte)。 深入一步:二进制数据存储和传输中的一些常用单位

“字节” (Byte )这个基本单位虽然是“位”这个最小二进制单位的8倍,但在很多场合仍然显得太小,更大的常用单位有(用B 来表示Byte):

千字节: 1KB=1024B 兆字节: 1MB=1024KB 吉字节: 1GB=1024MB

每种单位之间都是1024倍的关系,而不是1000倍的关系。 所以,我们常常会看到一些数据存储设备标出它的数据存储容量是多少个KB 、MB 或GB ;或者一根网线(或者一块网卡)标出它的数据传输量是每秒钟传输多少个KB 、MB 或GB 。

1.5.3 二进制的数和码

如果用一个位来表示整数值,只能表示0和1这两个值中之一。大于1的整数值用一个“位”表示不了。

如果用单个的“位”来表示码,则只能用来对(同属一种类型的)两种不同事物进行编码。比如:用0表示“假”, 用1表示“真”; 用0表示“否”, 用1表示“是”;或者用 0 表示动物“狗”,用 1 表示动物“猫”;…等等。

如果用长度为2的一个位串来表示整数值,则能够表示00(即0)、01(即1)、10、11这4个整数值中的某一个。

如果用长度为2的位串来进行编码,由于有4(即22

)个码值可以用,则能够用来对属于同一类型的4个不同的事物(或状态)进行编码。比如 {酸,甜,苦,辣}、{牛,马,羊,猪}、{加,减,乘,除}、{A ,B ,C ,D}、{赵,钱,孙,李}等等。

深入一步:编码和解码的一个实例

通过制定编码规则,比如:可以用00表示“D ”、01表示“C ”、 10表示“B ”、 11表示“A ” ,这就构成了一张表示4个字符的编码解码表(注1),见表1.2 。

(注1):如果把{00,01,10,11}看成4个未婚男士(的代号),{A,B,C,D}看成4个未婚女士(的代号)。所谓的“编码解码表”,只不过是所有男士与女士之间的一张快速配对表而已。用严格的数学术语来讲,这实质上是两个集合{00,01,10,11}与 {A,B,C,D} 的所有元素之间的一张一对一的映射表。

表1.2 表示4个字符的编码解码表

有了编码解码表,先通过对字符串“CAB ”进行编码..,就可以用一些码值构成的二进制位串“011110”来间接地存储和传输这个字符串。因为这样既安全,又方便(注2)。 到达目的地后,接收方也要有同样的一张字符的“编码解码表”,才能将这种接收到的二进制位串,翻译成它的本来意义。比如将二进制位串011110翻译成字符串“CAB ”。这个过程就称为解码..

。 二进制码 字符 00 D 01 C 10 B 11

A

编码发送接收解码

CAB——→011110——→011110——→CAB

图:字符串的编码、发送、接收、解码全过程

(注2)一个二进制位串,用二进制的电子数字信号是很容易表示、存储和传输的。而任何用文字表达的非数值数据,不通过某种编码,是无法直接用二进制的电子数字信号来表示、存储和传送的。

如果用一个字节来表示无符号的整数,则能够表示28=256个整数值。分别是从0到255,对应于二进制数从(00000000)2到(11111111)2 。

如果用一个字节来进行编码,则能够用来对256种同类事物进行编码。

计算机中一种常用的对英文文本(即文件)中常用字符的编码规则,通常是采用一个字节来对英文字符进行编码的“ASCII码表”(细节参见附录B)。借助于ASCII码表,我们就可对一个英文文本进行编码,转换成一串长长的二进制ASCII码形式的位串后(但实质上还是一个英文文本),送到计算机中进行编辑、加工、保存和(通过网络)进行远程通信。

在不必区分加工处理对象到底是数还是码的场合,我们可将其统称为数据。

有了这些预备知识,现在我们终于可以整体而又简明地介绍计算机的工作原理了。

1.6电子数字计算机:

电子数字计算机(以后简称为计算机)是一个通过执行程序,把数据加工成信息的电子数字设备。

类似于理想厨房系统,计算机也是由硬件(中央处理单元、内存和三套总线、外围设备)和软件(程序)组成。

1.6.1计算机的硬件

计算机硬件主要由以下四个实物部件构成:中央处理单元、内存、三套总线和外围设备。

●内存(相当于自动冰箱):内存主要是由极大量的大小相同的基本存储单元(相当于自动冰箱的格子)组成。每个基本存储单元都具有一个从0开始顺序递增的唯一编号,称为内存基本存储单元的地址(相当于冰箱格子的编号),但在很多书中(包括本书)经常将其简称为内存地址。

现代计算机,大多数是以字节(而不是以更小的“位”)作为基本存储单元,来分割内存的。内存负责临时保存正在执行(和将要执行)的程序的指令序列、程序要加工的数据和处理

结果。这些内容在内存中,全部都是以二进制位串形式存放的。如下图1.14所示:

内存地址内存基本存储单元中

存放的位串(即字节)

…… 0000000010000000 0000000010000001 0000000010000010 0000000010000100 0000000010000101 ……

图 1.14 内存片段示意图:由具有唯一地址的大量内存基本存储单元构成的内存。在每个基本存储单元中,可以存放长度为一个字节的指令或数据。

一条指令(或者一个数据)如果太长,一个基本存储单元(注)存放不下,就要用内存地址连续的几个基本存储单元来存放。

(注)不少教科书把内存的一个基本存储单元称作为一个字节。n 个基本存储单元就称为n 个字节。

●三套总线(相当于三条传送带):分别是数据总线、地址总线和控制总线,负责中央处理单元与内存之间的通信及数据(包括程序中的指令、数据和信息)传送。

●中央处理单元,简称CPU (相当于理想厨房):负责通过三套总线,到内存中去取程序..(相当于菜谱)中的指令..

(相当于加工步骤),并根据指令对数据(相当于原材料)进行运算处理(相当于加工原材料)以及进行相关的控制工作。中央处理单元中的主要部件有:控制器或称为控制单元(相当于厨房管理员)、运算器(即ALU ,相当于厨师加炊具)和一些寄存器(相当于厨房中的碟子)。

●外围设备(相当于配菜员或传菜生)包括输入设备....(键盘、鼠标、网卡、数码相机、麦克风等)、输出设备....(显示器、打印机、网卡、音箱等)和外存..(硬盘、U 盘、光盘等)。包含机械部件的外围设备,其工作速度比计算机中的纯电子器件(CPU 、内存、三套总线)慢得多。在本章中,我们暂不对外围设备的工作原理进行讨论(在最后一章进行讲解)。

●计算机结构示意图,如图1.13所示

图1.13计算机结构示意图 要替换

1.6.2计算机的软件

构成计算机的部件中,还有一个无重量的、无体积的、不会损坏、可经常更换的,极为

地址总线 数据总线

控制总线

CPU

内存

I/O 设备 I/O 设备

重要的软件部件,即命令计算机如何进行工作的信息流——程序。程序是由一条条指令顺序组成的指令序列(相当于菜谱中的一系列加工步骤)。

构成程序的指令序列,必须按执行的先后顺序依次存放在内存中。

计算机的构成简图(此图没有包括外围设备)如图1.15所示:

中央处理单元(CPU ) 内存

数据总线 地址总线

控制总线

图1.15计算机系统的构成简图

图1.15所示计算机的CPU 中各种寄存器的作用:

R0、R1、R2是一些通用寄存器,用来临时存放从内存取来的数据或运算得到的结果。 PC 寄存器:存放下一条要执行的指令位于内存的哪个存储单元中。 IR 寄存器:用来存放刚从内存取过来的马上要执行的指令。 1.6.3计算机指令执行的全过程 ●指令的格式

任何类型的计算机,指令的通常格式为:

操作码 <操作数>

操作码告诉计算机要做什么事,操作数告诉计算机对存放在哪里的数(或什么数)做这件事。操作码是所有指令必须有的,一般的指令通常有一到三个操作数。但有些指令没有操作数(这通常是由于这种指令的操作数默认是在某个或某几个寄存器中)。我们在第12章将再次深入一步讨论这个问题。

比如在一台极简单的计算机上,可以用操作码00001表示加法、00010表示减法,等等。 ●指令执行的全过程

与理想厨房执行加工步骤类似,中央处理单元( CPU )执行指令的过程,也完全是周期性 的。

控制器首先要根据PC 寄存器中的值(这个值指示将要执行的指令,位于内存的哪一个存储单元中),通过三套总线密切配合,到内存中去取这条指令。取到CPU 并把它放到指令寄存器 (即IR 寄存器) 之后,PC 寄存器中的原来值,将会加上L(L 是刚取到的这条指令的

字节数),以便为取下一条指令做准备。

控制器对取到的该条指令进行译码,然后根据这条指令的指示,通过总线命令计算机的各部件,去执行以下七大类型指令(类似于所有英文单词分为动词、名词、形容词等几大类)中的一种:

1.通过三套总线,命令内存,把指定地址存储单元中的(运算过程中马上要用到的)数据,送到中央处理单元中(的某个寄存器)来。(取数据指令)

2.命令运算器按照指令的要求,对数据作一次基本运算(注1)。(数值运算类指令)注1:基本运算包括:算术运算(加、减、乘、除)、逻辑运算(与、或、非)和移位运算等等。

3.通过向三套总线向内存发命令,把某个寄存器中的运算结果(或中间运算结果)送回到内存中(由内存地址)指定的存储单元中存放——即保存结果。(存数据指令)

4.在中央处理单元中的各个寄存器之间传送数据——在中央处理单元内部进行数据传送(数据移动指令);

5.根据某个状态寄存器中的某个条件(比如上一条指令的运算结果大于零),条件不成立根据PC的值正常取出并执行下一条指令;如果条件成立,就不按正常顺序取出并且执行下一条指令,而是根据此指令中给出的内存的(偏移或绝对)地址,修改PC寄存器中的数值,从而实现跳转(注2);(跳转类指令)

注2:这是有条件跳转指令。还有一种无条件跳转指令,是不需任何条件就进行跳转的。进一步的讨论参见1.10的第(7)点。

6.通过接口电路,命令输出设备输出一个数据(注3)。(输入指令)

7.通过接口电路,命令输入设备输入一个数据(注3)。(输出指令)

绝大多数计算机都具有这七大类指令,高级一些的计算机指令的类型还更多。

一条指令运行完毕后,CPU立即自动进行下一个形式上完全类似的、新的取指令——执行指令的周期。

一条指令的运行周期,可分为取指子周期和执行子周期这两个阶段。

由控制器发起的,反复、自动、快速进行的取指令——执行指令周期,是计算机中完成各种任务的核心动作(这就象反复、自动进行的心脏搏动周期,是人体进行各种活动的核心运动一样)。

1.7计算机中的指令集和机器语言程序:

●计算机的指令集

一台计算机能够执行的指令类型的总数是有限的(就象英文单词总数是有限的)。随着计算机类型的不同,大约在几十种到几百种之间。所有这些不同种类指令的集合,称为该类型计算机的指令集(类似于英文单词表)。

虽然指令集中的指令数量是有限的。然而,用指令集中的有限种指令,可以编写出来的

程序(即指令序列)的数量却是无限的(就像用有限的英文单词可以写出无限多的英文文章类似)。

问题1.一台计算机的指令集中共有20条指令,至少要用多少位的二进制位串来表示这些指令的操作码?是否存在非法指令?

●机器语言程序

用这种二进制的指令集中的指令编写出来的完成某个数据处理工作的指令序列,称为机器语言程序。

机器语言程序是可以直接在计算机上运行的唯一一种程序。因为只有它,才可以直接转变为计算机的数字电路中运行时所需要的驱动各条电路中的低电压电平(比如用0—2伏当作为二进制“0”)或高电压电平(比如用2—5伏当作为二进制“1”)。

不同类型的计算机所具有的指令集是不同的。比如:在一台A计算机上,操作码00010表示的是加法指令;而在另一台不同类型的 B计算机上,操作码00010表示的却可能是无条件跳转指令;再有一台C计算机,它所有的操作码可能不用是5位二进制位串,而是用的8位二进制位串。

也就是说,为一种类型计算机编写的机器语言程序,是不能够拿到另一种不同类型的计算上去运行的。任何一类计算机都有自己的“方言”。这是用机器语言进行编程的无奈之处。

1.8程序实例讲解(片断)与练习:

现在,我们可以用上述这些计算机系统的术语,来取代理想厨房系统的工作原理叙述中所用到的理想厨房系统的相应术语。那么它恰好就变成了对计算机系统的工作原理的一个简要地、然而又是整体地介绍(对计算机工作原理的更深入一些的阐述,可参见第12章)。

这种简要性和整体性,对于我们从整体上完全把握计算机系统的基本工作原理,是极为重要的。

下面,请读者通过做以下这个练习,来熟悉计算机的基本工作原理。

例题1.1 :将第一个数2存放在内存地址为5的基本存储单元中。将第二个数11存放在内存地址为6的基本存储单元中,程序的指令序列,存放在从地址0开始到地址3结束的内存基本存储单元中。内存地址0——3的基本存储单元中存放的指令序列,将完成一个2+11的加法运算,并将结果存放到内存地址为7的存储单元中。

CPU 内存

寄存器数据地址内存单元中的指令或数据

数据总线

地址总线

控制总线

图1.16 示意图

(注意:在计算机内存中的指令、数据和内存地址,实际上都只能是二进制位串形式的。此图只是一个计算机结构和工作原理的示意图,所以用了一些陈述性的汉语句子来代替那些二进制的机器指令;用了10进制的数据取代了那些二进制的数据。关于机器语言形式的指令、数据和程序的运行,请参见第12章)

下面对这个程序的运行过程进行讲解(片断):

控制单元根据PC寄存器中的数字“0”,知道要到内存地址为0的基本存储单元中去取指令。于是,控制单元向控制总线上送出一个“取”信号,然后马上将PC寄存器的数字“0”复制后放到地址总线上。这两个信号都会到达内存。内存收到这两个信号后,将地址为0

的基本存储单元的内容“取地址5到R0寄存器”复制后放到数据总线上,送往CPU,CPU 收到后自动放到指令寄存器IR中,然后,控制单元将PC寄存器中的值增加1(以便为取下一条指令做好准备);取指令周期完成后计算机处于如下图1.17状态:

CPU 内存

数据总线

地址总线

控制总线

下面开始这条取来指令的执行周期……;

……。

重要练习:下面请你模仿理想厨房的炒菜实例1.2节,继续讲述计算机是如何执行指令,将两数相加的结果13,存放在内存地址为7的基本存储单元中的。建议读者都要做此重要练习。

1.9计算机的重要特点

下面,请你认真考虑一下与1.2节末类似的计算机中的相关的以下重要问题:

问题1. 计算机将要执行的某道程序的所有指令是以何种形式,存放在何处的?

问题2. CPU如何才能从内存中取到一条指令?取到指令后存放到了CPU的何处?

问题3. 编写机器语言程序很困难吗?

问题4. 你能简要叙述一下,CPU中控制器的工作步骤吗?

现在,我们来进一步归纳、总结这个比较陌生的计算机系统中的我们感兴趣的其他一些重要特点:

(1)存储在内存中的,由指令序列构成的程序,是计算机能够完成任何一件数据处理任务的必不可少的“控制信息流”。

相关主题
文本预览
相关文档 最新文档