计算机组成原理归纳
1. 概述
2. 数的表示与计算
3. 存储器
4. 指令系统
5. 处理器
6. 总线
7. IO系统
多字节数据在内存中一定占连续的字节
大端模式:高字节低地址
小端模式:低地址低字节
一个多字节数据,必须存放在连续的地址单元
边界对齐:访问一个字/半字只需一次访存
边界不对齐:访问一个字/半字可能需要两次访存
n+1位定点整数 1 1 ⋯ 11 ⏟ n . ∼ 0 11 ⋯ 1 ⏟ n . 1\underbrace{1\cdots11}_{n}.\sim 0\underbrace{11\cdots1}_n. 1n 1⋯11.∼0n 11⋯1. :范围 − 2 n − 1 ∼ 2 n − 1 -2^n-1\sim2^n-1 −2n−1∼2n−1
n+1位定点小数 1. 11 ⋯ 11 ⏟ n ∼ 0. 11 ⋯ 11 ⏟ n 1.\underbrace{11\cdots 11}_{n}\sim 0.\underbrace{11\cdots 11}_n 1.n 11⋯11∼0.n 11⋯11 范围 − 1 + 2 − n ∼ 1 − 2 − n -1+2^{-n}\sim 1-2^{-n} −1+2−n∼1−2−n
真值0不唯一:+0,-0
表示数值的范围和原码相同
n + 1 n+1 n+1 位二进制数可表示
补码特点(机内码)
原码变为补码:从右到左,找到第一个1,其左边取反,其右边不变
原码:
01110100
补码:
10001100
原码:01110100补码:10001100
n位2进制编码
编码方式 | 最小值编码 | 最小值 | 最大值编码 | 最大值 | 数值范围 |
---|---|---|---|---|---|
无符号定点整数 | 00...00 ⏟ n . \underbrace{00...00}_n. n 00...00. | 0 | 11...11 ⏟ n . \underbrace{11...11}_n. n 11...11. | 2 n + 1 − 1 2^{n+1}-1 2n+1−1 | 0 ≤ x ≤ 2 n + 1 − 1 0\le x\le 2^{n+1}-1 0≤x≤2n+1−1 |
无符号定点小数 | . 00...00 ⏟ n .\underbrace{00...00}_n .n 00...00 | 0 | 0. 11...11 ⏟ n 0.\underbrace{11...11}_n 0.n 11...11 | 1 − 2 − n 1-2^{-n} 1−2−n | 0 ≤ x ≤ 1 − 2 − n 0\le x\le 1-2^{-n} 0≤x≤1−2−n |
原码定点整数 | 1 , 1...11 ⏟ n − 1 . 1,\underbrace{1...11}_{n-1}. 1,n−1 1...11. | − 2 n + 1 -2^n+1 −2n+1 | 0 , 1 ⋯ 11 ⏟ n − 1 . 0,\underbrace{1\cdots11}_{n-1}. 0,n−1 1⋯11. | 2 n − 1 2^n-1 2n−1 | − 2 n + 1 ≤ x ≤ 2 n − 1 -2^n+1\le x \le 2^n-1 −2n+1≤x≤2n−1 |
原码定点小数 | 1. 1...11 ⏟ n − 1 1.\underbrace{1...11}_{n-1} 1.n−1 1...11 | − 1 + 2 − n -1+2^{-n} −1+2−n | 0. 1...11 ⏟ n − 1 0.\underbrace{1...11}_{n-1} 0.n−1 1...11 | 1 − 2 − n 1-2^{-n} 1−2−n | − 1 − 2 − n ≤ x ≤ 1 − 2 − n -1-2^{-n}\le x \le 1-2^{-n} −1−2−n≤x≤1−2−n |
补码定点整数 | 1 , 0...00 ⏟ n − 1 . 1,\underbrace{0...00}_{n-1}. 1,n−1 0...00. | − 2 n -2^n −2n | 0 , 1...11 ⏟ n − 1 . 0,\underbrace{1...11}_{n-1}. 0,n−1 1...11. | 2 n − 1 2^n-1 2n−1 | − 2 n ≤ x ≤ 2 n − 1 -2^n\le x \le 2^n-1 −2n≤x≤2n−1 |
补码定点小数 | 1. 0...00 ⏟ n − 1 1.\underbrace{0...00}_{n-1} 1.n−1 0...00 | − 1 -1 −1 | 0. 1...11 ⏟ n − 1 0.\underbrace{1...11}_{n-1} 0.n−1 1...11 | 1 − 2 − n 1-2^{-n} 1−2−n | − 1 ≤ x ≤ 1 − 2 − n -1\le x \le 1-2^{-n} −1≤x≤1−2−n |
真值加一个常数
[
x
]
移
=
2
n
+
x
(
−
2
n
≤
x
≤
2
n
,机器字长为
n
+
1
)
x
1
=
+
10101
,
x
2
=
−
10101
,字长
8
位,则其移码表示为:
[
x
1
]
移
=
2
7
+
10101
=
1
,
0010101
,
[
x
2
]
移
=
2
7
+
(
−
10101
)
=
0
,
1101011
[x]移=2n+x(−2n≤x≤2n,机器字长为n+1)x1=+10101,x2=−10101,字长8位,则其移码表示为:[x1]移=27+10101=1,0010101,[x2]移=27+(−10101)=0,1101011
n位二进制能表示 2 n 2^n 2n 个数字
用于表示内存地址信息
表示范围 0 ∼ 2 n − 1 0\sim 2^n-1 0∼2n−1
若寄存器位数小于无符号定点整数,舍去高位 发生上溢出
无符号数,空位填0
有符号数
丢弃位会存在 CF
中
适用情况:高低字节数据互换
符号位相同:绝对值相加,符号位不变
符号位不同:符号等于绝对值大者
机内实现两种策略
符号位和尾数一起运算
补码运算结果为补码
补码加减运算:
[ A + B ] 补 = [ A ] 补 + [ B ] 补 ( m o d M ) [ A − B ] 补 = [ A ] 补 + [ − B ] 补 ( m o d M ) [A+B]_补=[A]_补+[B]_补(mod\quad M)\\ [A-B]_补=[A]_补+[-B]_补(mod\quad M) [A+B]补=[A]补+[B]补(modM)[A−B]补=[A]补+[−B]补(modM)
只有 “正数+正数” 才可能 上溢 —— 正+正=负
只有 “负数+负数” 才可能 下溢 —— 负+负=正
采用一位符号位 (模2补码)
设 A 的符号位为 A s A_s As ,B的符号位为 B s B_s Bs ,运算结果符号位为 S s S_s Ss ,则溢出表达式为 V = A s B s S s ‾ ⏟ 001 + A s ‾ B s ‾ S s ⏟ 110 V=\underbrace{A_sB_s\overline{S_s}}_{001}+\underbrace{\overline{A_s}\overline{B_s}S_s}_{110} V=001 AsBsSs+110 AsBsSs
如:
[
A
+
B
]
补
=
0
,
0001111
+
0
,
1111100
=
1
,
0001011
真值
−
117
V
=
0
,溢出
[
B
−
C
]
补
=
1
,
1101000
+
1
,
0000100
=
0
,
1101100
真值
+
108
,
V
=
1
,溢出
[A+B]补=0,0001111+0,1111100=1,0001011真值−117V=0,溢出[B−C]补=1,1101000+1,0000100=0,1101100真值+108,V=1,溢出
根据进位情况判断
符号位进位 C S C_S CS | 最高数值位进位 C 1 C_1 C1 | |
---|---|---|
上溢 | 0 | 1 |
下溢 | 1 | 0 |
即:
C
s
C_s
Cs 与
C
1
C_1
C1 不同时有溢出
溢出判断表达式为 V = C s ⊕ C 1 V=C_s\oplus C_1 V=Cs⊕C1
双符号位 (模4补码)
正数符号00,负数符号11
[
A
+
C
]
补
=
00
,
0001111
+
00
,
1111100
=
0
⏟
本来符号位
1
⏟
实际符号位
,
0001011
上溢
[
B
−
C
]
补
=
11
,
1101000
+
11
,
0000100
=
10
,
1101100
下溢
[A+C]补=00,0001111+00,1111100=0⏟本来符号位1⏟实际符号位,0001011上溢[B−C]补=11,1101000+11,0000100=10,1101100下溢
记两个符号位为
S
s
1
S
s
2
S_{s1}S_{s2}
Ss1Ss2 ,则
V
=
S
s
1
⊕
S
s
2
V=S_{s_1}\oplus S_{s_2}
V=Ss1⊕Ss2
上溢:超出表示范围的上边界
下溢:低于表示范围的下边界
注意:
结果的符号位通过 异或 确定
数值部分通过被乘数和乘数绝对值的n轮 加法、移位 完成
根据当前乘数中参与运算的位确定 (ACC) 加什么
每轮加法后,ACC,MQ的内容统一 **逻辑右移 **
设机器字长5位(1位符号位,4位数值位), x = ( 13 ) 10 = + 1101 , y = ( − 11 ) 10 = − 1011 x=(13)_{10}=+1101,y=(-11)_{10}=-1011 x=(13)10=+1101,y=(−11)10=−1011 ,采用原码一位乘法求 x × y x\times y x×y
符号位 P s = x s ⊕ y s = 0 ⊕ 1 = 1 P_s = x_s\oplus y_s=0\oplus 1=1 Ps=xs⊕ys=0⊕1=1
∣ x ∣ = 1101 , ∣ y ∣ = 1011 \mid x\mid = 1101,\mid y\mid = 1011 ∣x∣=1101,∣y∣=1011 ,原码一位乘法的求解过程如下
最后结果为 P s + ( A C C ) + ( M Q ) = 1.1000 1111 = − 0.1000 1111 P_s+(ACC)+(MQ)=1.1000\quad1111=-0.1000\quad1111 Ps+(ACC)+(MQ)=1.10001111=−0.10001111
还不懂的话去看:参考博客
增加一位辅助位,补充到最低位,初始值为 0 0 0
n轮加法,加法规则
补码的算数右移,符号位不动,数值位右移
符号位是什么就补什么
设机器字长5位(1位符号位,4位数值位), x = ( − 13 ) 10 = − 0.1101 , y = ( 11 ) 10 = + 0.1011 x=(-13)_{10}=-0.1101,y=(11)_{10}=+0.1011 x=(−13)10=−0.1101,y=(11)10=+0.1011 ,采用补码一位乘法求 x × y x\times y x×y
[ x ] 补 = 11.0011 , [ − x ] 补 = 00.1101 [x]_补=11.0011,[-x]_{补}=00.1101 [x]补=11.0011,[−x]补=00.1101
计算过程
结果: [ x ⋅ y ] 补 = 11.0111 0001 [x·y]_{补}=11.0111\quad 0001 [x⋅y]补=11.01110001,即 x ⋅ y = − 0.1000 1111 x·y=-0.1000\quad 1111 x⋅y=−0.10001111
还不懂的话去看:参考博客
符号位 Q s = x s ⊕ y s Q_s = x_s\oplus y_s Qs=xs⊕ys
恢复余数法:当余数为负时,上商0,并 + 除数 +除数 +除数 ,再左移,再 − 除数 -除数 −除数
加减交替法:当余数为负时,上商0,并左移,再 + 除数 +除数 +除数
被除数与除数同号,被除数减去除数;
被除数与除数异号,被除数加上除数
余数和除数同号,商为1,余数左移一位,下次减除数;
余数和除数异号,商为0,余数左移一位,下次加除数。
重复步骤2,包括符号在内,工作n+1步
已知 x=0.1011,y=0.1101,用补码加减交替法求 x y \frac{x}{y} yx
[ x ] 补 = 00.1011 , [ y ] = 00.1101 , [ − y ] 补 = 11.0011 , n = 4 [x]_补=00.1011,[y]=00.1101,[-y]_补=11.0011,n=4 [x]补=00.1011,[y]=00.1101,[−y]补=11.0011,n=4
商
[
Q
]
补
=
0.1101
[Q]_补=0.1101
[Q]补=0.1101,余数
[
R
]
补
=
0.0111
[R]_补=0.0111
[R]补=0.0111
位值不变,改变解释方式
将多余高位字长部分截断,低位赋值
数值相等,高位进行符号位填充
定点整数:在原符号位和数值位中间添加新位
正数加0
负数:原码加0;反,补码加1
定点小数:在原数值位后面添加新位
正数都加0
负数:原、补码加0,反码加1
浮点数数值:
N
=
r
E
×
M
N=r^E\times M
N=rE×M
阶码反映浮点数表示范围及小数点位置
阶码是用补码或移码表示的定点整数
阶码的表示算数左移位数
尾数反映精度
尾数是用原码或补码表示的定点小数
尾数越少,可表示的精度越低
7位阶码,1位数符,8位尾数。若阶码用移码,尾数用补码表示,则浮点数所能表示数的范围
阶码最大 2 7 − 1 = 63 2^7-1=63 27−1=63
尾数范围 − 1 ∼ 1 − 2 − 8 -1\sim 1-2^{-8} −1∼1−2−8
− 2 63 ∼ ( 1 − 2 − 8 ) × 2 63 -2^{63}\sim (1-2^{-8})\times2^{63} −263∼(1−2−8)×263
没有隐含1,尾数最小值为-1
有隐含1,尾数最小值 − ( 2 − 2 n ) -(2-2^n) −(2−2n)
规格化浮点数:规定位数的最高数值位必须是一个有效值
左规:当浮点数运算的结果为非规格化时要进行规格化处理,将 尾数算数左移一位,阶码减一
右规:当浮点数运算的结果位数出现溢出(双符号位为01或10)时,将 尾数算数右移一位,阶码加一
正数 0.1 X X X . . X X 0.1XXX..XX 0.1XXX..XX 的形式。其最大值表示为 0. 11..1 ⏟ n 0.\underbrace{11..1}_{n} 0.n 11..1 ,最小值表示为 0.10..0 0.10..0 0.10..0 。尾数的表示范围为 1 2 ≤ M ≤ ( 1 − 2 − n ) \frac{1}{2}\le M\le (1-2^{-n}) 21≤M≤(1−2−n)
负数为 1.1 X X X . . X X 1.1XXX..XX 1.1XXX..XX 的形式。 其最大值表示为 1. 10..0 ⏟ n 1.\underbrace{10..0}_n 1.n 10..0 ,最小值表示为 1. 11..1 ⏟ n 1.\underbrace{11..1}_n 1.n 11..1 。尾数的表示范围为 − ( 1 − 2 − n ) ≤ M ≤ − 1 2 -(1-2^{-n})\le M\le-\frac{1}{2} −(1−2−n)≤M≤−21
正数 0.1 X X . . X 0.1XX..X 0.1XX..X 的形式。其最大值表示为 0. 11...1 ⏟ n 0.\underbrace{11...1}_n 0.n 11...1 ,最小值表示为 0.10..0 0.10..0 0.10..0。尾数的表示范围为 1 2 ≤ M ≤ ( 1 − 2 − n ) \frac{1}{2}\le M\le (1-2^{-n}) 21≤M≤(1−2−n) 。
负数 1.0 X X . . X 1.0XX..X 1.0XX..X 的形式。其最大值表示为 1. 01...1 ⏟ n 1.\underbrace{01...1}_n 1.n 01...1 ,最小值表示为 1.00..0 1.00..0 1.00..0 。尾数的表示范围为 − 1 ≤ M ≤ − ( 1 2 + 2 − n ) -1\le M\le -(\frac{1}{2}+2^{-n}) −1≤M≤−(21+2−n)
阶码和尾数均用补码 表示,阶码部分共 K + 1 K+1 K+1 为(含1位阶符),尾数部分共 n + 1 n+1 n+1 位(含1位数符),则这样的浮点数的表示范围是多少
浮点数 | 阶码 | 尾数 | 真值 |
---|---|---|---|
(规格化)最大正数 | 0 , 1 ⋯ 1 ⏟ K 0,\underbrace{1\cdots 1}_K 0,K 1⋯1 | 0. 11 ⋯ 11 ⏟ n 0.\underbrace{11\cdots 11}_n 0.n 11⋯11 | ( 1 − 2 − n ) × 2 2 k − 1 (1-2^{-n})\times 2^{2^k-1} (1−2−n)×22k−1 |
最小正数 | 1 , 0 ⋯ 0 ⏟ K 1,\underbrace{0\cdots 0}_K 1,K 0⋯0 | 0. 00 ⋯ 01 ⏟ n 0.\underbrace{00\cdots 01}_n 0.n 00⋯01 | 2 − n × 2 2 − k 2^{-n} \times 2^{2^{-k}} 2−n×22−k |
规格化最小正数 | 1 , 0 ⋯ 0 ⏟ K 1,\underbrace{0\cdots 0}_K 1,K 0⋯0 | 0 , 10 ⋯ 0 ⏟ n 0,\underbrace{10\cdots 0}_n 0,n 10⋯0 | 2 − 1 × 2 − 2 k 2^{-1}\times 2^{-2^{k}} 2−1×2−2k |
(规格化)最小负数 | 0 , 1 ⋯ 1 ⏟ k 0,\underbrace{1\cdots 1}_k 0,k 1⋯1 | 1. 00 ⋯ 00 ⏟ n 1.\underbrace{00\cdots 00}_n 1.n 00⋯00 | ( − 1 ) × 2 2 k − 1 (-1)\times 2^{2^k-1} (−1)×22k−1 |
最大负数 | 1 , 0 ⋯ 0 ⏟ K 1,\underbrace{0\cdots 0}_K 1,K 0⋯0 | 1. 11 ⋯ 11 ⏟ n 1.\underbrace{11\cdots 11}_n 1.n 11⋯11 | − 2 − n × 2 − 2 k -2^{-n}\times 2^{-2^k} −2−n×2−2k |
规格化最大负数 | 1 , 0 ⋯ 0 ⏟ K 1,\underbrace{0\cdots 0}_K 1,K 0⋯0 | 1. 01 ⋯ 11 ⏟ n 1.\underbrace{01\cdots 11}_n 1.n 01⋯11 | − ( 2 − n + 2 − 1 ) × 2 − 2 k -(2^{-n}+2^{-1})\times 2^{-2^k} −(2−n+2−1)×2−2k |
引入目的:增加数据的表示精度
规格化的单精度浮点数: ( − 1 ) s × 1. M × 2 E − 127 (-1)^s\times 1.M\times 2^{E-127} (−1)s×1.M×2E−127
类型 | 数符s位数 | 阶码E位数 | 尾数M位数 | 总位数 | 阶码偏移值 ( 2 阶码位数 − 1 ) (2^{阶码位数-1}) (2阶码位数−1) |
---|---|---|---|---|---|
单精度浮点数(float) | 1 | 8 ( − 126 ∼ 127 ) (-126\sim 127) (−126∼127) | 23 | 32 | 127 |
双精度浮点数(double) | 1 | 11 | 52 | 64 | 1023 |
E − 127 = E 的二进制表示 + 10000001 E-127=E的二进制表示+1000 0001 E−127=E的二进制表示+10000001
阶码真值=阶码无符号整数值-阶码偏移值
阶码 | 无符号整数 | 阶码真值(IEEE偏移值 − ( 2 n − 1 − 1 ) -(2^{n-1}-1) −(2n−1−1)) |
---|---|---|
0000 0001 | 1 | -126 |
0000 0010 | 2 | -125 |
… | … | … |
0111 1111 | 127 | 0 |
1000 0000 | 128 | 1 |
… | … | … |
1111 1110 | 254 | 127 |
阶码全0和全1代表特殊含义
格式 | 规格化的最小绝对值 | 规格化的最大绝对值 |
---|---|---|
单精度 | E=1;M=0; 1.0 × 2 1 − 127 = 1.0 × 2 − 126 1.0\times 2^{1-127}=1.0\times 2^{-126} 1.0×21−127=1.0×2−126 | E=254;M=.11…1; 1.11...1 × 2 254 − 127 = ( 2 − 2 − 23 ) × 2 127 1.11...1\times 2^{254-127}=(2-2^{-23})\times 2^{127} 1.11...1×2254−127=(2−2−23)×2127 |
双精度 | E=1;M=0; 1.0 × 2 1 − 1023 = 1.0 × 2 − 1022 1.0\times 2^{1-1023}=1.0\times 2^{-1022} 1.0×21−1023=1.0×2−1022 | E=2046;M=.11…1; 1.11...1 × 2 2046 − 1023 = ( 2 − 2 1023 ) × 2 1023 1.11...1\times 2^{2046-1023}=(2-2^{1023})\times 2^{1023} 1.11...1×22046−1023=(2−21023)×21023 |
阶码E全为0,尾数M不全为0——非规格化小数
阶码E全为0,尾数M全为0——真值0
阶码E全为1,尾数M全为0——无穷大
阶码E全为1,位数M不全为0——非数值
int
类型转浮点数类型,若整数位数>24位,会有舍入误差若
i
是一个int
型整数,f
和d
分别为float
型(32位) 和double
(64位) 实数。判断各布尔表达式的布尔值
i==(int)((double)i)
true
: int 32位有效数字,double为52+1=53位有效数字,所以强制转化为 double 类型后在转回去不会 发生精度损失
f == (float)((int)f)
false
: float 型有小数部分,转为int后可能没有小数部分
float转为int有32位有效数字,再转回float后,可能丢失有效数字
f == (float)((double)f)
true
: double比float精度高,float转为double不会丢失精度
d == (double)((float)f)
false
: float尾数有效位数小于double,所以 (float)f
会丢失精度,再转回 double后,不相等
作用:求本位和、进位
作用:完成两个n位二进制数的加法
C
i
=
A
i
B
i
+
(
A
i
⊕
B
i
)
C
i
−
1
C
i
−
1
=
A
i
−
1
B
i
−
1
+
(
A
i
−
1
⊕
B
i
−
1
)
C
i
−
2
Ci=AiBi+(Ai⊕Bi)Ci−1Ci−1=Ai−1Bi−1+(Ai−1⊕Bi−1)Ci−2
根据进位计算公式,发现当前公式中进位是上一公式计算得出的,而上一公式中的进位是由其上一位公式计算的出的。最终可以展开到 C 0 C_0 C0 ,这样 C i C_i Ci 就不需要等待 C i − 1 C_{i-1} Ci−1 计算完成后再进行计算。
将n个并行全加器串接起来,就可进行两个n位数相加
串行进位又称行波进位,每一级的进位直接依赖于前一级的进位,即进位信号是逐级形成的
并行进位的并行加法器(先行进位,同时进位):各级进位信号同时生成
G
i
=
A
i
B
i
P
i
=
A
i
⊕
B
i
C
i
=
A
i
B
i
+
(
A
i
⊕
B
i
)
C
i
−
1
=
G
i
+
P
i
C
i
−
1
C
1
=
G
1
+
P
1
C
0
C
2
=
G
2
+
P
2
C
1
=
G
2
+
P
2
(
G
1
+
P
1
C
0
)
C
3
=
G
3
+
P
3
C
2
=
G
3
+
P
3
(
G
2
+
P
2
(
G
1
+
P
1
C
0
)
)
…
Gi=AiBiPi=Ai⊕BiCi=AiBi+(Ai⊕Bi)Ci−1=Gi+PiCi−1C1=G1+P1C0C2=G2+P2C1=G2+P2(G1+P1C0)C3=G3+P3C2=G3+P3(G2+P2(G1+P1C0))…
组内并行、组件串行
由于并行加法器在计算进位时,越高位用到的逻辑门元件越多,而 C 1 ∼ C 4 C_1\sim C_4 C1∼C4 的产生速度很快, 所以将一个4位CLA作为一个组,组内进位可同时得出,产生一个组进位
C
1
=
G
1
+
P
1
C
0
C
2
=
G
2
+
P
2
C
1
=
G
2
+
P
2
(
G
1
+
P
1
C
0
)
C
3
=
G
3
+
P
3
C
2
=
G
3
+
P
3
(
G
2
+
P
2
(
G
1
+
P
1
C
0
)
)
C
4
=
G
4
+
P
4
C
3
=
G
4
+
P
4
(
G
3
+
P
3
(
G
2
+
P
2
(
G
1
+
P
1
C
0
)
)
)
C1=G1+P1C0C2=G2+P2C1=G2+P2(G1+P1C0)C3=G3+P3C2=G3+P3(G2+P2(G1+P1C0))C4=G4+P4C3=G4+P4(G3+P3(G2+P2(G1+P1C0)))
只有得到前一组的进位信号,本组才可以计算
组内并行,组件并行
多个组的进位信号同时产生