计算机组成原理 2、运算方法与运算器
数的机器码表示
原码表示法
0或1 | 二进制的绝对值 |
---|---|
纯小数原码表示定义
- 零的原码有正零和负零两种形式:
纯整数原码表示定义
补码表示法
纯小数补码表示定义
- 例如
若x1=+0.1011 x2=-0.1011, 字长为8b,则其原码分别为:
[x1]补=0.1011000
[x2]补=2 - 0.1011000 =1.0101000
即最后一个1不变,前面全部相反。
补码的零只有一个,即0.0000000。
补码1.0000000表示负1
纯整数补码表示定义
也是和小数一样,最后一个1不变,前面全部相反。
反码表示法
对于正数来说,反码=原码=补码
对于负数来说,
符号位:与原码、补码的符号位定义相同。
数值:将原码的数值位按位变反。
- 例如
若x1=+0.1011 x2=-0.1011, 字长为8b。
[x1]反=0.1011000= [x1]原= [x1]补
[x2]原=1.1011000
[x2]反=1.0100111
- 反码的零有两个0.0000和1.11111
移码表示法
若纯整数X为n位(包括符号位),则其移码定义为:
- 方法:补码将符号位求反可得移码
设字长为8b,若x1=+1000(2), x2=-1000(2),
[x1]补=00001000 [x1]移=10001000
[x2]补=11111000 [x2]移=01111000
数的定点表示法
小数:符号位之后就是小数点
整数:小数点固定在数的最低位之后
正零:$(0.0000000)_原$
负零:$(1.0000000)_原$
数的浮点表示法
第一种浮点格式
阶符+阶码值 | 数符+尾数值 |
---|---|
补码定点整数形式 | 补码定点小数表示形式 |
比如00001001,1.01111111110000000000000
第二种浮点格式
数符 | 阶符+阶码值 | 尾数值 |
---|---|---|
移码定点整数形式 |
比如1,1,0001001,01111111110000000000000
定点加、减运算
定点补码加、减法与溢出
加法公式:
$[x]_补+[y]_补=[x+y]_补$
减法公式:
$[x]_补-[y]_补=[x]_补+[-y]_补=[x+(-y)]_补$
溢出判断法
定点小数,数的表示范围为|x|<1。
在运算过程中如出现大于1的现象,称为“溢出”。
定点整数,取决于位长,比如8b,数的表示范围为-128~127,超出这个范围则称为“溢出”。
在定点机中,正常情况下溢出是不允许的。
为了判断“溢出”是否发生,可采用两种检测的方法。
双符号位法、进位判断法
- 双符号法(变形补码法)
用两个相同的符号位$S_{f1} S_{f2}$表示一个数的符号。
左边第一位为第一符号位$S_{f1}$,相邻的为第二符号位$S_{f2}$。
00表示正号;
11表示负号;
01表示产生正向溢出;
10表示产生负向溢出。
可以这样表示:
V=$S_{f1} \oplus S_{f2}$ ,此逻辑表达式可用异或门实现。
$(a \oplus b = (\neg a \wedge b) \vee (a \wedge \neg b))$
若V=0,则无溢出;V=1,则有溢出。
- 进位判断法
设C为最高数值位向符号位的进位值产生的进位, S为符号位产生的进位。当两补码进行加减运算(减法转化为加法进行)时,
如果两个进位值CS相同,则没有溢出发生
如果两个进位值不同,则有溢出发生。
若C=1, S=0时,则发生正溢
若C=0, S=1时,则发生负溢
即V=$S \oplus C$
定点乘法运算
原码一位乘法
被乘数和乘数均取绝对值参加运算,符号位单独考虑。
被乘数取双符号,部分积的长度与被乘数的长度相同,部分积的初值为0。
从乘数的最低位的yn位开始对乘数进行判断,
若$y_n=1$,则部分积加上被乘数|x|,然后右移一位;
若$y_n=0$,则部分积加上0,然后右移一位。
- 重复(3)判断n次。
补码一位乘法
符号位参与运算,运算的数均以补码表示。
被乘数一般取双符号位参加运算,部分积初值为0。
乘数可取单符号位,以决定最后一步是否需要校正,即是否要加[-x]补。
乘数末位增设附加位$y_{n+1}$,且初值为0。
按表进行操作。
按照上述算法进行n+1步操作,但第n+1步不再移位,仅根据$y_0与y_1$的比较结果作相应的运算即可。
- 补码移位规则:部分积为正,右移时有效位最高位补0;为负时最高位补1。
$y_n(高位)$ | $y_{n+1}(低位)$ | 操 作 |
---|---|---|
0 | 0 | 部分积右移一位 |
0 | 1 | 部分积加 $x_补$,右移一位 |
1 | 0 | 部分积加$[-x]_补$,右移一位 |
1 | 1 | 部分积右移一位 |
原码两位乘法
符号位不参加运算,最后的符号$P_f= x_f \oplus y_f$。
部分积与被乘数均采用三位符号,乘数末位增加一位C,其初值为0。
按表操作。
若乘数末尾数n为偶数,则乘数用双符号,最后一步不移位。
若乘数末尾数n为奇数,则乘数用单符号,最后一步移一位。
$y_{n-1}$ | $y_n$ | C | 操作 |
---|---|---|---|
0 | 0 | 0 | 加0,右移两位,0$\rightarrow$C |
0 | 0 | 1 | 加x,右移两位,0$\rightarrow$C |
0 | 1 | 0 | 加x,右移两位,0$\rightarrow$C |
0 | 1 | 1 | 加2x,右移两位,0$\rightarrow$C |
1 | 0 | 0 | 加2x,右移两位,0$\rightarrow$C |
1 | 0 | 1 | 减x,右移两位,1$\rightarrow$C |
1 | 1 | 0 | 减x,右移两位,1$\rightarrow$C |
1 | 1 | 1 | 加0,右移两位,1$\rightarrow$C |
补码两位乘法
- 符号位参加运算,两数均用补码表示。
- 部分积与被乘数均采用三位符号表示,乘数末位增加一位$y_{n+1}$,其初值为0。
- 按表操作。
若乘数末尾数n为偶数,则乘数用双符号,最后一步不移位。
若乘数末尾数n为奇数,则乘数用单符号,最后一步移一位。
$y_{n-1}$ | $y_n$ | $y_{n+1}$ | 操作 |
---|---|---|---|
0 | 0 | 0 | 加0,右移两位 |
0 | 0 | 1 | 加$[x ]_补$,右移两位 |
0 | 1 | 0 | 加$[x ]_补$,右移两位 |
0 | 1 | 1 | 加$2[x ]_补$,右移两位 |
1 | 0 | 0 | 加$2[ -x ]_补$,右移两位 |
1 | 0 | 1 | 加$[ -x ]_补$,右移两位 |
1 | 1 | 0 | 加$[ -x ]_补$,右移两位 |
1 | 1 | 1 | 加0,右移两位 |
定点除法运算
原码一位除法
符号单求。
(x为被除数,y为除数)
符号位不参加运算,并要求:|x|<|y|.
先用被除数减去除数:
当余数为正时,商上1,余数左移一位,再减去除数。
当余数为负时,商上0,余数左移一位,再加上除数。
- 当第n+1步余数为负时,需加上|y|得到第n+1步正确的余数。最后余数为$r_n×2^{-n}$(余数与被除数同号)。
补码一位除法
符号位参加运算,除数与被除数均用双符号补码表示。
被除数与除数同号时,被除数减去除数。被除数与除数异号时,被除数加上除数。商符号位的取值见第3步。
余数与除数同号时,商上1,余数左移一位减去除数;余数与除数异号时,商上0,余数左移一位加上除数。
- 注意:余数左移加上或减去除数后就得到了新余数。
- 采用校正法包括符号位在内,应重复规则第三步(n+1)次。
商的校正原则:
当刚好能除尽 (即运算过程其中任一步余数为0) 时,如果除数为正,则商不必校正;若除数为负,则商需要校正,即加$2^{-n}$进行修正。
当不能除尽时,如果商为正,则不必校正;若商为负,则商需要加$2^{-n}$进行修正。
余数的处理:
若商为正,则当余数与被除数异号时,应将余数加上除数进行修正才能获得正确的余数。
若商为负,则当余数与被除数异号时,余数需要减去除数进行校正。
定点运算器的组成与结构
多功能算术逻辑运算单元
半加器:
$x_i$ | $y_i$ | $S_i$ | $C_i$ |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
$S_i=x_i \oplus y_i$
$C_i=x_i * y_i$
全加器:
输入:$x_i$、$y_i$、$C_{I-1}$(上一位的进位)
输出:$S_i$、$C_i$(进位)
$S_i=x_i \oplus y_i \oplus C_{i-1}$
$C_i=x_iy_i+(x_i \oplus y_i)C_{i-1}$
并行加法器及其进位链
- 串行进位的并行加法器
通常把$x_i \oplus y_i$称为进位传递函数或进位传递条件,以$P_i$表示。将$x_iy_i$称为进位产生函数或本地进位,以$G_i$表示。所以,进位表达式又常表示为
$C_i=x_iy_i+(x_i \oplus y_i)C_{i-1}=G_i+P_iC_{i-1}$
并行进位的并行加法器
所以
$C_1=G_1+P_1C_0$
$C_2=G_2+P_1C_1$
$C_3=G_3+P_1C_2$
$C_4=G_4+P_1C_3$
上式可以改写成如下形式:
一重进位方式的ALU
组内并行,组间串行
顾名思义
组内并行、组间并行
二重进位方式的ALU
三重进位方式的ALU
浮点运算方法和浮点运算器
浮点算术运算
加减法
0操作数的检查;
比较阶码大小并完成对阶;
尾数进行加或减运算;
结果规格化并进行舍入处理。(0舍1入或末位恒置1)
乘法
设$x=2^mM_x$,$y=2^nM_y$,则$xy=2^{m+n}(M_xM_y)$