计算机组成原理学习之路(⼆)——运算⽅法
参考资料:《计算机组成原理》(秦磊华版)
⽬录
计算机的主要功能就是对数据信息进⾏加⼯处理,这种处理可以归结为算术运算和逻辑运算,前者包括加、减、乘、除四则运算,并与数据的编码形式和表达形式(浮点、定点)密切相关;后者是⼀种⽆进位的按位运算,相对⽐较简单。
1 定点补码加减法运算
数据在计算机中是以⼀定的编码⽅式表⽰的,常⽤的编码有原码、反码、补码和移码。同⼀种算术运算,使⽤不同的编码,有不同的运算法则。采⽤补码数据表⽰,不仅符号位同数值位⼀起参加运算,⽽且还可以把减法变成加法实现,因此基于补码数据表⽰的定点补码加减法运算具有运算规则简单,易于实现等优点。
1.1 补码加减法运算⽅法
1. 补码加法:
在以 M 为模时,两个数的补码之和等于两个数之和的补码,即两个⽤补码表⽰的数相加,所得结果为补码表⽰的和,对定点⼩数和定点整数都适⽤:对定点⼩数⽽⾔,M = 2;对定点整数⽽⾔,M = 2,其中 n 为定点整数位数(不含符号位)。
2. 补码减法:
对定点⼩数和定点整数都适⽤:对定点⼩数⽽⾔,M = 2;对定点整数⽽⾔,M = 2,其中 n 为定点整数位数(不含符号位)。由补码减法公式可知,在实施补码减法之前需从 [y] 求出 [-y],可采⽤多种⽅法实现该操作,最简单的⽅法是:对 [y] 各位(包括符号位)取反、末位加1,就可以得到 [-y],也可采⽤同样的⽅法从 [-y] 求出 [y]。
1.2 溢出及检测
运算结果超出数据类型所能表⽰数据范围的现象称为溢出。运算结果应该为正,但绝对值超过表⽰范围,导致结果为负,称为正溢,例如两个数相加,运算结果是负数;运算结果为负,但绝对值超过表⽰范围,导致结果为正,称为负溢,例如两个负数相加,结果是正数。另外,应该特别注意按模丢掉与运算溢出的区别。
由于机器字长是确定的,所以能表⽰的数据范围也是有限的,溢出现象不可避免。⽽溢出往往可能导致
有效数字丢失或直接导致错误的运算结果,因此对于计算机系统设计者⽽⾔,必须解决溢出的判断问题,以便溢出发⽣时计算机应能做出相应的处理。
有多种⽅法可以检测出溢出,下⾯将主要介绍常见的 3 种⽅法:
[x ]+补[y ]=补[x +y ] (modM )
补n+1[x ]−补[y ]=补[x ]+补[−y ]=补[x −y ] (modM )
补n+1补补补补补补
1. 根据操作数和运算结果的符号位是否⼀致进⾏检测:只有两个符号相同的数相加时才有可能产⽣溢出,因此,可根据操作数和运算结
果的符号位是否⼀致进⾏检测。
2. 根据运算过程中最⾼数据位的进位与符号位的进位位是否⼀致进⾏检测:当运算过程中最⾼数据位的进位与符号位进位位不同步产⽣
时就表明运算结果发⽣了溢出。
3. 利⽤变形补码进⾏检测:所谓变形补码,就是⽤两个⼆进制符号位来表⽰数据的符号位,其余与补码相同。对定点⼩数⽽⾔,采⽤变
形补码后,其模为 4,因此也称为 “模 4 补码”;对整数⽽⾔,采⽤变形补码后,其模为2(n 为整数数值位的位数)。
采⽤变形补码后,正数符号以 “00” 表⽰,负数的符号以 “11” 表⽰。⼀般称左边的符号位为第⼀符号位,右边的符号位为第⼆符号位。若运算结果的符号位为 “01” 或 “10”,则表明分别产⽣了上溢和下溢,即运算结果的两个符号位相同时,表⽰没有溢出,相异时,则表⽰溢出。
需注意的是,不论运输结果是否溢出,第⼀符号位总是与真实结果的符号位⼀致。
2 定点乘法运算
从计算机硬件⾓度看,实现乘法运算的⽅法主要有以下两种:
1. 以加法器为基础,并配置相应的逻辑功能器件,通过循环累加实现。
2. 采⽤阵列硬件直接实现。
2.1 机器数的移位操作(以补码为例)
移位操作是乘法实现过程中的基本操作,常⽤的移位操作包括逻辑移位与算术移位两种,每种移位操作⼜可分为左移和右移。
移位类
移位前的数据移位后的数据特点逻辑左移
1110111011011100左边⼀位移出,右边空出位补 0逻辑右移
1110111001110111右边⼀位移出,左边空出位补 0算术左移1110111011011100各位依次左移,右边空出位补0,⼀次移位相当于乘以2,当符号位改变时表明溢出
算术右移1110111011110111负数二进制补码运算法则
符号位保持不变,其余各位依次右移,最右边⼀位移出,将符号位复制到左边空出的位,⼀次移位相当于除以
22.2 原码⼀位乘法器
为此,对⼿算⽅法做如下修改,以⽅便机器实现:
1. 设初始部分积为 0,每得到⼀个部分积就与前⾯的部分积做⼀次加法运算,即以累加代替所有部分积同时相加,不仅减少了保存部分积
所需的寄存器数⽬,还能避免⼀次性部分积求和带来的不便。
2. ⽤部分积右移代替⼿算中的位积左移,不仅使部分积的相加运算可固定在同⼀位置上进⾏,⽽且不再需要长度为 2n 位的加法器。乘法开始前,令部分积的初值 P  = 0,然后对乘数末位 y (假设 )进⾏判断以获得位积,并将位积与 P  相加。然后将 P  和 y 同步右移⼀位,得到新的部分积 P ,部分积中右移出的位按序移⼊到 y 中。重复这个过程 n 次,最后单独处理乘积的符号位。随着 y 的右移,y
位总是表⽰乘数将要被判断的那⼀位。从上图可知:两个 n 位数参加乘法运算要做 n 次加法和移位操作。
⽤循环累加与移位操作实现乘法运算。
2.3 补码⼀位乘法器
n+20n ∣y ∣=0.y y y …y 123n y ×n x 001n
由于计算机中采⽤补码数据表⽰,如果⽤原码乘法计算两个数的乘积,运算前后要实现补码和原码之间的转换,为减少处理环节,⼊们提出了补码乘法。
补码⼀位乘法的运算规则:
1. 被乘数⼀般取双符号位参加运算;
2. 乘数末位增设附加位 y ,且初始值为 0;
3. 利⽤ y  与 y  的差别判断各步的具体运算:
y  - y 操作0
部分积右移1
部分积加 [x] 后右移⼀位-1部分积加 [-x] 后右移⼀位
4. 按照上述算法进⾏ n+1 步累加操作,n 步右移操作。
3 定点除法运算
除法运算与乘法运算的处理思想相似,通常是将 n 位数的除操作转换成若⼲次 “加减及移位” 的循环操作来实现。
3.1 原码⼀位除法
为便于在计算机上执⾏除法运算,对⼿⼯除法算法进⾏如下改进:
1. 通过减法运算⽐较数的⼤⼩,并作为上商的依据,若余数减去除数⼤于或等于 0 则表⽰够减,若⼩于零则表⽰不够减。
2. 将每次右移除数改为左移余数,并与上商操作统⼀起来,使得上商能固定在⼀个位置上进⾏。值得注意的是,每左移⼀次余数,相当
于将余数乘以2,在求得 n 位商后,余数 r 也就被左移了 n 次,因此最后正确的余数应为 r  × 2。
3.1.1 原码恢复余数法
在原码恢复余数法中,⽐较被除数(余数)与除数的⼤⼩是⽤减法实现的。对原码除法⽽⾔,由于操作数以绝对值的形式参与运算,因此,相减结果为正(余数的符号位为 0)说明够减,商上 1;相减结果为负(余数的符号位为 1)说明不够减,商上 0。
由于除法通过减法实现,当商上 1 时,可将⽐较数据⼤⼩时的减法操作与除法操作中的减法操作合并,即商上 1 后继续后⾯的除法操作。商上 0 时表明不够减,但因⽐较操作时已经实施了⼀次减法,因此,需要对执⾏⽐较操作后的结果加上除数,即将余数还原成⽐较操作前的数值,这种⽅法就称为恢复余数法。
可以看出上述运算过程是⼀个循环过程:⽐较 -> 上商(商为 0 时还需要恢复余数)-> 左移 -> 再⽐较,直到商达到规定的位数为⽌。⼀般商的位数与除数的位数相同。
需注意的是,由于可能需要恢复余数,⽽除法中恢复余数的步数不能在运算前被确定,导致原码恢复余数除法控制复杂。
3.1.2 原码不恢复余数法
不恢复余数法⼜称加减交替法,是对恢复余数法的改进。不恢复余数法的特点是不够减时不再恢复余数,⽽根据余数的符号做相应处理就可继续往下运算,因此运算步数固定,控制简单,提⾼了运算速度。不恢复余数法的运算规则是:当余数为正时,商上 1,余数左移⼀位,减去除数。
当余数为负时,商上 0,余数左移⼀位,加上除数。
3.2 基于不恢复余数的补码⼀位除法
n+1n+1n n+1n
补补n -n
对补码除法⽽⾔,也要通过⽐较被除数(余数)与除数的⼤⼩来上商,但由于符号位参与运算,因此判断是否够减不能采⽤原码除法中的⽅法,需要通过判断余数和除数的符号来确定。
补码不恢复余数法的算法规则如下:
1. 被除数与除数同号,被除数减去除数;被除数与除数异号,被除数加上除数。
2. 余数与除数同号,商上 1,余数左移⼀位减去除数;余数与除数异号,商上 0,余数左移⼀位加上除数。需注意的是,余数左移加上
或减去除数后就得到了新余数。
3. 重复上⼀步,若采⽤ “恒置1” 法,则包括符号位内共重复第 2 步 n 次;若采⽤校正法,包括符号在内,则应重复第 2 步 n + 1 次
(n 为有效数值位的位数)。
1. “恒置1” 法:补码不恢复余数法除法运算是在商的末位 “恒置1” 的条件下所取得的有限位商。当商为负时是反码形式,⽽
所需要的商是补码形式,两者之间相差的就是末位的 1,这样引起的最⼤误差是 2。在对商的精度没有特殊要求的情况下,⼀
般就采⽤商的末位 “恒置1” 法,这样操作简单,易于实现。
2. 校正法:如果要求进⼀步提⾼商的精度,则按上述步骤再多求⼀位商,然后⽤校正的办法对商进⾏处理。在商为负且不能除尽
(即余数 r  ≠ 0)的情况下,求出⼀个全字长的商以后,可在末位加上 1 进⾏校正。即按上述算法求得商的反码形式后,再加
上 2,以得到商的补码形式。
商的校正可根据下⾯原则进⾏:
1. 当刚好能除尽时,如果除数为正,则商不必修正;如果除数为负,则商需要校正,即加 2。
2. 当不能除尽时,如果商为正,则不必修正;如果商为负,则商需要加 2 进⾏修正。
4. 求得 n 位商后,得到的余数往往是不正确的,正确的余数常需要根据具体情况做适当的处理才能获得,处理⽅法⼀般如下:
1. 若商为正,当余数与被除数符号相同,则不需处理;当余数与被除数异号时,则应将余数加上除数进⾏修正才能获得正确的余
数。
2. 若商为负,当余数与被除数同号时,则余数不需处理;当余数与被除数异号时,则余数需要减去除数进⾏校正。
余数之所以需校正,是因为补码不恢复余数除法运算过程中先⽐较后上商的缘故,可见,如果要保存余数必须根据具体情况对余数做相应处理,否则余数不⼀定正确。
4 浮点运算
4.1 浮点数加减运算
4.1.1使⽤补码表⽰阶码和尾数的浮点数的加减运算
设有两个浮点数:
对 x 与 y 两个数做加减法运算,则有:
运算步骤如下:
-n i -n -n -n x =2×m M ,  y =x 2×n M y
x ±y =2×m (M ±x 2×n −m M )  (当 m ⩾y n  时)
或x ±y =2×n (2×m −n M ±x M )  (当 m ⩽y n  时)
1. 对阶:对阶的原则是⼩的阶码向⼤的阶码看齐,这是因为⼩阶码增⼤数值时,尾数部分右移舍去的是尾数的低位部分,但如果让⼤阶
码向⼩的阶码看齐,则尾数部分相应左移,将会丟失尾数的⾼位部分,导致运算结果的精确度⼤⼤降低。
对阶⼜包括如下两个步骤:
1. 求阶差:通过对两个阶码进⾏减法运算实现,这不仅能知道阶码的⼤⼩,还能求出两个阶码的具体差值。
2. 阶码的调整与尾数的移位,可按下⾯⽅式进⾏:
1. 若 m > n,则将浮点数 y 的尾数右移 m - n 位。
2. 若 m < n,则将浮点数 x 的尾数右移 n - m 位。
2. 尾数运算:对阶完成后可按照定点数的加减运算法则执⾏尾数加减操作,注意,对于阶码⼩的那个浮点数,应该使⽤对阶后的尾数参
加运算。
3. 结果规格化:结果规格化就是使运算结果成为规格化数,为了运算处理⽅便,可让尾数的符号位扩展为两位,当尾数运算结果不是
11.0XX…X 或 00.1XX…X 的形式时,则应进⾏相应的规格化处理:
1. 当尾数双符号位为 01 或 10 时,需要向右规格化,且只需将尾数右移⼀位,同时将结果的阶码值加 1。
2. 当尾数运算结果为 11.1XX…X 或 00.0XX…X 时需要左移规格化,⽽且左移次数不固定,与运算结果的形式有关。左规的⽅
法是尾数连同符号位⼀起左移位,结果的阶码减 1,直到尾数部分出现 11.0 或 00.1 的形式为⽌。
4. 舍⼊:在对阶右移和右移规格化操作时,尾数末尾的⼏位会超出机器字长⽽被丢掉,从⽽产⽣误差。这时,计算机可以按选定的⽅式
进⾏舍⼊操作,常⽤的舍⼊⽅法如下:
1. 末位恒置 1 法:只要因移位⽽丢失的位中有⼀位是1,就把运算结果的最低位置 1,⽽不管最低位原来是 0 还是 1。
2. 0 舍 1 ⼊法:当丢失位数的最⾼位是 1 时将尾数的末尾加 1。
5. 溢出判断:由于浮点数中阶码的位数决定数的表⽰范围,因此对于浮点运算⽽⾔,当阶码出现溢出时才表⽰运算结果溢出,即当阶码
的符号位为 01 和 10 时表⽰运算结果溢出。
4.2 浮点数乘法运算
设有两个浮点数:
则浮点数的乘法可表⽰为:
运算步骤如下:
1. 阶码相加:两个数的阶码相加可在加法器中完成。阶码和尾数两个部分并⾏操作时,可另设⼀个加法器专门实现对阶码的求和;串⾏
操作时,可利⽤同⼀加法器分时完成阶码求和、尾数求积的运算,并且先完成阶码求和运算。阶码相加后有可能产⽣溢出,若发⽣溢出,相应部件将给出溢出信号,指⽰计算机做溢出处理。
2. 尾数相乘:两个运算数的尾数部分相乘就可得到积的尾数。
3. 结果规格化:当运算结果需要规格化时,就进⾏规格化操作。规格化及舍⼊⽅法与浮点减法处理的⽅法相同。
对 IEEE 754 浮点数⽽⾔,阶码的运算仍然采⽤移码的运算法则,尾数处理过程中隐藏位要参与运算,并采⽤ IEEE 754 的规格化和溢出检测与处理⽅法。需要特别注意的是IEEE754浮点乘法运算中不存在左移规格化操作。x =2×m M ,  y =x 2×n M y
x ×y =2×m +n (M ⋅x M )
y

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。