avatar

目录
计算机系统基础

计算机系统概述

为什么要学习计算机系统基础

0-1

为什么要学习“计算机系统基础”呢?

为了编程序时少出错

为了在程序出错时很快找到出错的地方

为了明白程序是怎样在计算机上执行的

为了强化“系统思维”

为了更好地理解计算机系统,从而编写出更好的程序

为后续课程的学习打下良好基础

为了编写出更快的程序

为了更好地认识计算机系统

计算机基本组成与基本功能

冯·诺依曼结构计算机模型:

0-2

冯·诺依曼结构的主要思想

  1. 计算机应由运算器、控制器、存储器、输入设备和输出设备

​ 五个基本部件组成。

  1. 各基本部件的功能是:

存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;

控制器应能自动取出指令来执行;

运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;

​ 操作人员可以通过输入设备、输出设备和主机进行通信。

  1. 内部以二进制表示指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。

  2. 采用**“存储程序**”工作方式。

    认识计算机中最基本的部件

    CPU:中央处理器;PC:程序计数器;MAR:存储器地址寄存器

    ALU:算术逻辑部件;IR:指令寄存器;MDR:存储器数据寄存器

    GPRs:通用寄存器组(由若干通用寄存器组成,早期就是累加器)

0-3

计算机是如何工作的?

程序由指令组成

程序在执行前 数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC

开始执行程序

第一步:根据PC取指令

(从5号架上取菜谱)

第二步:指令译码(看菜谱)

第三步:取操作数(从架上或盘中取原材料)

第四步:指令执行(洗、切、炒等具体操作)

第五步:回写结果(装盘或直接送桌)

第六步:修改PC的值(算出下一菜谱所在架子号6=5+1)

继续执行下一条指令(继续做下一道菜)

指令和数据

程序启动前,指令和数据都存放在存储器中,形式上没有差别, 都是0/1序列

• 采用”存储程序“工作方式:

– 程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人的干预。

• 指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU内的寄存器中,指令在IR中,数据在GPR中。

指令中需给出的信息:

  1. 操作性质(操作码)
  2. (单目运算,双目运算) 源操作数1 或/和 源操作数2 (立即数、寄存器编号、存储地址)
  3. 目的操作数地址 (寄存器编号、存储地址)

存储地址的描述与操作数的数据结构有关

计算机的基本组成与基本功能

什么是计算机?

–计算机是一种能对数字化信息进行自动、高速算术和逻辑运算的处理装置。

计算机的基本部件及功能:

–运算器(数据运算):ALU、GPRs、标志寄存器等

–存储器(数据存储):存储阵列、地址译码器、读写控制电 路

–总线(数据传送):数据(MDR)、地址(MAR)和控制线

–控制器(控制):对指令译码生成控制信号

计算机实现的所有任务都是通过执行一条一条指令完成

程序开发和执行过程简介

最早的程序开发过程

机器语言编写程序,并记录在纸带或卡片上,穿孔表示0,未穿孔表示1

用汇编语言开发程序

优点:不会因为增减指令而需要修改其他指令.不需记忆指令编码,编写方便,可读性比机器语言强

这带来新的问题

人容易了,可机器不认识这些指令了!-需将汇编语言转换为机器语言用汇编程序转换

进一步认识机器级语言

汇编语言(源)程序由汇编指令构成

汇编指令:用助记符和标号来表示的指令(与机器指令一一对应)

指令

包含操作码和操作数或其地址码(机器指令用二进制表示,汇编指令用符号表示)

描述:取(或存一个数) 两个数加(或减、乘、除、与、或等)

根据运算结果判断是否转移执行

结论用汇编语言比机器语言好,但是,还是很麻烦!

用高级语言开发程序

随着技术的发展,出现了许多高级编程语言

  1. 它们与具体机器结构无关

  2. 面向算法描述,比机器级语言描述能力强得多

  3. 高级语言中一条语句对应几条、几十条甚至几百条指令

  4. 有“面向过程”和“面向对象”的语言之分

  5. 处理逻辑分为三种结构: 顺序结构、选择结构、循环结构

  6. 有两种转换方式:“编译”和“解释”

    • 编译程序(Complier):将高级语言源程序转换为机器级目 标程序,执行时只要启动目标程序即可

    • 解释程序(Interpreter ):将高级语言语句逐条翻译成机器 指令并立即执行,不生成目标文件。

一个典型程序的转换处理过程0-4

Hello程序的数据流动过程0-5

数据经常在各存储部件间传送。故现代计算机大多采用“缓存”技术!

所有过程都是在CPU执行指令所产生的控制信号的作用下进行的。

不同层次语言之间的等价转换0-6

任何高级语言程序最终通过执行若干条指令来完成!

开发和运行程序需什么支撑?0-7_ys

计算机系统层次架构

早期计算机系统的层次

最早的计算机用机器语言编程

机器语言称为第一代程序设计语言(First generation programming

language ,1GL )0-8

后来用汇编语言编程

汇编语言称为第二代程序设计语言(Second generation programming

language ,2GL )0-9

现代(传统)计算机系统的层次

现代计算机用高级语言编程

第三代程序设计语言(3GL)为过程式语言,编码时需要描述实现过程,即

“如何做”。第四代程序设计语言(4GL) 为非过程化语言,编码时只需说明

“做什么”, 不需要描述具体的算法实现细节。0-10

语言处理系统包括:各种语言处理程序(如编译、汇编、链接)、运行时系统(如库函数,调试、优化等功能)

操作系统包括人机交互界面、 提供服务功能的内核例程

可以看出:语言的发展是一个不断“抽象”的过程,因而,相应的计算机系统也不断有新的层次出现

计算机系统的不同用户

  1. 最终用户工作在由应用程序提供的最上面的抽象层
  2. 系统管理员工作在由操作系统提供的抽象层
  3. 应用程序员工作在由语言处理系统(主要有编译器和汇编器)的抽象层
  4. 语言处理系统建立在操作系统之上
  5. 系统程序员(实现系统软件)工作在ISA层次,必须对ISA非常了解
  6. 编译器和汇编器的目标程序由机器级代码组成
  7. 操作系统通过指令直接对硬件进行编程控制
  8. ISA处于软件和硬件的交界面(接口)ISA是对硬件的抽象

0-11

指令集体系结构(ISA)

ISA指Instruction Set Architecture,即指令集体系结构,有时简称为指令系统

ISA是一种规约(Specification),它规定了如何使用硬件

  1. 可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;
  2. 指令可以接受的操作数的类型
  3. 操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
  4. 操作数所能存放的存储空间的大小和编址方式;
  5. 操作数在存储空间存放时按照大端还是小端方式存放;
  6. 指令获取操作数的方式,即寻址方式;
  7. 指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等。

• ISA在通用计算机系统中是必不可少的一个抽象层,Why?

没有它,软件无法使用计算机硬件!

没有它,一台计算机不能称为“通用计算机”

ISA和计算机组成(Organization,即MicroArchitecture)是何关系?0-12

数据的表示和存储

数制和编码

“转换”的概念在数据表示中的反映

1.1

1-2

信息的二进制编码

机器级数据分两大类

  1. 数值数据:无符号整数、带符号整数、浮点数(实数) –
  2. 非数值数据:逻辑数(包括位串)、西文字符和汉字 •

计算机内部所有信息都用二进制(即:0和1)进行编码 •

用二进制编码的原因

  1. 制造二个稳定态的物理器件容易(电位高/低,脉冲有/无,正/负极)
  2. 二进制编码、计数、运算规则简单
  3. 正好与逻辑命题真/假对应,便于逻辑运算
  4. 可方便地用逻辑电路实现算术运算

• 真值和机器数 ( 非常重要的概念!)

  1. 机器数:用0和1编码的计算机内部的0/1序列 –
  2. 真值:真正的值,即:现实中带正负号的数

例: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

数值数据的表示

数值数据表示的三要素

  1. 进位计数制
  2. 定、浮点表示
  3. 如何用二进制编码

即:要确定一个数值数据的值必须先确定这三个要素。

例如,20137564的值是多少? 答案:无法确定

• 进位计数制

–十进制、二进制、十六进制、八进制数及其相互转换

• 定/浮点表示(解决小数点问题)

  1. 定点整数、定点小数
  2. 浮点数(可用一个定点小数和一个定点整数来表示)

• 定点数的编码(解决正负号问题)

原码、补码、反码、移码 (反码很少用)

R进位计数制1-3

八进制和十六进制

日常生活中用十进制表示数值,计算机中用二进制表示所有信息!那为什么还要引入 八进制 / 十六进制呢?

​ 八进制 / 十六进制是二进制的简便表示。便于阅读和书写!它们之间对应简单,转换容易。

​ 在机器内部用二进制表示,在屏幕或其他设备上表示时,转换为八 进制/十六进制数,可缩短长度。

八进制: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进制数之间的转换

  1. R进制数 => 十进制数

按“权”展开

(2)十进制数 => 二进制数,再将二进制转换为16或8进制

整数部分和小数部分分别转换

举例:十进制数与8进制数之间的转换

1-4

可能小数部分总得不到0,此时得到一个近似值

说明:现实中的精确值可能在机器内部无法用0和1精确表示!

定点数和浮点数

计算机中只有0和1,数值数据中的小数点怎么表示呢?

​ 计算机中只能通过约定小数点的位置来表示

  1. 小数点位置约定在固定位置的数称为定点数
  2. 小数点位置约定为可浮动的数称为浮点数

定点小数用来表示浮点数的尾数部分

定点整数用来表示整数,分带符号整数和无符号整数

任何实数: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的值,这称为浮点数

1-5结论:要解决数值数据的表示问题,只要解决定点数的编码问题!

定点数的编码表示

https://zhuanlan.zhihu.com/p/91967268

补码 - 模运算(modular运算)

重要概念:在一个模运算系统中,一个数与它除以“模”后的余数等价。

一个负数的补码等于模减该负数的绝对值。

对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。

补码(modular运算):+ 和– 的统一

32位机器中,int、short、char型数据的机器数各占32位、16位、8位

变形补码的表示

补码定义:[X]补= 2n2^{n} + X (-2n2^{n}≤X<2n2^{n},mod 2n2^{n}

• 正数:符号位(sign bit)为0,数值部分不变

• 负数:符号位为1,数值部分“各位取反,末位加1”

变形补码:双符号,用于存放可能溢出的中间结果。

移码表示

什么是移码表示?

将每一个数值加上一个偏置常数( Excess / bias**)**

通常,当编码位数为n时,bias取2n12^{n-1}2n12^{n-1}-1(如 IEEE 754)

为什么要用移码来表示指数(阶码)?

便于浮点数加减运算时的对阶操作(比较大小)

1.0121+1.11231.01*2^{-1}+1.11*2^{3}$ $1.01*2{-1+4}+1.11*2{3+4} $

补码:111<011 ? 移码 :011<000

​ (-1) (3) (3) (7)

C语言中的整数

C语言支持的基本数据类型

1-6

整数类型分:无符号整数和带符号整数

无符号整数 (Unsigned integer)

机器中字的位排列顺序有两种方式:

  1. 高到低位从左到右:
  2. 高到低位从右到左:
  3. Leftmost 和 rightmost 这 两 个 词 有 歧 义 , 故 用
  4. LSB(Least Significant Bit)来表示最低有效位,用MSB来表示最高有效位
  5. – 高位到低位多采用从左往右排列

• 一般在全部是正数运算且不出现负值结果的场合下,可使用无符号数表示。例如,地址运算,编号表示,等等

• 无符号整数的编码中没有符号位

• 能表示的最大值大于位数相同的带符号整数的最大值(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年代以来,所有计算机都用补码来表示带符号整数

• 为什么用补码表示带符号整数?

  1. 补码运算系统是模运算系统,加、减运算统一
  2. 数0的表示唯一,方便使用
  3. 比原码多表示一个最小负数

C语言程序中的整数

无符号数:unsigned int ( short / long);带符号整数: int ( short / long)

常在一个数的后面加一个“u”或“U”表示无符号数

若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数

编译器处理常量时默认的类型:1-7

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。1-8

浮点数的编码表示

实数类型分:单精度浮点、浮点双精度和扩展精度浮点1-9

非数值数据的编码表示

西文字符的编码表示

特点

  1. 是一种拼音文字,用有限几个字母可拼写出所有单词
  2. 只需对有限个字母和数学符号、标点符号等辅助字符编码
  3. 所有字符总数不超过256个,使用7或8个二进位可表示

• 表示(常用编码为7位ASCII码)

  1. 十进制数字:0/1/2…/9
  2. 英文字母:A/B/…/Z/a/b/…/z
  3. 专用符号:+/-/%/*/&/……
  4. 控制字符(不可打印或显示)

• 操作

​ 字符串操作,如:传送/比较

1-10

汉字及国际字符的编码表示

汉字特点

  1. 汉字是表意文字,一个字就是一个方块图形。
  2. 汉字数量巨大,总数超过6万字,给汉字在计算机内部的表示、
  3. 汉字的传输与交换、汉字的输入和输出等带来了一系列问题。

编码形式

–有以下几种汉字代码:

  1. 输入码:对汉字用相应按键进行编码表示,用于输入
  2. 内码:用于在系统中进行存储、查找、传送等处理
  3. 字模点阵或轮廓描述: 描述汉字字模点阵或轮廓,用于显示/打印

GB2312-80字符集

由三部分组成

  1. 字母、数字和各种符号,包括英文、俄文、日文平假名与片假名、罗马字母、汉语拼音等共687个
  2. 一级常用汉字,共3755个,按汉语拼音排列
  3. 二级常用汉字,共3008个 ,不太常用,按偏旁部首排列

• 汉字的区位码

  1. 码表由94行、94列组成,行号为区号,列号为位号,各占7位
  2. 指出汉字在码表中的位置,共14位,区号在左、位号在右

汉字的国标码

  1. 每个汉字的区号和位号各自加上32(20H),得到其“国标码”
  2. 国标码中区号和位号各占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表示

  1. 图形用构建图形的直线或曲线的坐标点及控制点来描述,而这些 坐标点或控制点则用数值数据描述
  2. 图像用构成图像的点(像素)的亮度、颜色或灰度等信息来描述 ,这些亮度或颜色等值则用数值数据描述
  3. 音频信息通过对模拟声音进行采样、量化(用二进制编码)来获 得,因此量化后得到的是一个数值数据序列(随时间变化)
  4. 视频信息描述的是随时间变化的图像(每一幅图像称为一帧)
  5. 音乐信息(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内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。0-3

程序中数据类型的宽度1-11

从表中看出:同类型数据并不是所有机器都采用相同的宽度,分配的字节数

随ISA、机器字长和编译器的不同而不同。

例如,ANSI C标准未规定long double的确切精度,所以对于不同平台有不同的实现。有的是8字节,有的是10字节,有的是12字节或16字节。

数据存储时的字节排列

• 需要考虑以下问题:

–变量的地址是其最大地址还是最小地址?

​ 最小地址,即x存放在100#~103#!

–多个字节在存储单元中存放的顺序如何?

​ 大端方式/小端方式

数据的存储和排列顺序

1-12

字节交换问题

存放方式不同的机器间程序移植或数据通信时,会发生什么问题?

​ 每个系统内部是一致的,但在系统间通信时可能会发生问题!

​ 因为顺序不同,需要进行顺序转换

音、视频和图像等文件格式或处理程序都涉及到字节顺序问题

ex. Little endian: GIF, PC Paintbrush, Microsoft RTF,etc

Big endian: Adobe Photoshop, JPEG, MacPaint, etc

运算电路基础

数字逻辑电路基础

文章作者: Eckle
文章链接: https://wowli-up.github.io/2020/03/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Eckle的个人网站
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论