计算机组成习题答案(清华大学出版社) 下载本文

19.写出16位数据的SEC码。假定数据为0101 0001 0100 0110,说明SEC码如何正确检测数据位5的

错误。 参考答案:

对于16位数据,可以如下插入校验位: M16M15M14M13M12P5M11M10M9M8M7M6M5P4M4M3M2P3M1P2P1

其中Mi是原信息数据, Pi是加入的校验位,对于各个校验位的值可以如下计算

P1 = M1⊕M2⊕M3⊕M4⊕M5⊕M7⊕M9⊕M11⊕M12⊕M14⊕M16= 1 P2 = M1⊕M3⊕M4⊕M6⊕M7⊕M10⊕M11⊕M13⊕M14= 1 P3 = M2⊕M3⊕M4⊕M8⊕M9⊕M10⊕M11⊕M15⊕M16= 0 P4 = M5⊕M6⊕M7⊕M8⊕M9⊕M10⊕M11= 0 P5 = M12⊕M13⊕M14⊕M15⊕M16= 0 所以此时P5 P4 P3 P2 P1 = 00011,第五位数据出错时,数据字变为:0101 0001 0101 0110,P5?P4?P3?P2?P1?= 01010,故障字 = 00011⊕01010 = 01001,说明码字第9位出错,即M5出错。

20.假设要传送的数据信息为:100011,若约定的生成多项式为:G(x)= x3+1,则校验码为多少?假定在

接收端接收到的数据信息为100010,说明如何正确检测其错误,写出检测过程。 参考答案:

原数据信息为100011,对应的报文多项式为M(x) = x5 + x + 1, 生成多项式的位数为4位,所以在原数据信息后面添加3个0,变为M?(x) = x3M(x) = x8 + x4 + x3, 用M(x)去模2除G(x),得到的余数为111,所以得到CRC码为100011 111。 检测时,用接收到的CRC码去模2除生成多项式1001,若得到的余数为0,则表明正确,否则说明

传输时发生了错误。此题中接收到的CRC码为100010 111(即数据100010加检验位111),显然,用100010 111 模2除 1001,得到余数为001,不为0,说明传输时发生错误。

第 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 0000 0080H 0000 00FFH 0000 0100H 127 128 255 256 0000 007FH 0000 0080H 0000 00FFH 0000 0000H +127 +128 +255 0 0000 007FH FFFF FF80H FFFF FFFFH 0000 0000H +127 –128 –1 0 函数func1的功能是把无符号数高24位清零(左移24位再逻辑右移24位),结果一定是正的有符号数;而函数func2的功能是把无符号数的高24位都变成和第25位一样,因为左移24位后进行算术右移,高24位补符号位(即第25位)。

4.填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。 模式 无符号数 二进制补码 无符号数 二进制补码 无符号数 二进制补码 x 机器数 110 110 001 001 111 111 值 6 –2 1 +1 7 –1 机器数 010 010 111 111 111 111 y 值 2 +2 7 –1 7 –1 x×y(截断前) 机器数 001100 111100 000111 111111 110001 000001 值 12 –4 7 –1 49 +1 x×y(截断后) 机器数 100 100 111 111 001 001 值 4 –4 7 –1 1 +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的逻辑电路根据以下逻辑表达式画出即可。 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 0000 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 00 1 1 得P1

+ 1 0 1 0 y3=1,+X

01 0 1 0 C,P 和Y同时右移一位 0 0 1 0 1 0 00 1得P2 + 1 0 1 0y2= 1,+X

0 1 1 1 1 0 00 0 C,P 和Y同时右移一位 0 01 1 11 0 00得P3

+ 0 0 0 0y1= 0,+0

0 0 1 1 1 C,P 和Y同时右移一位 0 0 0 1 111 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 0000 1 110 1 00 设y-1 =0,[P0]补=0

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

0 0 0000 0 1 11 0 1 0 得[P1]补 + 1 1 0 110y1 y0 =10,+[–X]补 1 1 0 110 P、Y同时右移一位

1 1 1 011 00 1 1 1 0 1 得[P2]补 + 0 0 1 010y2 y1 =01,+[X]补

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

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

+1101 1 0 1 0 0 1 1 1 0y3 y2 =10,+[–X]补 11 1 0 0 0P、Y同时右移一位 111 1 0 0 0 1 0 01 1 1得[P4]补

+ 0 0 0 00 00 1 0 0 1 11y4 y3 =11,+0 111 1 0 0P、Y同时右移一位 111 1 1 0 0 0 1 00 1 1得[P5]补

+ 0 0 0 00 00 0 10 0 1 1y5 y4 =11,+0 111 1 1 0P、Y同时右移一位 111 1 1 1 0 0 0 10 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说明