计算机系统:硬件+软件
硬件的发展:第一代:电子管;第二代:晶体管;第三代:中小规模集成电路;第四代:(超)大规模集成电路
冯诺依曼结构:
由五部分组成:输入输出设备(I/O设备),存储器,运算器,控制器
指令和数据以同等地位存于存储器,可按地址访问,用二进制表示
指令有操作码(加减乘除等指令)和地址码(需要操作的数据的地址)组成
以运算器为中心
此处存储器即后面的主存储器
存储器组成:
存储体中存储数据(0,1)
当cpu调用数据时:将地址写入MAR,MAR在存储体 找到对应数据写入MDR,CPU从MDR取走数据
写入数据:数据写入MDR,存放地址写入MAR……
MDR位数=存储字长
运算器组成:
控制器组成:
计算机工作过程:
(PC)->指将PC存储的值写入MAR
M(MAR)指存储器中MAR的地址对应的值
可见:取指令的步骤(从(pc)->MAR到OP(IR)->CU)都是相同的;不同指令的执行步骤各不相同
计算机层次结构:
如上面所说:一条二进制指令需要硬件执行多条微指令来实现(如取a至ACC进行了#1~#9九条微指令)
机器只能识别二进制指令(机器语言),汇编语言或高级语言都需要编译或解释为二进制后才能被机器识别,因此使用汇编语言以及更高级语言的机器称为虚拟机器
虚拟计算机即是由软件实现的机器
高级语言变为机器语言有两种方式:
1、编译程序(如C,C++):先将高级语言编译为汇编语言,再用汇编程序汇编成机器语言。或者高级语言直接编译为机器语言
2、解释程序(如JS,python,shell):高级语言通过解释程序解释为机器语言
计算机性能指标:
影响CPI的因素很多,一般考虑平均CPI
主频高的CPU一定比主频低的好吗?
不一定,二者平均CPI可能不同。即使二者CPI相同也不能确定,因为二者指令系统可能不同,如A支持乘法指令;B不支持,只能通过累加实现乘法
进位进数制:
任意进制转十进制:
二进制转八/十六:三位/四位一组转换
十进制转任意进制(有的小数无法用二进制精确表示):整数:除,取余,由低到高;小数:乘,取整,由高到低
十进制转二进制:拼凑法:记住二进制每一位的权重,拼凑
分数转换
真值:只有值得二进制数 机器数:真值+符号位
BCD码:用二进制编写的十进制,用四个二进制位表示十进制
8421码:四个二进制位权值依次为8421。0~9表示为0000~1001
手动做题的策略: 先算十进制,然后用8421表示
计算机计算方法: 加0110记住就行
字符与字符串在计算机中表示:
中文的表示方式:
区位码:将存储空间分为94个区,每个区94个位置(理解成94行94列)。如“啊”对应(16,01),十六进制表示为(10H,01H)H表示十六进制
国标码:为了防止汉字编码与ASCII码中的控制字符冲突,每个字符加20H
汉字机内码:为了将汉字编码与英文编码不冲突,每个字符在国标码上再加80H
输入编码:如拼音,五笔输入法
汉字字形码,用01将汉字用图像在16*16的区域内表示出来
字符串的存储:从高地址到底地址依次存放,最后用0000 0000(\0)作为结束标志
多字节数据在存储时,按照各字节的排列顺序不同,分为大端模式和小端模式
奇偶校验码:
偶校验的机器实现:将二进制信息进行异或运算,得到的即为偶校验位。检验时在进行异或运算,结果为1则出错
海明校验码:看网原
信息位n位,校验位k位。
为了区分是一位错还是两位错,需添加“全校验位”对整体进行偶校验。
若一位错,改正即可。若两位错,需要重传
循环冗余校验码:看网原
定点数(小数点的位置不变,与浮点数对应)的表示:
n位无符号数的表示范围是0~(2^n)-1
原码
小数的原码:用小数点前的第一位表示正负
补码
原码和反码的整数0有两种(+0,-0)但补码只有一种,-0会溢出。 小数0也同理
下面的两个补码没有对应的原码
负数补码转原码的一个快速方法:
从后往前0照抄,直到出现1,这个1之后的全部取反(符号位不变)
移码
将补码的符号位取反
数的真值增大,对应的移码也增大(移码全0真值最小、全1真值最大),用于比较两个数的大小
补码的作用:将减运算转变为加运算,降低硬件成本
以时钟为例:x-3=x+9,-3和9为互补关系(二者绝对值相加被除数整除)。计算机一般存储空间为8bit,一个二进制数x的补码与之就是互补关系(二者相加为1,0000,0000)。计算机会舍弃第九位的1,相当于自动进行模2^8操作。
所以-X=+[X]补
定点数的移位运算:
算术移位
反码:符号位是啥就补啥
-20x7=(-20)+(-20左移1位)+(-20左移2位)
逻辑移位
全部补0,移出全部舍弃
循环部位
左移,移出的位补到右边。右移同理
加减运算
原码:
补码:
加法直接加不管正负,减法转为加法
溢出判断:
设机器字长8位,那么只能表示-128~127。若正数+正数=负数则上溢;负数+负数=正数则下溢
符号扩展:int->long 8bit->16bit
定点数原码一位乘法:
符号位单独处理,异或处理
数值位取绝对值
浮点数的表示:(浮点数中的二进制位补码)
浮点数阶码的底通常为2(与科学计数法对应,十进制中以十为底,二进制以二为底)
阶码反应表示范围和小数点的实际位置
尾数的数值部分的位数反应浮点数的精度
阶码的数值部分相当于将尾数小数点向左/向右移动多少位
浮点数尾数的规格化—防止溢出(还是类比科学记数法):
若用原码:尾数的数值最高位不能是0;补码则不能是1
注意:深绿色的那个是符号位,不是数值位
上述问题中,应该将尾数算数左移一位(小数点右移一位),阶码减1。称为“左规”
右规:
浮点数标准:IEEE745标准
移码只能表示整数。阶码可以用移码表示
移码是补码符号位倒置,但移码的定义其实是“真值+偏置值(128D)”
而IEEE745标准中(float):偏置值=127D;阶码全1和全0两种情况为特殊情况
最后一步计算移码:可以直接二进制算,也可以换成十进制算,然后再转二进制
浮点数加减运算:
舍入:
C语言强制类型转换:
C语言中数值用补码表示
有符号数转无符号数:将符号位视作数值位
长整数转短整数:高位截断,保留低位
数据的存储和排列:
大端方式适合人类阅读
小端方式适合机器处理
运算器:
注意:MQ中,最左边的0是符号位,不参与运算
最后将ACC最左边补的0(符号位)替换成开始的异或运算的结果
因为每次计算被乘数的一位,所以叫一位运算
定点数补码一位乘法:
原码除法运算
法一:恢复余数法:
逻辑左移
法二:加减交替法(不恢复余数法):
开始直接减去除数发现结果是负的,所以第一位商应该是0,不恢复,直接左移。左移后减除数,是正的,说明余数大于除数,第二位是1。重复此过程。直到最后一步,若余数为0,则加回余数,商改为0。
原码补码运算:
边界对齐:
因为:每次访存只能读写一个字
所以:可见:边界对齐是一种空间换时间
的策略,虽然浪费了一些存
储空间,但提高了访存效率
算术逻辑单元ALU:
M=0:算术运算;M=1:逻辑运算
AB是两个四位输入
F是4位输出
异或运算天然等同于偶校验:有偶数个1,则异或结果是0
一位全加器: