计算机系统与二进制编码
计算机系统概述冯·诺依曼结构计算机冯诺依曼计算机模型结构与信息流现代计算机系统程序表示与执行过程指令集体系结构计算机系统中的软件机器级语言与高级编程语言翻译程序计算机系统抽象层二进制数的表示计算机的数据数据的抽象层次转化信息的二进制编码不同进制数值数据的编码表示数值数据的表示方法整数的编码表示浮点数的编码表示BCD编码表示十进制非数值数据的储存与排列非数值数据的表示逻辑数据西文的储存中文的储存数据的储存排列数据的宽度数据度量单位数据的储存与排列顺序
计算机系统概述
计算架构分为通用计算架构(RISC-V)以及专用计算架构,我们着重讲解通用计算架构
冯·诺依曼结构计算机
冯诺依曼结构思想:存储程序(Stored- program)工作方式,即任何工作都先按照程序(指令序列)的形式存放起来,计算机启动后自动读取依次执行。
最经典的IAS计算机(1951)就采用的冯诺依曼结构

有一个主存(M),有一个读取指令的部件(PC),有运算单元(AC),有将数据输入的部分(PCU),有输入输出(IO)
冯诺依曼计算机模型结构与信息流

冯诺依曼结构思想总结:
- 计算器由运算器,控制器,存储器,输入和输出组成
- 存储器存储指令和数据,根据具体场景判定类别(指令集)
- 控制器能够读取指令来执行
- 运算器能进行基本的四则运算以及逻辑运算(完备性)
- 内部以二进制表示指令与数据
- 指令:操作码(OP)+地址码(addr)。前者说明类型,后者指明操作数地址
- 采用“存储程序”工作方式
现代计算机系统
重要‼️

CU:control unit 控制器PC:program counter 程序计数器 :保存了要执行的下一条指令的地址。因此,PC指向存放了下一条指令的存储单元。IR:instruction register 指令寄存器:存放最近从存储器中读出的指令,也就是当前正在执行的指令。
ALU:arithmetic and logic unit 算术逻辑单元GPRs:general purpose register set 通用寄存器组——存储数据与结果FLAG:EFLAGS register 状态标志寄存器——存储,返回输出异常给控制器
MM:main memory 主存MAR:memory address register 存储器地址寄存器:保存了读或者写操作正在访问的存储单元的地址,MAR的位数与地址线相同MDR:memory data register 存储器数据寄存器——port for data transition:保存了刚从存储器中读出的数据,或将写人存储器的数据,MDR与数据线的地址相同
程序表示与执行过程
- 程序在执行前 数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、addr字段组成,程序起始地址在PC(原材料和菜谱都放在厨房外的架子上,每个架子有编号。从第5个架上指定菜谱开始做)
- 开始执行程序 第一步:根据PC取指令(从5号架上取菜谱)
第二步:指令译码——读取OP与addr(看菜谱)
第三步:取操作数——根据addr,由CU控制经MDR读取(从架上或盘中取原材料)
第四步:指令执行——ALU执行(洗、切、炒等具体操作)
第五步:回写结果(装盘或直接送桌)
第六步:修改PC的值——自加(算出下一菜谱所在架子号6=5+1)
继续执行下一条指令(继续做下一道菜)
- 过程举例
- 程序启动前,指令和数据都存放在存储器中,形式上没有差别,都是0/1序列
- 采用”存储程序“工作方式:
- 程序电指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人的干预。
- 指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU内的寄存器中,指令在IR中,数据在GPR中。
假设八位定长指令字,4个GPR,16个主存单元
指令格式有两种:R型与M型
格式 | 4位 | 2位 | 2位 | 功能说明 |
R型 | OP | rt | rs | R[rt]←R[rt] OP R[rs] 或者R[rt]←R[rs] |
M型 | OP | addr | addr | R[0]←M[addr] 或者 M[addr]←R[0] |
rs和rt为通用寄存器编号;addr为主存单元地址(rs表示register source,rt为register target)
R型:Op=0000,寄存器间传送(mov);Op=0001,加(add),两个寄存器相加并送入结果所在内存单元
M型:Op=1110,取数(load ),从主存取到GPR;Op=1111,存数(store),从GPR写入主存






Q&AQ:ADD指令只能在GPRs上使用吗A:ADD指令通常是用于在计算机体系结构中执行加法操作的指令。在许多指令集体系结构(Instruction Set Architectures, ISA)中,ADD指令可以用于通用寄存器(General Purpose Registers, GPRs)之间的操作,但并非总是如此。不同的计算机体系结构有不同的指令集设计,其中一些可能限制ADD指令的操作数为通用寄存器,而另一些可能允许在其他寄存器或内存位置上执行加法操作。因此,并非所有的ADD指令都仅限于GPRs。Q:M型指令为什么只能对M[0]操作(load)A:在某些RISC架构中,可能存在一种特定类型的指令,称为"Load"(加载)或"M型指令",专门用于从内存中加载数据到寄存器中。在某些RISC体系结构中,"M型指令"可能被设计成只能操作内存中的特定地址,例如M[0]。这种设计的目的可能是简化硬件实现,提高指令执行的效率,或者符合特定的应用场景。
总结
指令中需给出的信息:
操作性质(操作码)
源操作数1或/和 源操作数2(立即数、寄存器编号、存储地址)
指令集体系结构
- ISA指 Instruction Set Architecture
- ISA是一种规约(Specification),它规定了如何使用硬件
- 可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;
- 指令可以接受的操作数的类型;
- 操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
- 操作数所能存放的存储空间的大小和编址方式;
- 操作数在存储空间存放时按照大端还是小端方式存放;
- 指令获取操作数的方式,即寻址方式;
- 指令执行过程的控制方式,包括程序计数器,条件码定义等;
- ISA是一个不可缺少的抽象层
- 没有的话软件无法使用硬件
- 通用计算机必有指令集
计算机系统中的软件
- System software(系统软件)-简化编程,并使硬件资源被有效利用
- 操作系统(Operating System):硬件资源管理,用户接口
- 语言处理系统:翻译程序+Linker, Debug, etc..
- 翻译程序(Translator)有三类:
- 其他实用程序
汇编程序(Assembler):汇编语言源程序一机器目标程序
编译程序(Complier):高级语言源程序一汇编/机器目标程序
解释程序(Interpreter):将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件。
- Application software(应用软件)-解决具体应用问题/完成具体应用
机器级语言与高级编程语言
翻译程序
汇编将汇:编翻译为机器语言,编译:将高级语言翻译为汇编或机器,解释:将原语言程序按顺序逐条翻译成机器指令并立即执行
计算机系统抽象层
硬件与软件的接口:指令系统

二进制数的表示
计算机的数据
数据的抽象层次转化


整数:定点运算指令
浮点数:浮点运算类型
二进制编码的十进制数:BCD运算指令
信息的二进制编码
- 计算机内部所有信息都用二进制(即:0和1)进行编码
- 机器级数据分两大类:
- 数值数据:无符号整数、带符号整数、浮点数(实数)、十进制数
- 非数值数据:逻辑数(包括位串)、西文字符和汉字
- 真值和机器数
- 机器数:用0和1编码的计算机内部的0/1序列
- 真值:机器数真正的值,即:现实中带正负号的数
- 用二进制编码的原因:
- 制造二个稳定态的物理器件容易
- 二进制编码、计数、运算规则简单
- 正好与逻辑命题对应,便于逻辑运算,并可方便地用逻辑电路实现算术运算
不同进制


八进制和十六进制与二进制的转换更加简单
我们尝试用以下方法实现进制的转化 实际上可以这样:


数值数据的编码表示
数值数据的表示方法
- 数值数据表示的三要素
- 规制:进位计数制
- 规格:定、浮点表示
- 编码:如何用二进制编码
即:要确定一个数值数据的值必须先确定这三个要素。
例如,机器数 01011001的值是多少?答案是:不知道!
- 定点数表示法
- 指定有效数字序列中的某两位之间是小数点位如1234.56
- 指定在有效数字最右边表示整数,定点整数
- 指定在有效数字最左边表示小数,定点小数
- 定点表示法的编码(定点数编码)
- 增加符号位,解决有符号数表示问题
- 浮点数表示法
- 不固定小数点位,数值采用科学计数法表示:f*re 1.23456 *103
- 浮点表示法
- r是进位计数制的基,缺省
- f和e都可以用定点表示法记录
具体应用:
整数:定点表示法,定点整数(整型类:int, long, unsigned)
实数(浮点数):定点整数 定点小数(浮点类:float, double)
- 定点数的编码
- 定点整数编码
- 原码
- 补码
- 反码
- 移码
- 定点小数编码
- 原码
- 真值与机器数
- 机器数:用0和1编码的计算机内部的0/1序列(编码)
- 真值:机器数真正的值,即:现实中带正负号的数(数值)
- 原码表示法

- 补码表示法
- 有符号位后面跟真值的模补码构成
- 定义为 X补码 = + X
从五十年代开始,整数一律采用补码,浮点数的尾码采用原码定点小数

表示范围是
变形补码
双符号位表示,左边是真正的符号位,右边判断是否溢出,又称为“模-4补码”
满足
缺陷:与真值关系不直接
补码特性——模运算







等于可以省去减法器,只需要加法器



真值与补码的转化



- 移码表示法:便于浮点数加减时候的对阶操作
- 总结


整数的编码表示
- 无符号整数
- 机器中字的位排列顺序有两种方式:(例:32位字:0..010112)
- 高到低位从左到右:0000 0000 0000 0000 0000 0000 0000 1011←此为LSB
- 高到低位从右到左:1101 0000 0000 0000 0000 0000 0000 0000←此为MSB
- Leftmost和rightmost这两个词有歧义,故用LSB(Least Significant Bit)来表示最低有效位,用MSB来表示最高有效位
- 高位到低位多采用从左往右排列
- 一般在全部是正数运算具不出现负值结果的场合下,可使用无符号数表示。例如,地址运算,编号表示,等等
- 无符号数的编码中没有符号位
- 能表示的最大值大于位数相同的带符号整数的最大值(Why?)
- 例如,8位无符号整数最大是255(1111 1111) 而8位带符号整数最大为127(0111 1111)
- 总是整数,所以很多时候就简称为“无符号数”
- 带符号整数
- 计算机必须能处理正数(positive) 和负数(negative),MSB表示数符
- 有三种定点编码方式
- Signed magnitude(原码)现用来表示浮点(实)数的尾数
- One's complement(反码)现已不用于表示数值数据
- Two' s complement(补码)50年代以来,所有计算机都用补码来表示定点整数
- 为什么用补码表示带符号整数?
- 补码运算系统是模运算系统,加、减运算统一
- 数0的表示唯一,方便使用
- 比原码和反码多表示一个最小负数
- 与移码相比,其符号位和真值的符号对应关系清楚
- C语言中的整数
- 无符号数:unsigned int(short / long);带符号整数:int(short / long)
- 常在一个数的后面加一个“u”或“U”表示无符号数
- 若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数
- 假定以下关系表达式在32位用补码表示的机器上执行,结果是什么?
不按真值转换,只是转换机器编码(理解方式)

浮点数的编码表示
- 科学计数法与浮点数

- 浮点数的表示范围

- 浮点数表示多样化

规格化数:尾数的最高数位不为0而为1
- IEEE 754 Standard
- 0的表示
- 无穷的表示
- 非数的表示
- 非规格化数
- 关于IEEE 754的问题
- What's the range of representable values? The largest number for single: How about double?
- What about following type converting:
- How about FP add associative(加法结合律)? FALSE!
- 例题
- 浮点数的舍入

例题









double可以涵盖int和float,但int与float又无法互相覆盖的部分

总结

BCD编码表示十进制
- 编码思想:每个十进数位至少需要4位二进制表示。而4位二进制位可组合成16种编码,去掉10种编码后还有6种冗余编码
- 编码方案: 1. 十进制有权码:每个十进制数字的4个二进制位(称为基2码)都有确定的权。8421码是最常用的十进制有权码。也称自然BCD(NBCD)码
- 将7转换为NBCD码:7的二进制表示是0111,所以NBCD码为0111。
- 将2转换为NBCD码:2的二进制表示是0010,所以NBCD码为0010。
- 将5转换为NBCD码:5的二进制表示是0101,所以NBCD码为0101。
- 将4转换为NBCD码:4的二进制表示是0100,所以NBCD码为0100。
- 余3码方案:由8421码加上0011形成。当两个十进制数字之和是10时,其二进制编码的值正好是16,而且0和9,1和8,⋯5和4的余3码互为反码。
- 格雷码(Gray Code) 方案:任意两个相邻的编码只有一位二进位不同。 格雷码有多种编码形式。
举例
假设我们要表示十进制数字7254。首先,我们将每个十进制数字转换为其对应的4位二进制数,然后将它们连接在一起。
最后,将它们连接在一起,得到7254的NBCD码为:0111 0010 0101 0100。
2. 十进制无权码:每个十进制数位的4个基2码没有确定的权。用的较多的是余3码和格雷码
- 3.其他编码方案(5中取2码.独热码等)
关于溢出
判断方法:
- 人工数值计算
- 人工补码计算:同符号数运算变符号则溢出
- 变形补码(模4补码)计算
- 若符号位进位与最高数值位进位不相同,则溢出
非数值数据的储存与排列
非数值数据的表示
逻辑数据
- 表示
- 用一位表示。例如,真:1/假:0
- N位二进制数可表示N个逻辑数据,或一个位串
- 运算
- 按位进行
- 如:按位与/按位或/逻辑左移丿逻辑右移 等
- 识别
- 逻辑数据和数值数据在形式上并无差别,也是一串0/1序列,机器靠指令来认定。
- 位串
- 用来表示若干个状态位或控制位(OS中使用较多)
例如,x86的标志寄存器含义如下:
西文的储存
采用的字符集,有一套完整的编码方式
中文的储存
- 特点:{字符集,编码方案,字形}
- 汉字是表意文字,一个字就是一个方块图形。
- 盜写婺優「交字离豁更精鍋主產線予产集支精盐穴部的表示、汉字的传
- 编码形式,有以下几种汉字代码:
- 输入码:对汉字用相应按键进行编码表示,用于输入
- 内码:用于在系统中进行存储、查找、传送等处理
- 字模点阵码或轮廓描述:描述汉字字模的点阵或轮廓,用于输出
问题:西文字符有没有输入码?有没有内码?有没有字模点阵或轮廓描述?A:西文没有输入码,因为字母可以放在键盘上
数据的储存排列
数据的宽度
- 比特(bit):是计算机中处理、存储、传输信息的最小单位
- 字节(byte):8个二进位,基本存储单位,也称“位组“
- 现代计算机中,存储器按字节编址
- 字节是最小可寻址单位(addressable unit)
- 如果以字节为一个排列单位,则LSB表示最低有效字节,MSB表示最高有效字节
- 字(word):基本的信息处理单元 IA-32中的“字” 有多少位?字长多少位呢? DWORD:32位 QWORD:64位
- “字”和“字长”的概念不同
- “字长”指定点运算数据通路的宽度 (数据通路指CPU内部数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。因此,”字长”等于CPU内部定点运算部件的位数、通用寄存器的宽度等。)
- “字”表示被处理信息的单位,用来度量数据类型的宽度
- 字和字长的宽度可以一样,也可不同。 例如,x86体系结构定义“字”的宽度为16位,但从386开始字长就是32位了。
数据度量单位

程序中的数据宽度:

数据的储存与排列顺序
- 80年代开始,几乎所有通用机器都用字节编址
- ISA设计时要考虑的两个问题:
- 如何根据一个地址取到一个32位的字?-字的存放问题
- 一个字能否存放在任何地址边界?-字的边界对齐问题
- 例如,若inti =-65535,存放在内存100号单元(即占100#~103#),则用“取数”指令访问 100号单元取出i时,必须清楚i的4个字节是如何存放的。
注

大小端
大端方式(Big Endian):MSB所在的地址是数的地址。e.g.IBM 360/370, Motorola 68k,
MIPS, Sparc, HP PA
小端方式(Little Endian):LSB所在的地址是数的地址。e.g. Intel 80x86, DEC VAX
有些机器两种方式都支持,可通过特定控制位来设定采用哪种方式。
由此引出字节传递的问题

总结


