1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-10 22:25:48 +08:00

更新数制与运算

This commit is contained in:
Didnelpsun
2021-05-17 23:53:04 +08:00
parent b3e39ade0a
commit 3b545eb31e
2 changed files with 338 additions and 0 deletions

View File

@@ -69,6 +69,7 @@
+ 存储体:存储数据的主体,按地址存储。
+ MARMemory Address Register存储地址寄存器。MAR位数反映存储单元个数的幂值。
+ MDRMemory Data Register存储数据寄存器。MDR位数=存储字长。
+ 现代MAR和MDR被划分进入了CPU。
+ 存储单元:每个存储单元存放一串二进制代码。
+ 存储字word存储单元中二进制代码的组合。
+ 存储字长:存储单元中二进制代码的位数。
@@ -81,3 +82,140 @@
+ X通用的操作数寄存器用于存放操作数。
+ ALU算术逻辑单元是核心单元通过内部复杂的电路实现算数运算、逻辑运算。
 |加|减|乘|除
:-:|:-:|:-:|:-:|:-:
ACC|被加数、和|被减数、差|乘积高位|被除数、余数
MQ| | |乘数、乘积低位|商
X|加数|减数|被乘数|除数
#### 控制器
+ CU控制单元分析指令给出控制信号。
+ IR指令寄存器存放当前执行的指令。
+ PC程序计数器存放下一条指令地址有自动加1功能。
完成一条指令:
1. 取指令并调用PC加1。
2. 将指令放入IR并分析指令。
3. 调用CU协同执行指令。
如何区分指令和数据:
+ 通过不同的时间段来区分指令和数据,即在取指令阶段(或取指微程序)取出的为指令,在执行指令阶段(或相应微程序)取出的即为数据。
+ 如果通过地址来源区分由PC提供存储单元地址的取出的是指令由指令地址码部分提供存储单元地址的取出的是操作数。
已知:
```cpp
int a=2,b=3,c=1,y=0;
int main(){
y=a*b+c;
}
```
根据计算发展a乘b再加上c简单的高级语言背后的转换为机器语言就变成
主存地址|操作码|地址码|注释
:-----:|:----:|:----:|:--:
0|000001|0000000101|取数a至ACC
1|000100|0000000110|乘b得ab存于ACC中
2|000011|0000000111|加c得ab+c存于ACC中
3|000010|0000001000|将ab+c存于主存单元
4|000110|0000000000|停机
主存地址|数据值|注释
:------:|:----:|:--:
5|0000000000000010|原始数据a=2
6|0000000000000011|原始数据b=3
7|0000000000000001|原始数据c=1
8|0000000000000000|原始数据y=0
1. 执行地址为0的指令取指令1到4分析指令5执行指令6到8
1. (PC)=0程序计数器指向主存地址为0的指令。
2. (PC)->MAR(MAR)=0程序计数器将当前指向的指令地址通过系统总线传输给存储地址寄存器从而存储地址寄存器的值现在置为0表示它要处理的指令的主存地址为0。
3. M(MAR)->MDR(MDR)=000001 0000000101根据存储地址寄存器存储的地址0在存储体中找到对应的指令000001 0000000101并把它放入存储数据寄存器中。
4. (MDR)->IR(IR)=000001 0000000101将存储数据寄存器存储的指令放入指令寄存器中。
5. OP(IR)->CU将指令寄存器的000001操作码传输给控制单元中控制单元根据操作码知道这是“取数”的指令。
6. AD(IR)->MAR控制单元根据取数指令明白要从存储器中取出一个数而取出的数的地址就是指令寄存器的0000000101即取出存储地址为5的数据a=2将这个地址交给存储地址寄存器负责取出。
7. M(MAR)->MDR(MDR)=0000000000000010=2存储体根据存储地址寄存器的0000000101地址找到地址为5的数据2并把2放到存储数据寄存器中。
8. (MDR)->ACC(ACC)=0000000000000010=2将存储数据寄存器的数据放入累加器中完成0这条指令。
2. 执行地址为1的指令取指令1到4分析指令5执行指令6到10
1. (PC)+=1(PC)=1程序计数器完成一条指令自动加一从而现在指向地址为1的指令。
2. (PC)->MAR(MAR)=1存储地址寄存器的值现在置为1表示它要处理的指令的主存地址为1。
3. M(MAR)->MDR(MDR)=000100 0000000110在存储体中找到地址为1的指令000100 0000000110并把它放入存储数据寄存器中。
4. (MDR)->IR(IR)=000100 0000000110将存储数据寄存器存储的指令放入指令寄存器中。
5. OP(IR)->CU将指令寄存器的000100操作码传输给控制单元中控制单元根据操作码知道这是“乘法”的指令。
6. AD(IR)->MAR控制单元根据乘法指令在第一条指令中就得到了其中一个乘数a现在要另一个乘数bb的地址就是指令寄存器的0000000110即取出存储地址为6的数据b=3将这个地址交给存储地址寄存器负责取出。
7. M(MAR)->MDR(MDR)=0000000000000011=3存储体根据存储地址寄存器的0000000110地址找到地址为6的数据3并把3放到存储数据寄存器中。
8. (MDR)->MQ(MQ)=0000000000000011=3由于需要乘法操作所以将存储数据寄存器的3放入乘商寄存器中。
9. (ACC)->X(X)=2然后把a的值从累加器中放入通用寄存器中。乘法操作中被乘数放入通用寄存器中而乘数放入乘商寄存器中
10. (MQ)*(X)->ACC(ACC)=6控制单元通知算术逻辑单元通过算术逻辑单元对ab进行相乘后放入累加器中。如果乘积太大则需要乘商寄存器辅助存储。
3. 执行地址为2的指令取指令1到4分析指令5执行指令6到9
1. (PC)+=1(PC)=2程序计数器完成一条指令自动加一从而现在指向地址为2的指令。
2. (PC)->MAR(MAR)=2存储地址寄存器的值现在置为2表示它要处理的指令的主存地址为2。
3. M(MAR)->MDR(MDR)=000011 0000000111根据存储地址寄存器存储的地址2在存储体中找到对应的指令000011 0000000111并把它放入存储数据寄存器中。
4. (MDR)->IR(IR)=000011 0000000111将存储数据寄存器存储的指令放入指令寄存器中。
5. OP(IR)->CU将指令寄存器的000011操作码传输给控制单元中控制单元根据操作码知道这是“加法”的指令。
6. AD(IR)->MAR控制单元根据取数指令从存储器中取出指令寄存器的地址为0000000111数即取出存储地址为7的数据c=1将这个地址交给存储地址寄存器负责取出。
7. M(MAR)->MDR(MDR)=0000000000000001=1存储体根据存储地址寄存器的0000000111地址找到地址为7的数据1并把1放到存储数据寄存器中。
8. (MDR)->XX=0000000000000001=1将存储数据寄存器的1放入通用寄存器中。即加法操作中累加器存放被加数通用寄存器中存放加数
9. (ACC)+(X)->ACC(ACC)=7控制单元通知算术逻辑单元将ab与c相加并存回累加器中。
4. 执行地址为3的指令取指令1到4分析指令5执行指令6到8
1. (PC)+=1(PC)=3程序计数器完成一条指令自动加一从而现在指向地址为3的指令。
2. (PC)->MAR(MAR)=3存储地址寄存器的值现在置为3表示它要处理的指令的主存地址为3。
3. M(MAR)->MDR(MDR)=000010 0000001000根据存储地址寄存器存储的地址3在存储体中找到对应的指令000010 0000001000并把它放入存储数据寄存器中。
4. (MDR)->IR(IR)=000010 0000001000将存储数据寄存器存储的指令放入指令寄存器中。
5. OP(IR)->CU将指令寄存器的000010操作码传输给控制单元中控制单元根据操作码知道这是“存数”的指令。
6. AD(IR)->MAR(MAR)=0000001000=8控制单元根据存数指令根据存储的目的地址为0000001000。
7. (ACC)->MDR(MDR)=7将运算的结果从累加器中传输为存储数据寄存器中。
8. (MDR)->地址为8的存储单元y=7控制单元根据控制总线将存储数据寄存器中的数据存储到存储地址寄存器中所指向的地址所以地址码为8的y的值就变成了7。
5. 执行地址为4的指令取指令1到4分析指令5执行指令6
1. (PC)+=1(PC)=4程序计数器完成一条指令自动加一从而现在指向地址为4的指令。
2. (PC)->MAR(MAR)=4存储地址寄存器的值现在置为4表示它要处理的指令的主存地址为4。
3. M(MAR)->MDR(MDR)=000110 0000000000根据存储地址寄存器存储的地址4在存储体中找到对应的指令000110 0000000000并把它放入存储数据寄存器中。
4. (MDR)->IR(IR)=000110 0000000000将存储数据寄存器存储的指令放入指令寄存器中。
5. OP(IR)->CU将指令寄存器的000110操作码传输给控制单元中控制单元根据操作码知道这是“停机”的指令。
6. 操作系统通过中断指令停止程序。
### 计算机层次
1. 微程序机器(微指令系统):由硬件直接执行微指令。
2. 传统机器(用机器语言的机器):执行二进制机器指令。
3. 虚拟机器(操作系统机器):向上提供“广义指令”即系统调用。
4. 虚拟机器(汇编语言机器):不能直接运行汇编语言,必须用汇编程序(汇编器)翻译成机器语言程序,所以是虚拟的。汇编语言与机器语言一一对应。
5. 虚拟机器(高级语言机器):还是必须用编译程序(编译器或解释器)翻译成汇编语言程序。
+ 编译程序将高级语言编写的源程序全部语句一次全部翻译成机器语言程序而后再执行机器语言程序只需翻译一次。如C和CPP。
+ 解释程序将源程序的一条语句翻译成对应于机器语言的语句并立即执行。紧接着再翻译下一句每次执行都要翻译。如JS和Python。
+ 对于Java既可以编译也可以解释。
## 计算机性能指标
### 存储器
+ MAR位数反映存储单元的个数最多支持多少个
+ MDR位数=存储字长=每个存储单元的大小。
+ 总容量=存储单元个数×存储字长。单位为bit。
+ 如MAR为32位MDR为8位总容量=$2^{32}*8/8=3^{32}$Byte所以为4GB。
### 中央处理器
+ CPU主频CPU内数字脉冲信号振荡的频率。单位为赫兹。
+ CPU时钟周期CPU主频时钟主频=1/CPU时钟周期。单位为纳秒或微秒。
+ CPI (Clock cycle Per Instruction执行一条指令所需的时钟周期数。
+ 执行一条指令的耗时= CPIxCPU时钟周期。
+ CPU执行时间整个程序的耗时=CPU时钟周期数/主频=(指令条数*CPI)/主频。
+ IPSInstructions Per Second每秒执行多少条指令IPS=主频/平均CPI。
+ FLOPSFloating-point Operations Per Second每秒执行多少次浮点运算。
**例题** 某CPU主频为10o00Hz某程序包含100条指令平均来看指令任CPI=3该程序在该CPU上执行需要多久
100*3/1000=0.3s。
### 系统整体
+ 数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)。
+ 吞吐量指系统在单位时间内处理请求的数量。它取决于信息能多快地输入内存CPU能多快地取指令数据能多快地从内存取出或存入以及所得结果能多快地从内存送给一台外部设备。这些步骤中的每一步都关系到主存因此系统吞吐量主要取决于主存的存取周期。
+ 响应时间指从用户向计算机发送一个请求到系统对该请求做出响应并获得它所需要的结果的等待时间。通常包括CPU时间运行一个程序所花费的时间与等待时间用于磁盘访问、存储器访问、I/O操作、操作系统开销等时间
+ 基准程序是用来测量十算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相向程序的其它计算机性能进行比较。

View File

@@ -0,0 +1,200 @@
# 数据表示与运算
## 数制与编码
### 进位计数制
+ 真值:符合人类习惯的数字。
+ 机器数:数字实际存到机器里的形式,正负号需要被“数字化”。
#### 十进制
+ 符号反映权重。
+ 符号所在位置也反映权重。
+ $K_nK_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots K_{-m}=K_n\times10^n+K_{n-1}\times10^{n-1}\cdots K_2\times10^2+K_1\times10^1+K_0\times10^0+K_{-1}\times10^{-1}+K_{-2}\times10^{-2}\cdots K_{-m}\times10^{-m}$。
#### R进制
+ 基数每个数码位所用到的不同符号的个数r进制的基数r。
+ R进制转换为十进制$K_nK_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots K_{-m}=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0+K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}=\sum_{i=-m}^nK_i\times r^i$。
+ 二进制0、1。
+ 使用二进制的原因:
1. 可使用两个稳定状态的物理器件表示。
2. 01正好对应逻辑值假、真。方便实现逻辑运算。
3. 可很方便地使用逻辑门电路实现算术运算。
+ 八进制0、1、2、3、4、5、6、7。可以用下标方式表明也可以用结束的O或开头的0表示。如$(1643)_8$、01643、1643O。
+ 十进制0、1、2、3、4、5、6、7、8、9。可以用下标方式表明也可以用结束的D表示如$(1643)_{10}$、1643D。
+ 十六进制0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。可以用下标方式表明也可以用结束的H或开头的0x表示。如$(1643)_{16}$、0x1643、1643H。
#### 二进制与八进制或十六进制转换
+ 二进制转换八进制三位一组每组转换成对应的八进制符号整数部分不全则最高位用0填充小数部分不全则最低位用0填充。
+ 二进制转换十六进制四位一组每组转换成对应的十六进制符号整数部分不全则最高位用0填充小数部分不全则最低位用0填充。
+ 八进制转换二进制:每位八进制对应的三位二进制。
+ 十六进制转换二进制:每位十六进制对应的四位二进制。
十进制|二进制|八进制|十六进制
:---:|:----:|:----:|:-----:
0|0000|0|0
1|0001|1|1
2|0010|2|2
3|0011|3|3
4|0100|4|4
5|0101|5|5
6|0110|6|6
7|0111|7|7
8|1000|10|8
9|1001|11|9
10|1010|12|A
11|1011|13|B
12|1100|14|C
13|1101|15|D
14|1110|16|E
15|1111|17|F
#### 十进制转换为R进制
+ 整数部分需要使用除基取余法,小数部分需要使用乘基取整法。
+ 对于十进制数,需要把它分为整数部分和小数部分两个部分进行处理。
+ 已知R进制转换为十进制的方法$K=K_nK_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots K_{-m}=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0+K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}$。
+ 分为整数部分和小数部分:$K=N+F$。
+ 首先把整数拿出来得到$N=K_n\times r^n+K_{n-1}\times r^{n-1}\cdots K_2\times r^2+K_1\times r^1+K_0\times r^0$。
+ 对这个数除以基数$r$,得到$X=K_n\times r^{n-1}+K_{n-1}\times r^{n-2}\cdots K_2\times r^1+K_1\times r^0$,这时候就会得到一个余数$K_0$。所以$N=rX+K_0$,这时候就能算出$K_0$这个位数了。
+ 同理再将得到的商$X$同样除以$r$,就能得到$K_1$,所以不断递归就会得到整数部分所有的$K_i$。
+ 得到的$K_i$是从低位排到高位。
+ 对于小数部分$F=K_{-1}\times r^{-1}+K_{-2}\times r^{-2}\cdots K_{-m}\times r^{-m}$。
+ 对这个数乘基数$r$,得到$K_{-1}\times r^0+K_{-2}\times r^{-1}\cdots K_{-m}\times r^{-m+1}$,取这个常数$K_{-1}$就是想要的答案。将乘积减去这个整数部分得到后面处理的数据
+ 同理再将得到的数据不断乘基数,就能得到小数部分所有的$K_i$。
+ 得到的$K_i$是从高位排到低位。
+ 将整数和小数合在一起就是最后的结果。
+ 有时候小数会出现无法彻底转换的情况,需要考虑保留多少位。
**例题** 将十进制的75.3转换为二进制并保留三位。
首先将75拿出来以基数2相除
75÷2=37……137÷2=18……118÷2=9……09÷2=4……14÷2=2……02÷2=1……01÷2=0……1这个顺序是从低位到高位的所以75转换二进制就是1001011。
然后是对小数0.3的处理:
0.3×2=0.6=0+0.60.6×2=1.2=1+0.20.2×2=0.4=0+0.4这个顺序是从高位到低位的所以0.3转换二进制就是0.01。
所以转换最后得到1001011.01。
同理也可以使用拼凑法将数字拼凑成对应的数值。这种方法对于只有整数的数值比较好用。
$2^{12}$|$2^{11}$|$2^{10}$|$2^{9}$|$2^{8}$|$2^{7}$|$2^{6}$|$2^{5}$|$2^{4}$|$2^{3}$|$2^{2}$|$2^{1}$|$2^{0}$|$2^{-1}$|$2^{-2}$|$2^{-3}$
:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:
4096|2048|1024|512|256|128|64|32|16|8|4|2|1|0.5|0.25|0.125
### BCD码
即Binary-Coded Decimal用二进制编码的十进制。
使用4bit来表示0到9这十个数而4bit能表示十六个数所以会冗余六个组合。
#### 8421码
8421码是一种有权码第1、2、3、4位分别对应8、4、2、1使用常规的二进制来表示十进制
0|1|2|3|4|5|6|7|8|9
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
0000|0001|0010|0011|0100|0101|0110|0111|1000|1001
如985用8421码表示就是1001 1000 0101。
使用8421码表示的数字进行算术运算的方式是先按照二进制的方式进行运算若最后结果不在映射表中即落在没有定义的1010到1111中就直接加上6因为有六位无效所以加上六位跳过无效的位数从而进一位多了一段补全0。每个段对应的数值合在一起就是原来的结果。
如5+8=0101+1000=1101=13不在映射表中则对1101加6即计算19得到1 0011这个值补齐得到0001 0011而按照8421码最高位的0001不再代表权值16而代表十位的1而后面是3从而组合在一起就代表了13。
#### 余三码
在8421码的基础上全部加上三
0|1|2|3|4|5|6|7|8|9
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
0011|0100|0101|0110|0111|1000|1001|1010|1011|1100
余三码因为加上了三所以每一位的权值映射关系就破坏了所以这是一种无权码不能分别对应8、4、2、1的值。
#### 2421码
与8421码一样都是一种有权码但是映射的方式不同第1、2、3、4位分别对应2、4、2、1。
0|1|2|3|4|5|6|7|8|9
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
0000|0001|0010|0011|0100|1011|1100|1101|1110|1111
### 字符与字符串
#### 英文字符表示
ASCII码数字英文符号一共128个字符使用7位就可以表示128个字符但是通常会高位补0凑足1B
+ 其中32到126是可印刷字符其他都是控制或通信字符。
+ 数字480011 0000到570011 1001后面4位就是数字的8421码。
+ 大写字母650100 0001到900101 1010前面三位是010后面五位代表1到26。
+ 小写字母970110 0001到1220111 1010前面三位是011后面五位代表1到26。
#### 中文字符表示
+ GB 2312-801980年推出汉字加符号共7445个表示的字符。中文有两个字节。
+ 区位码94个区每个区94位。
+ 国标码为了中文字符表示与英文字符表示共存防止GB编码被认为是ASCII码的0到32位的控制或通信字符所以在94区94位的基础上还要各自加上32即20H防止信息交换时冲突。
+ 汉字内码国标码只能用于信息传输而如果是存储在计算机上由于前128位已经被ASCII码占用了所以在国标码的基础上再各自加80H128从而计算机识别字符时看到0到128之间的就能辨认出是ASCII码大于128的就是GB码。因为ASCII码高位是0而GB码是两个字节且高位都是1。
+ 输入编码:如拼音、五笔等供人类输入,输入编码输入后转换为国标码再转成汉字内码存储。
+ 汉字字形码:把汉字输出成汉字的样子。
#### 字符串
+ 若一个计算机按字节编址则每个地址对应Q1B。
+ 很多语言中将'\0'即00H作为字符串结束标志。
+ 大端模式:将数据的最高有效字节存放在低地址单元中。
+ 小端模式:将数据的最高有效字节存放在高地址单元中
### 数据校验
现在计算机组成原理不考数据校验,但是只是内容移动到计算机网络里。具体可以看计算机网络。
+ 校验原理就是将更多字节映射到有限个合法状态,从而有多个冗余的非法状态,更容易判断是否非法。
+ 码字:由若干位代码组成的一个字。
+ 两个码字间的距离:将两个码字逐位进行对比,具有不同的位的个数。
+ 码距:一种编码方案可能有若干个合法码字,各合法码字间的最小距离。
+ 当码距=1时无检错能力当码距=2时有检错能力当码距≥3时若设计合理可能具有检错、纠错能力。
#### 奇偶校验码
+ 奇校验码整个校验码有效信息位和校验位中为1的个数为奇数。
+ 偶校验码整个校验码有效信息位和校验位中为1的个数为偶数。
+ 偶位数出错时无法校验。
+ 对原始数据进行异或模2加运算得到的结果即为校验位。
+ 对所有数据进行异或运算结果为0表示未出错为1代表出错。
+ 码距为2只能检错不能纠错。
#### 海明码
+ 将信息分组进行偶校验,从而得到多个校验位,从而能携带多种状态信息。
+ 设信息位为$n$,校验位为$k$,从而能表达$2^k$中状态,而信息位+校验位一共$n+k$位,只错一位的状态种数加上一种正确状态为$n+k+1$,从而$2^k\geqslant n+k+1$。
+ 令信息位为$D_i$,校验位为$P_j$,总海明码为$H_k$,其中校验位$P_j$必须放在海明码$H_k$位号位$2^{j-1}$的位置上即1、2、4、8等。
+ 如果没有发生错误则每一位进行检错都是0若出现1则说明出错。
+ 为了检测是一位错还是两位错,一般会加上一个全校验位,对整体进行偶校验。
+ 具有一位和两位的纠错检错能力,三位以上则不能纠错。
n|1|2-4|5-11|12-26|27-57|58-120
:-:|:-:|:-:|:-:|:-:|:--:|:----:
k|2|3|4|5|6|7
#### 循环冗余校验码
+ 即CRC码其思想是
1. 数据发送、接受方约定一个“除数”。
2. K个信息位+R个校验位作为“被除数”添加校验位后需保证除法的余数为0。
3. 收到数据后进行除法检查余数是否为0。
## 定点数
## 浮点数
## 算术逻辑单元