计算机系统概述
为什么要学习计算机系统基础
为什么要学习“计算机系统基础”呢?
– 为了编程序时少出错
– 为了在程序出错时很快找到出错的地方
– 为了明白程序是怎样在计算机上执行的
– 为了强化“系统思维”
– 为了更好地理解计算机系统,从而编写出更好的程序
– 为后续课程的学习打下良好基础
– 为了编写出更快的程序
– 为了更好地认识计算机系统
计算机基本组成与基本功能
冯·诺依曼结构计算机模型:
冯·诺依曼结构的主要思想
- 计算机应由运算器、控制器、存储器、输入设备和输出设备
五个基本部件组成。
- 各基本部件的功能是:
存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
控制器应能自动取出指令来执行;
运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;
操作人员可以通过输入设备、输出设备和主机进行通信。
-
内部以二进制表示指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。
-
采用**“存储程序**”工作方式。
认识计算机中最基本的部件
CPU:中央处理器;PC:程序计数器;MAR:存储器地址寄存器
ALU:算术逻辑部件;IR:指令寄存器;MDR:存储器数据寄存器
GPRs:通用寄存器组(由若干通用寄存器组成,早期就是累加器)
计算机是如何工作的?
程序由指令组成
程序在执行前 数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC
开始执行程序
第一步:根据PC取指令
(从5号架上取菜谱)
第二步:指令译码(看菜谱)
第三步:取操作数(从架上或盘中取原材料)
第四步:指令执行(洗、切、炒等具体操作)
第五步:回写结果(装盘或直接送桌)
第六步:修改PC的值(算出下一菜谱所在架子号6=5+1)
继续执行下一条指令(继续做下一道菜)
指令和数据
程序启动前,指令和数据都存放在存储器中,形式上没有差别, 都是0/1序列
• 采用”存储程序“工作方式:
– 程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人的干预。
• 指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU内的寄存器中,指令在IR中,数据在GPR中。
指令中需给出的信息:
- 操作性质(操作码)
- (单目运算,双目运算) 源操作数1 或/和 源操作数2 (立即数、寄存器编号、存储地址)
- 目的操作数地址 (寄存器编号、存储地址)
存储地址的描述与操作数的数据结构有关
计算机的基本组成与基本功能
• 什么是计算机?
–计算机是一种能对数字化信息进行自动、高速算术和逻辑运算的处理装置。
• 计算机的基本部件及功能:
–运算器(数据运算):ALU、GPRs、标志寄存器等
–存储器(数据存储):存储阵列、地址译码器、读写控制电 路
–总线(数据传送):数据(MDR)、地址(MAR)和控制线
–控制器(控制):对指令译码生成控制信号
• 计算机实现的所有任务都是通过执行一条一条指令完成
程序开发和执行过程简介
最早的程序开发过程
用机器语言编写程序,并记录在纸带或卡片上,穿孔表示0,未穿孔表示1
用汇编语言开发程序
优点:不会因为增减指令而需要修改其他指令.不需记忆指令编码,编写方便,可读性比机器语言强
这带来新的问题
人容易了,可机器不认识这些指令了!-需将汇编语言转换为机器语言用汇编程序转换
进一步认识机器级语言
汇编语言(源)程序由汇编指令构成
汇编指令:用助记符和标号来表示的指令(与机器指令一一对应)
指令:
包含操作码和操作数或其地址码(机器指令用二进制表示,汇编指令用符号表示)
描述:取(或存一个数) 两个数加(或减、乘、除、与、或等)
根据运算结果判断是否转移执行
结论:用汇编语言比机器语言好,但是,还是很麻烦!
用高级语言开发程序
随着技术的发展,出现了许多高级编程语言
-
它们与具体机器结构无关
-
面向算法描述,比机器级语言描述能力强得多
-
高级语言中一条语句对应几条、几十条甚至几百条指令
-
有“面向过程”和“面向对象”的语言之分
-
处理逻辑分为三种结构: 顺序结构、选择结构、循环结构
-
有两种转换方式:“编译”和“解释”
• 编译程序(Complier):将高级语言源程序转换为机器级目 标程序,执行时只要启动目标程序即可
• 解释程序(Interpreter ):将高级语言语句逐条翻译成机器 指令并立即执行,不生成目标文件。
一个典型程序的转换处理过程
Hello程序的数据流动过程
数据经常在各存储部件间传送。故现代计算机大多采用“缓存”技术!
所有过程都是在CPU执行指令所产生的控制信号的作用下进行的。
不同层次语言之间的等价转换
任何高级语言程序最终通过执行若干条指令来完成!
计算机系统层次架构
早期计算机系统的层次
最早的计算机用机器语言编程
机器语言称为第一代程序设计语言(First generation programming
后来用汇编语言编程
汇编语言称为第二代程序设计语言(Second generation programming
现代(传统)计算机系统的层次
现代计算机用高级语言编程
第三代程序设计语言(3GL)为过程式语言,编码时需要描述实现过程,即
“如何做”。第四代程序设计语言(4GL) 为非过程化语言,编码时只需说明
语言处理系统包括:各种语言处理程序(如编译、汇编、链接)、运行时系统(如库函数,调试、优化等功能)
操作系统包括人机交互界面、 提供服务功能的内核例程
可以看出:语言的发展是一个不断“抽象”的过程,因而,相应的计算机系统也不断有新的层次出现
计算机系统的不同用户
- 最终用户工作在由应用程序提供的最上面的抽象层
- 系统管理员工作在由操作系统提供的抽象层
- 应用程序员工作在由语言处理系统(主要有编译器和汇编器)的抽象层
- 语言处理系统建立在操作系统之上
- 系统程序员(实现系统软件)工作在ISA层次,必须对ISA非常了解
- 编译器和汇编器的目标程序由机器级代码组成
- 操作系统通过指令直接对硬件进行编程控制
- ISA处于软件和硬件的交界面(接口)ISA是对硬件的抽象
指令集体系结构(ISA)
ISA指Instruction Set Architecture,即指令集体系结构,有时简称为指令系统
ISA是一种规约(Specification),它规定了如何使用硬件
- 可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;
- 指令可以接受的操作数的类型
- 操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
- 操作数所能存放的存储空间的大小和编址方式;
- 操作数在存储空间存放时按照大端还是小端方式存放;
- 指令获取操作数的方式,即寻址方式;
- 指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等。
• ISA在通用计算机系统中是必不可少的一个抽象层,Why?
没有它,软件无法使用计算机硬件!
没有它,一台计算机不能称为“通用计算机”
ISA和计算机组成(Organization,即MicroArchitecture)是何关系?
数据的表示和存储
数制和编码
“转换”的概念在数据表示中的反映
信息的二进制编码
机器级数据分两大类
- 数值数据:无符号整数、带符号整数、浮点数(实数) –
- 非数值数据:逻辑数(包括位串)、西文字符和汉字 •
计算机内部所有信息都用二进制(即:0和1)进行编码 •
用二进制编码的原因
- 制造二个稳定态的物理器件容易(电位高/低,脉冲有/无,正/负极)
- 二进制编码、计数、运算规则简单
- 正好与逻辑命题真/假对应,便于逻辑运算
- 可方便地用逻辑电路实现算术运算
• 真值和机器数 ( 非常重要的概念!)
- 机器数:用0和1编码的计算机内部的0/1序列 –
- 真值:真正的值,即:现实中带正负号的数
例:unsigned short型变量x的真值是127,其机器数是多少?
127=27-1,其机器数为0000 0000 0111 1111
机器数
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。
那么,这里的 0000 0011 和 1000 0011 就是机器数。
真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(1000 0011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
数值数据的表示
数值数据表示的三要素
- 进位计数制
- 定、浮点表示
- 如何用二进制编码
即:要确定一个数值数据的值必须先确定这三个要素。
例如,20137564的值是多少? 答案:无法确定
• 进位计数制
–十进制、二进制、十六进制、八进制数及其相互转换
• 定/浮点表示(解决小数点问题)
- 定点整数、定点小数
- 浮点数(可用一个定点小数和一个定点整数来表示)
• 定点数的编码(解决正负号问题)
原码、补码、反码、移码 (反码很少用)
R进位计数制
八进制和十六进制
日常生活中用十进制表示数值,计算机中用二进制表示所有信息!那为什么还要引入 八进制 / 十六进制呢?
八进制 / 十六进制是二进制的简便表示。便于阅读和书写!它们之间对应简单,转换容易。
在机器内部用二进制表示,在屏幕或其他设备上表示时,转换为八 进制/十六进制数,可缩短长度。
八进制:Octal (用后缀“O”表示) 十六进制:Hexadecimal (用后缀“H”,或前缀“0x”表示)
例:1010 1100 0100 0101 0001 0000 1000 1101B可写成
0xac45108d 0xAC45108D 或 ac45108dH AC45108DH
或 8进制:25421210215O
010 101 100 010 001 010 001 000 010 001 101
现代计算机系统多用十六进制表示机器数
十进制数与R进制数之间的转换
- R进制数 => 十进制数
按“权”展开
(2)十进制数 => 二进制数,再将二进制转换为16或8进制
整数部分和小数部分分别转换
举例:十进制数与8进制数之间的转换
可能小数部分总得不到0,此时得到一个近似值
说明:现实中的精确值可能在机器内部无法用0和1精确表示!
定点数和浮点数
计算机中只有0和1,数值数据中的小数点怎么表示呢?
计算机中只能通过约定小数点的位置来表示
- 小数点位置约定在固定位置的数称为定点数
- 小数点位置约定为可浮动的数称为浮点数
定点小数用来表示浮点数的尾数部分
定点整数用来表示整数,分带符号整数和无符号整数
任何实数:X=(-1)s ×M×RE
其中,S取值为0或1,用来决定数X的符号;M是一个二进制定点小数,称为数X的尾数(mantissa);E是一个二进制定点整数,称为数X的阶或指数(exponent);R是基数(radix、base),可以为2、4和16等。 计算机中只要表示S、M和E三个信息,就能确定X的值,这称为浮点数
定点数的编码表示
https://zhuanlan.zhihu.com/p/91967268
补码 - 模运算(modular运算)
重要概念:在一个模运算系统中,一个数与它除以“模”后的余数等价。
一个负数的补码等于模减该负数的绝对值。
对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。
补码(modular运算):+ 和– 的统一
32位机器中,int、short、char型数据的机器数各占32位、16位、8位
变形补码的表示
补码定义:[X]补= + X (-≤X<,mod )
• 正数:符号位(sign bit)为0,数值部分不变
• 负数:符号位为1,数值部分“各位取反,末位加1”
变形补码:双符号,用于存放可能溢出的中间结果。
移码表示
什么是移码表示?
将每一个数值加上一个偏置常数( Excess / bias**)**
通常,当编码位数为n时,bias取或-1(如 IEEE 754)
为什么要用移码来表示指数(阶码)?
便于浮点数加减运算时的对阶操作(比较大小)
$ $1.01*2{-1+4}+1.11*2{3+4} $
补码:111<011 ? 移码 :011<000
(-1) (3) (3) (7)
C语言中的整数
C语言支持的基本数据类型
整数类型分:无符号整数和带符号整数
无符号整数 (Unsigned integer)
机器中字的位排列顺序有两种方式:
- 高到低位从左到右:
- 高到低位从右到左:
- Leftmost 和 rightmost 这 两 个 词 有 歧 义 , 故 用
- LSB(Least Significant Bit)来表示最低有效位,用MSB来表示最高有效位
- – 高位到低位多采用从左往右排列
• 一般在全部是正数运算且不出现负值结果的场合下,可使用无符号数表示。例如,地址运算,编号表示,等等
• 无符号整数的编码中没有符号位
• 能表示的最大值大于位数相同的带符号整数的最大值(Why?)
– 例如,8位无符号整数最大是255(1111 1111)
而8位带符号整数最大为127(0111 1111)
• 总是整数,所以很多时候就简称为“无符号数”
带符号整数(Signed integer)
计算机必须能处理正数(positive) 和负数(negative),用MSB表示数符(0–正数,1–负数)
有三种定点编码方式
Signed and magnitude (原码)
定点小数,用来表示浮点数的尾数
Excess (biased) notion (移码)
定点整数,用于表示浮点数的阶(指数)
Two’s complement (补码)
50年代以来,所有计算机都用补码来表示带符号整数
• 为什么用补码表示带符号整数?
- 补码运算系统是模运算系统,加、减运算统一
- 数0的表示唯一,方便使用
- 比原码多表示一个最小负数
C语言程序中的整数
无符号数:unsigned int ( short / long);带符号整数: int ( short / long)
常在一个数的后面加一个“u”或“U”表示无符号数
若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数
1)在有些32位系统上,C表达式-2147483648 < 2147483647的执行结
果为false。Why?
2)若定义变量“int i=-2147483648;”,则“i < 2147483647”的执行
结果为true。Why?
3)如果将表达式写成“-2147483647-1 < 2147483647”,则结果会怎样呢?Why?
1)2147483648已经超出了int的范围,会按照unsigned int进行比较,一元负运算符应用于无符号类型,仍为无符号类型
在ISO C90标准下 ,2147483648为unsigned int型,因此“-2147483648 < 2147483647”按无符号数比较,
10……0B比01……1B大,结果为false。在ISO C99标准下 ,2147483648为long long型,因此“-2147483648 < 2147483647”按带符号整数比较,10……0B比01……1B小,结果为true。
2)i < 2147483647 按int型数比较,结果为true。
3)-2147483647-1 < 2147483647 按int型比较,结果为true。
浮点数的编码表示
非数值数据的编码表示
西文字符的编码表示
特点
- 是一种拼音文字,用有限几个字母可拼写出所有单词
- 只需对有限个字母和数学符号、标点符号等辅助字符编码
- 所有字符总数不超过256个,使用7或8个二进位可表示
• 表示(常用编码为7位ASCII码)
- 十进制数字:0/1/2…/9
- 英文字母:A/B/…/Z/a/b/…/z
- 专用符号:+/-/%/*/&/……
- 控制字符(不可打印或显示)
• 操作
字符串操作,如:传送/比较
汉字及国际字符的编码表示
汉字特点
- 汉字是表意文字,一个字就是一个方块图形。
- 汉字数量巨大,总数超过6万字,给汉字在计算机内部的表示、
- 汉字的传输与交换、汉字的输入和输出等带来了一系列问题。
编码形式
–有以下几种汉字代码:
- 输入码:对汉字用相应按键进行编码表示,用于输入
- 内码:用于在系统中进行存储、查找、传送等处理
- 字模点阵或轮廓描述: 描述汉字字模点阵或轮廓,用于显示/打印
GB2312-80字符集
由三部分组成
- 字母、数字和各种符号,包括英文、俄文、日文平假名与片假名、罗马字母、汉语拼音等共687个
- 一级常用汉字,共3755个,按汉语拼音排列
- 二级常用汉字,共3008个 ,不太常用,按偏旁部首排列
• 汉字的区位码
- 码表由94行、94列组成,行号为区号,列号为位号,各占7位
- 指出汉字在码表中的位置,共14位,区号在左、位号在右
汉字的国标码
- 每个汉字的区号和位号各自加上32(20H),得到其“国标码”
- 国标码中区号和位号各占7位。在计算机内部,为方便处理与存储,前面添一个0,构成一个字节
汉字内码
至少需2个字节才能表示一个汉字内码。为什么?
–由汉字的总数(超过6万字)决定!
• 可在GB2312国标码的基础上产生汉字内码
为与ASCII码区别,将国标码的两个字节的第一位置“1”后得到一种汉字内码(可以有不同的编码方案)
例:汉字“大”在码表中位于第20行、第83列。因此区位码为0010100 1010011
,在区、位码上各加32得到两个字节编码,即00110100 01110011B=3473H。前面的34H和字符“4”的ACSII码相同,后面的73H和字符“s”的ACSII码相同,但是,将每个字节的最高位各设为“1”后,就得到其内码:B4F3H (1011010011110011B),因而不会和ASCII码混淆。
多媒体信息的表示
图形、图像、音频、视频等信息在机器内部也用0和1表示
- 图形用构建图形的直线或曲线的坐标点及控制点来描述,而这些 坐标点或控制点则用数值数据描述
- 图像用构成图像的点(像素)的亮度、颜色或灰度等信息来描述 ,这些亮度或颜色等值则用数值数据描述
- 音频信息通过对模拟声音进行采样、量化(用二进制编码)来获 得,因此量化后得到的是一个数值数据序列(随时间变化)
- 视频信息描述的是随时间变化的图像(每一幅图像称为一帧)
- 音乐信息(MIDI)通过对演奏的乐器、乐谱等相关的各类信息用 0和1进行编码来描述
多媒体信息用一个复杂的数据结构来描述,其中的基本数据或者 是数值数据,或者是用0/1编码的非数值数据
数据宽度和存储容量的单位
数据的基本宽度
• 比特(bit,位)是计算机中处理、存储、传输信息的最小单位
• 二进制信息最基本的计量单位是“字节”(Byte)
–现代计算机中,存储器按字节编址
–字节是最小可寻址单位 (addressable unit )
–如果以字节为一个排列单位,则LSB表示最低有效字节,MSB
表示最高有效字节
• 除比特(位)和字节外,还经常使用“字”(word) 作为单位
–“字”和 “字长”的概念不同
IA-32中的“字”有多少位? 16位 字长多少位呢? 32位
DWORD :32位
QWORD:64位
“字”和 “字长”的概念不同
–“字长”指数据通路的宽度。
”字长”等于CPU内部总线的宽度、运算器的位数、通用
寄存器的宽度(这些部件的宽度都是一样的)
–“字”表示被处理信息的单位,用来度量数据类型的宽度
–字和字长的宽度可以一样,也可不同
例1:对于x86体系结构,不管字长多少,定义“字”的宽度都为16位,而从386开始字长就是32位了。
例2:对于MIPS 32体系结构,其字和字长都是32位
数据通路的宽度
数据通路指CPU内部数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。
程序中数据类型的宽度
从表中看出:同类型数据并不是所有机器都采用相同的宽度,分配的字节数
随ISA、机器字长和编译器的不同而不同。
例如,ANSI C标准未规定long double的确切精度,所以对于不同平台有不同的实现。有的是8字节,有的是10字节,有的是12字节或16字节。
数据存储时的字节排列
• 需要考虑以下问题:
–变量的地址是其最大地址还是最小地址?
最小地址,即x存放在100#~103#!
–多个字节在存储单元中存放的顺序如何?
大端方式/小端方式
数据的存储和排列顺序
字节交换问题
存放方式不同的机器间程序移植或数据通信时,会发生什么问题?
每个系统内部是一致的,但在系统间通信时可能会发生问题!
因为顺序不同,需要进行顺序转换
音、视频和图像等文件格式或处理程序都涉及到字节顺序问题
ex. Little endian: GIF, PC Paintbrush, Microsoft RTF,etc
Big endian: Adobe Photoshop, JPEG, MacPaint, etc