计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第三章 运算方法和运算部件

第 3 章    答 案

2(4)高级语言中的运算和机器语言(即指令)中的运算是什么关系?假定某一个高级语言源程序P中有乘、除运算,但机器M中不提供乘、除运算指令,则程序P能否在机器M上运行?为什么?

3.考虑以下C语言程序代码:

int   func1(unsigned word)

{

return  (int) (( word <<24) >> 24);

}

int   func2(unsigned word)

{

return  ( (int) word <<24 ) >> 24;

}

假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写下表,并说明函数func1和func2的功能。

W

func1(w)

func2(w)

机器数

机器数

机器数

0000 007FH

127

0000 007FH

+127

0000 007FH

+127

0000 0080H

128

0000 0080H

+128

FFFF FF80H

128

0000 00FFH

255

0000 00FFH

+255

FFFF FFFFH

1

0000 0100H

256

0000 0000H

0

0000 0000H

0

函数func1的功能是把无符号数高24位清零(左移24位再逻辑右移24位),结果一定是正的有符号数;而函数func2的功能是把无符号数的高24位都变成和第25位一样,因为左移24位后进行算术右移,高24位补符号位(即第25位)。

4.填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。

模式

x

y

x×y(截断前)

x×y(截断后)

机器数

机器数

机器数

机器数

无符号数

110

6

010

2

001100

12

100

4

二进制补码

110

2

010

+2

111100

4

100

4

无符号数

001

1

111

7

000111

7

111

7

二进制补码

001

+1

111

1

111111

1

111

1

无符号数

111

7

111

7

110001

49

001

1

二进制补码

111

1

111

1

000001

+1

001

+1

5.以下是两段C语言代码,函数arith( )是直接用C语言写的,而optarith( )是对arith( )函数以某个确定的M和N编译生成的机器代码反编译生成的。根据optarith( ),可以推断函数arith( ) 中M和N的值各是多少?

#define M  

#define N  

int arith (int x, int y)

{

int  result = 0 ;

result = x*M + y/N;   

return result;

}

int optarith ( int x,  int y)

{

int  t = x;

x << = 4;

x - = t;

if ( y < 0 )  y += 3;

y>>2;

return x+y;

参考答案:

可以看出x*M和“int t = x; x << = 4; x-=t;”三句对应,这些语句实现了x乘15的功能(左移4位相当于乘以16,然后再减1),因此,M等于15;

y/N与“if ( y < 0 ) y += 3; y>>2;”两句对应,功能主要由第二句“y右移2位”实现,它实现了y除以4的功能,因此N是4。而第一句“if ( y < 0 ) y += 3;”主要用于对y=1时进行调整,若不调整,则1>>2=1而1/4=0,两者不等;调整后 1+3=2,2>>2=0,两者相等。

思考:能否把  if ( y < 0 )  y += 3; 改成 if ( y < 0 )  y += 2; ?

不能!因为y = - 4时不正确。

6.设A4~A1和B4~B1分别是四位加法器的两组输入,C0为低位来的进位。当加法器分别采用串行进位和先行进位时,写出四个进位C4 ~C1的逻辑表达式。

参考答案:

串行进位:

C1 = X1C0+Y1C0 + X1 Y1 

C2 = X2C1+Y2C1 + X2 Y2  

C3 = X3C2+Y3C2 + X3 Y3  

C4 = X4C3+Y4C3 + X4 Y4 

并行进位:

C1 = X1Y1 + (X1+Y1)C0

C2 = X2Y2 + (X2 +Y2) X1Y1 + (X2+Y2) (X1+Y1)C0

C3 = X3Y3 + (X3 + Y3) X2Y2 + (X3 + Y3) (X2 + Y2) X1Y1 + (X3 + Y3) (X2 + Y2)(X1 + Y1)C0

C4=X4Y4+(X4+Y4)X3Y3+(X4+Y4)(X3+Y3)X2Y2+(X4+Y4)(X3+Y3)(X2+Y2)X1Y1+(X4+Y4)(X3+Y3) (X2+Y2)(X1+Y1)C0

7.用SN74181和SN74182器件设计一个16位先行进位补码加/减运算器画出运算器的逻辑框图,并给出零标志、进位标志、溢出标志、符号标志的生成电路

参考答案(图略):

逻辑框图参见教材中的图3.15和图3.16,将两个图结合起来即可,也即只要将图3.15中的B输入端的每一位Bi取反,得到Bi,和原码Bi一起送到一个二路选择器,由进位C0作为选择控制信号。当C0为1时做减法,此时,选择将Bi作为SN74181的B输入端;否则,当C0为1时,做加法。

零标志ZF、进位标志CF、溢出标志OF、符号标志SF的逻辑电路根据以下逻辑表达式画出即可。

  1. SN74181和SN74182器件设计一个32位的ALU,要求采用级先行进位结构
  1. 写出所的SN74181和SN74182芯片数
  2. 画出32位ALU的逻辑结构图

参考答案(图略):

    将如图3.15所示的两个16位ALU级联起来即可,级联时,低16位ALU的高位进位C16作为高16位ALU的低位进位C0,因此,只要用8片SN74181和2片SN74182。

9.已知x = 10,y =  6,采用6位机器数表示。请按如下要求计算,并把结果还原成真值。

  1. 求[x+y],[xy]
  2. 用原码位乘法计算[x×y]
  3. MBA(基4布斯)乘法计算[x×y]
  4. 不恢复余数法计算[x/y]的商和余数。
  5. 不恢复余数法计算[x/y]的商和余数。

参考答案:

[10]= 001010    [6]= 111010   [6]= 000110    [10]= 001010     [6]= 100110

(1) [10+( 6)]= [10]+[ 6]= 001010+111010 = 000100 (+4)    

[10(6)]= [10]+[ (6)]= 001010+000110 = 010000 (+16)      

(2) 先采用无符号数乘法计算001010× 000110乘积原码一位乘法过程(前面两个0省略)如下:

            若两个6位数相乘的话,则还要右移两次,得 000000 111100

符号位为:0 Å 1 = 1,因此[X×Y] = 1000 0011 1100

X × Y = 11 1100B =  60

(3) [10] = 110110,布斯乘法过程如下

(4) 因为除法计算是2n位数除n位数,所以[6]=0110,[10]=0000 1010,[6]=1010,

商的符号位:0 Å 1 = 1运算过程(前面两个0省略)如下:

    

(5) 将10和6分别表示成补码形式为:[10] 补 = 0 1010 ,  [6] 补 = 1 1010,计算过程如下:

先对被除数进行符号扩展,[10] 补=00000 01010,[6] 补 = 0 0110

10.若一次加法需要1ns,一次移位需要0.5ns。请分别计算一位乘法、两位乘法、基于CRA的阵列乘法、基于CSA的阵列乘法四种方式计算两个8位无符号二进制数乘积时所需的时间。

参考答案:

一位乘法:8次右移,8次加法,共计12ns;

二位乘法:4次右移,4次加法,共计6ns;

基于CRA的阵列乘法:每一级部分积不仅依赖于上一级部分积,还依赖于上一级最终的进位,而每一级进位又是串行进行的,所以最长的路径总共经过了8+2×(81)=22次全加器,共计约22ns;

基于CSA的阵列乘法:本级进位和本级和同时传送到下一级,同级部分积之间不相互依赖,只进行O(N)次加法运算,因此,共计约8ns。

11.IEEE 754浮点运算中,当结果尾数出现什么形式时需要进行左规,什么形式时需要进行右规?如何进行左规,如何进行右规?

    参考答案:

(1) 对于结果为±1x .xx……x的情况,需要进行右规。右规时,尾数右移一位,阶码加1。右规操作可以表示:M b¬M b ×2 -1,Eb¬Eb+1。右规时注意以下两点:

  1. 尾数右移时,最高位“1”被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。
  2. 阶码加1时,直接在末位加1。

(2) 对于结果为±0.00……01x……x的情况,需要进行左规。左规时,数值位逐次左移,阶码逐次减1,直到将第一位“1”移到小数点左边。假定k为结果中“±”和左边第一个1之间连续0的个数,则左规操作可以表示:M b¬M b ×2k,Eb¬Ebk左规时注意以下两点:

a) 尾数左移时数值部分最左k个0被移出,因此,相对来说,小数点右移了k位。因为进行尾数相加时,默认小数点位置在第一个数值位(即:隐藏位)之后,所以小数点右移k位后被移到了第一位1后面,这个1就是隐藏位。

b) 执行Eb¬Ebk时,每次都在末位减1,一共减k次。

12.IEEE 754浮点运算中,如何判断浮点运算的结果是否溢出?

参考答案:

浮点运算结果是否溢出,并不以尾数溢出来判断,而主要看阶码是否溢出。尾数溢出时,可通过右规操作进行纠正。阶码上溢时,说明结果的数值太大,无法表示;阶码下溢时,说明结果数值太小,可以把结果近似为0。

在进行对阶、规格化、舍入和浮点数的乘/除运算等过程中,都需要对阶码进行加、运算,可能会发生阶码上溢或阶码下溢,因此,必须对阶码进行溢出判断。

(有关对阶码进行溢出判断的方法可参见教材中相关章节。)

13.假设浮点数格式为:阶码是4移码偏置常数为8,尾数是6位补码采用双符号位),用浮点运算规则分别计算在不采用任何附加位和采用2位附加位(保护位、舍入位)两种情况下的值。(假定对阶和右规时采用就近舍入到偶数方式)

(1)(15/16) ×27 +(2/16) ×25  (2)(15/16) ×27(2/16) ×25 

(3)(15/16) ×25 +(2/16) ×27  4(15/16) ×25(2/16) ×27

参考答案(假定采用隐藏位) 

X= (15/16) ×27 = 0.111100B ×27= (1.111000)2 × 26 

      Y1= (2/16) ×25 = 0.001000B ×25= (1.000000)2 × 22

      Y2= (2/16) ×25 = 0.001000B ×25= (1.000000)2 × 22

      K= (15/16) ×25 = 0.111100B ×25= (1.111000)2 × 24

J1= (2/16) ×27 = 0.001000B ×27= (1.000000)2 × 24

J2= (2/16) ×27 = 0.001000B ×27= (1.000000)2 × 24

根据题目所给的各种位数,可以得到在机器中表示为:

      [X]= 00  1110  (1)111000    [Y1]= 00  1010  (1)000000  [Y2]= 11  1010  (1)000000

      [K]= 00  1100  (1)111000    [J1]= 00  1100  (1)000000  [J2]= 11  1100  (1)000000

 所以,E x = 1110,Mx = 00 (1). 111000 E y1 = 1010,My = 00(1).000000,E y2 = 1010,My = 11(1).000000

Ek = 1100,MK = 00 (1). 111000 E J1 = 1100,MJ1 = 00(1).000000,E J2 = 1100,MJ2 = 11(1).000000

 尾数M中小数点前面有三位,前两位为数符,表示双符号,第三位加了括号,是隐藏位“1”。

没有附加位时的计算:

      1. X+Y1

[ΔE]= [E x] + [–[E y1]]补  (mod 2n) = 1110 + 0110 = 0100

ΔE = 4,根据对阶规则可知需要对y1进行对阶,结果为:E y1 = E x = 1110,My 1= 000.000100

尾数相加:Mb = Mx + My1 = 001. 111000+ 000.000100 = 001.111100,两位符号相等,数值部分最高位为1,不需要进行规格化,所以最后结果为:E=1110,M=00(1).111100, 即(31/32) ×27

      1. X+Y2

[ΔE]= [E x] + [–[E y2]]补  (mod 2n) = 1110 + 0110 = 0100;

ΔE = 4,根据对阶规则可知需要对y2进行对阶,结果为:E y2 = E x = 1110,My2= 111.111100

尾数相加:Mb = Mx + My2 = 001. 111000+ 111.111100=001.110100,两位符号相等,数值部分最高为1,不需要进行规格化,所以最后结果为:E=1110,M=00(1).110100, 即(29/32) ×27

      1. K+J1

[ΔE]= [E K] + [–[E J1]]补  (mod 2n) = 1100 + 0100 = 0000;

ΔE = 0,根据对阶规则可知不需要进行对阶。

尾数相加:Mb = MK + MJ1 = 001. 111000+ 001.000000= 010.111000,两位符号不等,说明尾数溢出,需要进行右规,最后结果为:E=1101,M=00(1).011100, 即(23/32) ×26

      1. K+J2

[ΔE]= [E K] + [–[E J2]]补  (mod 2n) = 1100 + 0100 = 0000;

ΔE = 0,根据对阶规则可知不需要进行对阶。

尾数相加:Mb = MK + MJ2 = 00 1. 111000+ 111.000000 = 000.111000,两位符号相等,数值部分最高位为0,需要进行左规,所以最后结果为:E=1011,M=00(1).110000, 即(7/8) ×24

如果有两位附加位精度上会有提高,在对阶的时候要注意小数点后就不是6位,而是8位,最后两位为保护位和舍入位。但是由于本题6位尾数已经足够,再加2位附加位,其结果是一样的。

14.采用IEEE 754单精度浮点数格式计算下列表达式的值。

(1)0.75+( 65.25) (2)0.75( 65.25)

参考答案

x = 0.75 = 0.110...0B = (1.10...0)2 × 2-1 

      y =  65.25 =  1000001.01000...0B = (1.00000101...0) 2 × 26

      用IEEE 754标准单精度格式表示为:

      [x]= 0  01111110  10...0    [y]= 1  10000101  000001010...0

 所以,E x = 01111110,Mx = 0 (1). 1...0 E y = 10000101,My = 1(1).000001010...0

 尾数MxMy中小数点前面有两位,第一位为数符,第二位加了括号,是隐藏位“1”。

以下是计算机中进行浮点数加减运算的过程(假定保留2位附加位:保护位和舍入位)

(1)0.75+ ( 65.25)

 对阶: [ΔE]= [E x] + [–[E y]]补  (mod 2n) = 0111 1110 + 0111 1011 = 1111 1001

ΔE = 7,根据对阶规则可知需要对x进行对阶,结果为:Ex = E y = 10000101,Mx = 00.000000110...000

x的尾数Mx右移7位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的2位保留

 尾数相加:Mb = Mx + My = 00.000000110...000+ 11.000001010 ...000 (注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00.000000110...000+ 11.000001010...000 = 11.000000100…000

上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。

 规格化:根据所得尾数的形式,数值部分最高位为1,所以不需要进行规格化。

        舍入:把结果的尾数Mb中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果都一样,都是把最后两个0去掉,得:Mb = 11.000000100…0

        溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因此,阶码Eb = 10000101。

最后结果为Eb = 10000101,Mb = 1(1).00000010…0,即: 64.5。

(2) 0.75( 65.25)

 对阶: [ΔE]= [E x] + [–[E y]]补  (mod 2n) = 0111 1110 + 0111 1011 = 1111 1001

ΔE = -7,根据对阶规则可知需要对x进行对阶,结果为:Ex = E y = 10000110,Mx = 00.000000110...000

x的尾数Mx右移一位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的位保留

 尾数相加:Mb = Mx  My = 00.000000110...000  11.000001010...000 (注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00.000000110...000 – 11.000001010...000=01.00001000…000

上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。

 规格化:根据所得尾数的形式,数值部分最高位为1,不需要进行规格化。

        舍入:把结果的尾数Mb中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果都一样,都是把最后两个0去掉,得:Mb = 01.00001000…0

        溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因此,阶码Eb = 10000101。

最后结果为Eb = 10000101,Mb = 0(1).00001000…0,即:+66。

   

   思考题:对阶时发生什么情况,就可以不再继续进行计算?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值