文档库 最新最全的文档下载
当前位置:文档库 › 计算机组织与系统结构第三章习题答案

计算机组织与系统结构第三章习题答案

计算机组织与系统结构第三章习题答案
计算机组织与系统结构第三章习题答案

第 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得功能。

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

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

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)

{

i nt t = x;

x << = 4;

x - = t;

i f ( y < 0 ) y += 3;

y>>2;

r eturn 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输入端得每一位B i取反,得到B i,与原码B i一起送到一个二路选择器,由进位C0作为选择控制信号。当C0为1时做减法,此时,选择将B i作为SN74181得B输入端;否则,当C0为1时,做加法。

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

ZF=F15+F14+F13+F12+F11+F10+F9+F8+F7+F6+F5+F4+F3+F2+F1+F0

CF=C16

OF= C0(A15B15F15 + A15B15F15)+ C0(A15B15F15 + A15B15F15)

SF= F15

8.用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]补,[x–y]补。

(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省略)如下:

C P Y 说明

0 0 0 0 0 0 1 1 0 P0 = 0

+ 0 0 0 0 y4 = 0,+0

0 0 0 0 0 C, P 与Y同时右移一位

0 0 0 0 0 0 0 1 1 得P1

+ 1 0 1 0 y3 = 1,+X

0 1 0 1 0 C, P 与Y同时右移一位

0 0 1 0 1 0 0 0 1 得P2

+ 1 0 1 0 y2 = 1,+X

0 1 1 1 1 0 0 0 0 C, P 与Y同时右移一位

0 0 1 1 1 1 0 0 0 得P3

+ 0 0 0 0 y1 = 0,+0

0 0 1 1 1 C, P 与Y同时右移一位

0 0 0 1 1 1 1 0 0 得P4

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

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

即X × Y = –11 1100B = – 60

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

P Y y-1说明

0 0 0 0 0 0 1 1 1 0 1 0 0 设y-1 = 0,[P0]补= 0

y0 y-1 = 00,P、Y直接右移一位

0 0 0 0 0 0 0 1 1 1 0 1 0 得[P1]补

+ 1 1 0 1 1 0 y1 y0 =10,+[–X]补

1 1 0 1 1 0 P、Y同时右移一位

1 1 1 0 1 1 0 0 1 1 1 0 1 得[P2]补

+ 0 0 1 0 1 0 y2 y1 =01,+[X]补

0 0 0 1 0 1 P、Y同时右移一位

0 0 0 0 1 0 1 0 0 1 1 1 0 得[P3]补

+ 1 1 0 1 1 0 1 0 0 1 1 1 0 y3 y2 = 10,+[–X]补

1 1 1 0 0 0 P、Y同时右移一位

1 1 1 1 0 0 0 1 0 0 1 1 1 得[P4]补

+ 0 0 0 0 0 0 0 1 0 0 1 1 1 y4 y3 = 11,+0

1 1 1 1 0 0 P、Y同时右移一位

1 1 1 1 1 0 0 0 1 0 0 1 1 得[P5]补

+ 0 0 0 0 0 0 0 0 1 0 0 1 1 y5 y4 = 11,+0

1 1 1 1 1 0 P、Y同时右移一位

1 1 1 1 1 1 0 0 0 1 0 0 1 得[P6]补

因此,[X × Y]补=1111 1100 0100,即X × Y = –11 1100B= – 60

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

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

余数寄存器R 余数/商寄存器Q 说明

)

)

)

)

原。

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

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

余数寄存器R 余数/商寄存器Q 说明

0 0 0 0 0 0 1 0 1 0 开始R0 = [X]

+ 1 1 0 1 0 R1=[X] +[Y]

1 1 0 1 0 0 1 0 1 0 R1与[Y]同号,则q5 =1

1 0 1 0 0 1 0 1 0 1 2R1(R与Q同时左移,空出一位上商1)

+0 0 1 1 0 R2 = 2R1+[–Y]

1 1 0 1 0 1 0 1 0 1 R2与[Y]同号,则q4= 1,

1 0 1 0 1 0 1 0 1 1 2R2(R与Q同时左移,空出一位上商1)

+ 0 0 1 1 0 R3 = 2R2 +[-Y]

1 1 0 1 1 0 1 0 1 1 R3与[Y]同号,则q3 = 1

1 0 1 1 0 1 0 1 1 1 2R3(R与Q同时左移,空出一位上商1)

+ 0 0 1 1 0 R4 = 2R3 +[–Y]

1 1 1 0 0 1 0 1 1 1 R4与[Y]同号,则q

2 = 1

1 1 0 0 1 0 1 1 1 1 2R4 (R与Q同时左移,空出一位上商0)

+ 0 0 1 1 0 R5= 2R4 +[-Y]

1 1 1 1 1 0 1 1 1 1 R5与[Y]同号,则q1= 1,

1 1 1 1 0 1 1 1 1 1 2R5 (R与Q同时左移,空出一位上商1)

+ 0 0 1 1 0 R6= 2R5 +[–Y]

0 0 1 0 0 1 1 1 1 0 R6与[Y]异号,则q 0 = 0,Q左移,空出一位上商1

+ 0 0 0 0 0 + 1 商为负数,末位加1;余数不需要修正

0 0 1 0 0 1 1 1 1 1

所以,[X/Y]补=11111,余数为00100。

即:X/Y= – 0001B = – 1,余数为0100B = 4

将各数代入公式“除数×商+余数= 被除数”进行验证,得:(–6)×(–1) +4= 10。

10.若一次加法需要1ns,一次移位需要0、5ns。请分别计算用一位乘法、两位乘法、基于CRA得阵列乘法、

基于CSA得阵列乘法四种方式计算两个8位无符号二进制数乘积时所需得时间。

参考答案:

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

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

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

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

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

进行左规,如何进行右规?

参考答案:

(1) 对于结果为±1x 、xx……x得情况,需要进行右规。右规时,尾数右移一位,阶码加1。右规操作可以表

示为:M b←M b ×2 -1,E b←E b+1。右规时注意以下两点:

a)尾数右移时,最高位“1”被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。

b)阶码加1时,直接在末位加1。

(2) 对于结果为±0、00……01x……x得情况,需要进行左规。左规时,数值位逐次左移,阶码逐次减1,直到

将第一位“1”移到小数点左边。假定k为结果中“±”与左边第一个1之间连续0得个数,则左规操作可以表示为:M b←M b ×2k,E b←E b–k。左规时注意以下两点:

a) 尾数左移时数值部分最左k个0被移出,因此,相对来说,小数点右移了k位。因为进行尾数相加时,默认

小数点位置在第一个数值位(即:隐藏位)之后,所以小数点右移k位后被移到了第一位1后面,这个1就就是隐藏位。

b) 执行E b←E b–k时,每次都在末位减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,M x = 00 (1)、111000 ,E y1 = 1010,M y = 00(1)、000000,E y2 = 1010,M y = 11(1)、000000

E k = 1100,M K = 00 (1)、111000 ,E J1 = 1100,M J1 = 00(1)、000000,E J2 = 1100,M J2 = 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,M y 1= 000、000100

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

(2)X+Y2

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

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

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

(3)K+J1

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

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

尾数相加:M b = M K + M J1 = 001、111000+ 001、000000= 010、111000,两位符号不等,说明尾数溢出,需要进行右规,最后结果为:E=1101,M=00(1)、011100, 即(23/32) ×26

(4)K+J2

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

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

尾数相加:M b = M K + M J2 = 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、、、、0) 2 × 26

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

[x]浮= 0 01111110 10、、、0 [y]浮= 1 10000101 000001010、、、0

所以,E x = 01111110,M x = 0 (1)、1、、、0 ,E y = 10000101,M y = 1(1)、000001010、、、0

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

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

(1)0、75+ (– 65、25)

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

ΔE = –7,根据对阶规则可知需要对x进行对阶,结果为:E x = E y = 10000101,M x = 00、000000110、、、000 x得尾数M x右移7位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出得2位保留

②尾数相加:M b = M x + M y = 00、000000110、、、000+ 11、0 、、、000 (注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00、000000110、、、000+ 11、000001010、、、000 = 11、000000100 (000)

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

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

④舍入:把结果得尾数M b中最后两位附加位舍入掉,从本例来瞧,不管采用什么舍入法,结果都一样,

都就是把最后两个0去掉,得:M b = 11、000000100 0

⑤溢出判断:在上述阶码计算与调整过程中,没有发生“阶码上溢”与“阶码下溢”得问题。因此,阶

码E b = 10000101。

最后结果为E b = 10000101,M b = 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进行对阶,结果为:E x = E y = 10000110,M x = 00、000000110、、、000 x得尾数M x右移一位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出得位保留

②尾数相加:M b = M x– M y = 00、0、、、000 – 11、0、、、000 (注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00、000000110、、、000 – 11、000001010、、、000=01、00001000 (000)

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

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

④舍入:把结果得尾数M b中最后两位附加位舍入掉,从本例来瞧,不管采用什么舍入法,结果都一样,

都就是把最后两个0去掉,得:M b = 01、00001000 0

⑤溢出判断:在上述阶码计算与调整过程中,没有发生“阶码上溢”与“阶码下溢”得问题。因此,阶

码E b = 10000101。

最后结果为E b = 10000101,M b = 0(1)、00001000…0,即:+66。

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

15.假定十进制数用8421 NBCD码表示,采用十进制加法运算计算下列表达式得值,并讨论在十进制BCD码加

法运算中如何判断溢出。

(1)234+567 (2)548+729

参考答案:

(1)234+567

0010 0011 0100

+ 0101 0110 0111

0111 1001 1011

1000 0000 0001 结果为: (801)10

(2)548+729

0000 0101 0100 1000

结果为: (1277)10

在第(2)题中,如果就是采用12位数表示加数548与729,则能瞧出最后得到得答案就是1100 0111 0111,这时就就是BCD码加法溢出了。所以我们在判断得时候不能仅仅瞧BCD码最高位就是不就是丢失,而要瞧结果得最高4位就是不就是大于9,如果大于9,就可以认为就是溢出了。

16.假定十进制数用8421 NBCD码表示,十进制运算673–356可以采用673加上(–356)得模10补码实现。画出

实现上述操作得3位十进制数得BCD码减法运算线路,列出线路中所有得输入变量与输出变量。

参考答案:

[– (356) 10]补= 0110 0100 0100

0110 0111 0011

+ 0110 0100 0100

1100 1011 0111

最高位产生进位,因此,结果为正数:0011 0001 0111,故结果为:(+317)10

电路图分为两部分,一个就是求出模10补码,另一个就是计算以及判断输出结果得电路图(参见教材图3、

33)。

求模10补码得电路图(RTL级)如下:

计算电路图(RTL级)如下:

相关文档
相关文档 最新文档