计算机组织与系统结构复习题.docx
《计算机组织与系统结构复习题.docx》由会员分享,可在线阅读,更多相关《计算机组织与系统结构复习题.docx(22页珍藏版)》请在冰豆网上搜索。
![计算机组织与系统结构复习题.docx](https://file1.bdocx.com/fileroot1/2022-12/12/cef80a82-2a50-4991-b19d-f3ce68c82446/cef80a82-2a50-4991-b19d-f3ce68c824461.gif)
计算机组织与系统结构复习题
1.假定某计算机存储器按字节编址,CPU从存储器中读出一个4字节信息D=32343538H,该信息的内存地址为0000F00CH,按小端方式存放,请回答下列问题。
(1)该信息D占用了几个内存单元?
这几个内存单元的地址及其内容各是什么?
(2)若D是一个32位无符号数,则其值是多少?
(3)若D是一个32位补码表示的带符号整数,则其值是多少?
(4)若D是一个IEEE754单精度浮点数,则其值是多少?
(5)若D是一个用8421码表示的无符号整数,则其值是多少?
(6)若D是一个字符串,每个字节的低7位表示对应字符的ASCII码,则对应字符串是什么?
(7)若D是两个汉字的国标码,则这两个汉字在GB2312字符集码表中分别位于哪一行和哪一列?
(8)若D中前3个字节分别是一个像素的R、G、B分量的颜色值,则其值各是多少?
【分析解答】
将32343538H展开为二进制表示为00110010001101000011010100111000B。
(1)因为存储器按字节编址,所以4个字节占用4个内存单元,其地址分别是0000F00CH、0000F00DH、0000F00EH、0000F00FH。
由于采用小端方式存放,所以,最低有效字节38H存放在0000F00CH中,35H存放在0000F00DH中,34H存放在0000F00EH中,32H存放在0000F00FH。
(2)无符号数。
值为229+228+225+221+220+218+213+212+210+28+25+24+23。
(3)补码整数。
符号为0,表示其为正数,其值与无符号数的值一样。
(4)IEEE754单精度浮点数。
根据IEEE754单精度浮点数格式可知,符号位s=0,为负数;阶码e=01100100B=100,故阶码的值为100–127=–27;尾数小数部分f=0.01101000011010100111000,所以,其值为1.01101000011010100111B×2-27。
(5)8421码整数。
32343538H各位表示对应十进制数32343538,所以,其值为32343538。
(6)ASCII码字符串。
各字节的低7位分别为0110010、0110100、0110101、0111000,所以,对应的字符串为“2458”。
(7)汉字。
对国标码每个字节各自减20H,得到两个汉字的区位码,分别为1214H和1518H,也即,第一个汉字在GB2312字符集码表中位于第18(12H)行、第20(14H)列,第二个汉字位于第21(15H)行、第24(18H)列。
(8)颜色值。
该像素的R、G、B分量的颜色值分别为00110010B=50,00110100B=52,00110101B=53。
2.某字长为8位的计算机中,x和y为无符号整数,已知x=68,y=80,x和y分别存放在寄存器A和B中。
请回答下列问题(要求最终用十六进制表示二进制序列)。
(1)寄存器A和B中的内容分别是什么?
(2)若x和y相加后的结果存放在寄存器C中,则寄存器C中的内容是什么?
运算结果是否正确?
此时,零标志ZF是什么?
加法器最高位的进位C是什么?
(3)若x和y相减后的结果存放在寄存器D中,则寄存器D中的内容是什么?
运算结果是否正确?
此时,零标志ZF是什么?
加法器最高位的进位C是什么?
(4)无符号整数加/减运算时,加法器最高位进位C的含义是什么?
它与进/借位标志CF的关系是什么?
(5)无符号整数一般用来表示什么信息?
为什么通常不对无符号整数的运算结果判断溢出?
【分析解答】
(1)x=68=01000100B=44H;y=80=01010000B=50H。
所以,寄存器A和B中的内容分别是44H和50H。
(2)x+y=01000100+01010000=(0)10010100=94H,所以,寄存器C中的内容为94H,对应的真值为148,运算结果正确。
因为结果不为0,所以ZF=0;加法器最高位的进位C为0。
(3)x–y=x+[–y]补=01000100+10110000=(0)11110100=F4H,所以,寄存器D中的内容为F4H,对应的真值为244,运算结果不正确,这是因为相减结果为负数造成的。
因为结果不为0,所以ZF=0;加法器最高位的进位C为0。
(4)在加法器中进行无符号整数加法运算时,若加法器最高位进位C=1,则表示实际结果大于最大可表示数255;在加法器中进行无符号整数减法运算时,若加法器最高位进位C=1,则表示被减数大于减数,反之被减数小于减数。
因此,在无符号数相加时,CF就等于C,表示进位;在无符号数相减时,通常将最高进位C取反来作为借位标志CF,也即,无符号整数相减时,CF=C,CF=1表示有借位。
(5)无符号整数一般用来表示地址(指针)信息,当两个地址相加结果大于最大地址而取低位地址时,相当于取模,也即采用地址循环运算。
因此通常不需要判断其运算结果是否溢出,即不考虑溢出标志OF。
3.假设某字长为8位的计算机中,带符号整数采用补码表示,x=–68,y=–80,x和y分别存放在寄存器A和B中。
请回答下列问题(要求最终用十六进制表示二进制序列)。
(1)寄存器A和B中的内容分别是什么?
(2)若x和y相加后的结果存放在寄存器C中,则寄存器C中的内容是什么?
运算结果是否正确?
此时,溢出标志OF、符号标志SF和零标志ZF各是什么?
加法器最高位的进位C是什么?
(3)若x和y相减后的结果存放在寄存器D中,则寄存器D中的内容是什么?
运算结果是否正确?
此时,溢出标志OF、符号标志SF和零标志ZF各是什么?
加法器最高位的进位C是什么?
(4)若将加法器最高位的进位C作为进位标志CF,则能否直接根据CF的值对两个带符号整数的大小进行比较?
【分析解答】
(1)[–68]补=[–1000100]补=10111100B=BCH。
[–80]补=[–1010000]补=10110000B=B0H。
所以,寄存器A和B中的内容分别是BCH和B0H。
(2)[x+y]补=[x]补+[y]补=10111100+10110000=
(1)01101100=6CH,最高位前面的一位1被丢弃,因此,寄存器C中的内容为6CH,对应的真值为+108,结果不正确。
溢出标志位OF可采用以下任意一条规则判断得到。
规则1:
若两个加数的符号位相同,但与结果的符号位相异,则溢出;规则2:
若最高位上的进位和次高位上的进位不同,则溢出。
通过这两个规则都判断出结果溢出,溢出标志位OF为1,说明寄存器C中的内容不是正确的结果。
x+y的正确结果应是–68+(–80)=–148,而运算的结果为108,两者不等。
其原因是因为x+y的值(即–148)小于8位补码可表示的最小值(即–128),也即结果发生了溢出;结果的第一位(最高位)0为符号标志位SF,表示结果为正数。
因为溢出标志为1,所以符号标志实际上也是错的;因为结果不为0,所以零标志ZF=0;加法器最高位向前面的进位C为1。
(3)[x–y]补=[x]补+[–y]补=10111100+01010000=
(1)00001100=0CH,最高位前面的一位1被丢弃,因此,寄存器D中的内容为0CH,对应的真值为+12,结果正确。
两个加数的符号位相异一定不会溢出,因此溢出标志OF为0,说明寄存器D中的内容是真正的结果;结果的第一位(最高位)0为符号标志位SF,表示结果为正数;因为结果不为0,所以零标志ZF=0;加法器最高位向前面的进位C为1。
(4)若将加法器最高位的进位C作为进位标志位CF,则无法直接根据CF的值判断两个带符号整数的大小,因此带符号加减运算中不考虑CF标志。
4.某计算机标志寄存器包含四个标志位:
CF–进/借位标志;OF–溢出标志;SF–符号标志;ZF–零标志。
请说明在无符号数和带符号整数两种情况下,以下各种比较运算的逻辑判断表达式。
(1)等于;
(2)大于;(3)小于;(4)大于等于;(5)小于等于。
【分析解答】
要比较两个数的大小,通常对这两个数先做减法,根据相减的结果生成相应的标志位,最后根据标志位判断大小。
在无符号数相减时,一般不考虑SF和OF标志;在带符号整数相减时,一般不考虑CF标志。
假设被减数的机器数为X,减数的机器数为Y,则在加法器中计算两数的差时,计算公式为:
X–Y=X+(–Y)补。
以下举两个例子来说明。
假定X=1001,Y=1100,则在4位加法器中执行以下运算:
1001–1100=1001+0100=(0)1101。
若是无符号数比较,则是9和12相比,显然,ZF=0,CF=1;若是带符号整数(补码表示),则是–7和–4比较,显然,ZF=0,OF=0,SF=1。
假定X=1001,Y=0100,则在4位加法器中执行以下运算:
1001–0100=1001+1100=
(1)0101。
若是无符号数比较,则是9和4相比,显然,ZF=0,CF=0;若是带符号整数,则是–7和4比较,显然,ZF=0,OF=1,SF=0。
以下分别说明无符号数和带符号整数两种情况下各种比较运算的逻辑判断表达式。
a.无符号数情况
(1)等于:
相减后结果为零,即F=ZF。
(2)
大于:
没有借位且相减后不为0,即F=CF+ZF
(3)
小于:
有借位且相减后不为0,即F=CF•ZF
(4)
大于等于:
没有借位或相减后结果为0,即F=CF+ZF
(5)小于等于:
有借位或相减后结果为0,即F=CF+ZF
b.带符号整数情况
(1)等于:
相减后结果为零,即F=ZF。
(2)
大于:
相减后结果不为0,并且,不溢出时为正,溢出时为负。
即F=ZF•(SF⊕OF)
(3)
小于:
相减后结果不为0,并且,不溢出时为负,溢出时为正。
即F=ZF•(SF⊕OF)
(4)
大于等于:
相减后结果为0,或者,不溢出时为正,溢出时为负。
即F=ZF+(SF⊕OF)
(5)小于等于:
相减后结果为0,或者,不溢出时为负,溢出时为正。
即F=ZF+(SF⊕OF)
5.以下是一个计算阶乘的C语言递归过程,请按照MIPS过程调用协议写出该递归过程对应的MIPS汇编语言程序,要求目标代码尽量短(提示:
乘法运算可用乘法指令“mulrd,rs,rt”来实现)。
intfact(intn)
{
if(n<1)
return
(1);
else
return(n*fact(n-1));
}
【分析解答】
(1)过程fact有一个输入参数n,按MIPS过程调用协议,n应在$a0中,返回参数应存放在$v0中。
过程内没有局部变量,故无需在其栈帧中保留局部变量所用空间;需递归调用fact过程,所以必须在其栈帧中保留返回地址$ra。
过程体内全部使用临时寄存器$t0~$t9,因而无需在其栈帧中保存通用寄存器。
因为是递归调用,所以需在栈帧中保留输入参数。
因而,该过程的栈帧中要保存的信息有返回地址$ra、帧指针$fp和输入参数$a0,其栈帧空间大小为4×3=12B。
fact:
addi$sp,$sp,-12#generatestackframe
sw$ra,8($sp)#save$raonstack
sw$fp,4($sp)#save$fponstack
addi$fp,$sp,0#set$fp
sw$a0,0($fp)#save$a0(n)onstack
slti$t0,$a0,1#if(n<1)$t0=1else$t0=0
bne$t0,$zero,exit1#if(n<1)gotoexit1
addi$a0,$a0,-1#n=n-1
jalfact#callfact
lw$t1,0($fp)#restoren
mul$v0,$t1,$v0#$v0=n*fact(n-1)
jexit
exit1:
addi$v0,$zero,1#$v0=1
exit:
lw$ra,8($sp)#restore$ra
lw$fp,4($sp)#restore$fp
addi$sp,$sp,12#freestackframe
jr$ra#returntocaller
6.假设MIPS指令系统中有一条I-型带符号整数比较指令“bgtrs,rt,Imm16”,其功能为:
若R[rs]>R[rt]则PC=PC+4+Imm16×4否则PC=PC+4
若ALU能产生ZF(零)、SF(符号)和OF(溢出)三个标志的输出,请在图6.6所示的多周期数据通路中增加实现bgt指令的数据通路,并给出指令在执行周期中相应的控制信号取值。
【分析解答】
比较指令需要对两个寄存器rs和rt中的内容做减法运算(用ALU中的加法器实现),ALU根据运算结果得到ZF、SF和OF三个标志信息。
在此,rs和rt中的内容被看成带符号整数,因此,判断R[rs]>R[rt]的条件表达式为:
ZF•(SF⊕OF)。
图6.6中的多周期数据通路已能支持beq指令的执行,而beq指令和bgt指令的目标转移地址是一样的,因此,只要在图6.6中原先beq指令的条件判断逻辑基础上增加bgt指令的条件判断逻辑即可,修改后的数据通路如图6.13所示,其中带阴影部分是修改或增加的数据通路。
bgt
OF
SF
SF
ZF
OF
OF
ZF
beq
MUX
图6.13增加了bgt指令的多周期数据通路
在多周期数据通路中,bgt指令与beq指令一样,都需要三个时钟周期,前两个时钟周期为取指周期和译码/取数周期,它们在所有指令的执行过程中都是一样的,第三个周期为执行周期,在此周期中,各控制信号的取值为:
beq=PCWr=MemWr=IRWr=RegWr=BrWr=R-type=0,bgt=ALUSelA=1,ALUSelB=00,ALUOp=sub,PCSource=10,其余任意。
7.已知MIPS中有一条lui(loadupperimmediate)指令,其指令格式如下:
其功能是将立即数Imm16送到rt寄存器的高16位,低16位补0。
若使图6.6所示的多周期数据通路也能执行lui指令,则如何修改该多周期数据通路?
需要增加什么控制信号?
该指令对应的时钟周期数是多少?
除取指周期和译码/取数周期外的其他周期中控制信号的取值是什么?
【分析解答】
lui指令采用I-型指令格式,rs=$0。
因此,该指令的功能可以描述成:
R[rt]←R[$0]+Imm16×216。
因此,只要在图6.6中对原扩展器稍加修改,然后借助I-型运算类指令数据通路就可实现lui指令。
具体修改如下。
①修改原扩展器,使其具有高位零扩展、高位符号扩展和低位零扩展三种扩展功能。
②控制信号EXTop从原来的1位扩展为2位,用于控制扩展器进行三种扩展操作。
可以定义EXop=01时进行高位零扩展;EXop=10时进行高位符号扩展;EXop=11时进行低位零扩展。
该指令的执行过程同I-型运算类指令,因此,与ori指令类似,其时钟周期数为4。
第3个时钟周期各控制信号取值为:
ALUSelA=1,ALUSelB=10,ALUOp=add,EXTop=11,MemtoReg=RegDst=RegWr=PCWr=PCWrCond=IRWr=MemWr=BrWr=R-type=0,其余任意;第4个时钟周期各控制信号取值为:
ALUSelA=RegWr=1,ALUSelB=10,ALUOp=add,EXTop=11,MemtoReg=RegDst=PCWr=PCWrCond=IRWr=MemWr=BrWr=R-type=0,其余任意。
8.假定图6.6所示的多周期数据通路中寄存器堆只有一个读口和一个写口,若要完成和原数据通路相同的功能,则需要对图中原数据通路作哪些修改?
与之对应的有限状态机又如何修改?
每条指令的时钟周期数有什么变化?
【分析解答】
如果图6.6所示的多周期数据通路中寄存器堆改成只有一个读口,那么,原来可以同时读数据到A和B,现在只能先读一个到A,再读一个到B。
由于A和B共用一个读地址端口,所以在读地址端口的输入端要加一个多路选择器及其控制信号RegRead,用于选择读地址口是rs还是rt。
可以定义当RegRead=0时读口地址为rs,当RegRead=1时读口地址为rt。
由于只有一个读数据端口,该端口的数据可能被送到A,也可能被送到B,所以读数据端口的输出同时连到A和B的输入端,并增加一个控制信号AWr,可以定义当AWr=1时将端口数据送A,在AWr=0时将端口数据送B。
因此,在数据通路中,AWr信号直接连到A的“写使能”线,而将AWr信号取反后连到B的“写使能”线。
由于每个时钟周期只能读取一个操作数,修改后的数据通路不能像原先的数据通路那样,在第2个周期(译码/取数周期)中同时读取rs和rt,必须修改相应的有限状态机。
可以有以下三种修改方式。
①将原来的译码/取数周期再分成两个周期,分别读rs到A和读rt到B,并在其中一个周期中投机完成转移地址计算。
这样,每条指令的执行都多了一个时钟周期。
②在原来的译码/取数周期中先读rs到A,对于R-Type和Branch类指令,再增加一个周期来读rt到B;对于其他不需用到rt内容的指令,则无需增加新的周期。
这样,对于每个R-Type和Branch类指令的执行,都会多一个时钟周期,而其他指令的时钟周期数不变。
③在原来的译码/取数周期中先读rt到B,这样,对于R-Type指令、Branch类指令、load/store类指令和Ori指令等都要再增加一个周期用于读rs到A。
显然,上述三种方式中,第②种做法得到的综合CPI最小。
9.假定有一条MIPS伪指令“bcmp$t1,$t2,$t3”,其功能是实现对两个主存块数据的比较,$t1和$t2中分别存放两个主存块的首地址,$t3中存放数据块的长度,每个数据占一个字(4个字节),若所有数据都相等,则将0置入$t1;否则,将第一次出现不相等时的地址分别置入$t1和$t2并结束比较。
(1)若$t4和$t5是两个空闲寄存器,请给出实现该伪指令的指令序列。
(2)假定比较的数据块大小为50个字,说明在类似于图6.6所示的多周期数据通路中执行该伪指令时最多有多少个时钟周期。
【分析解答】
(1)实现伪指令“bcmp$t1,$t2,$t3”的指令序列如下。
beq$t3,$zero,done#若数据块长度为0,则结束
compare:
lw$t4,0($t1)#块1的当前数据取到$t4
lw$t5,0($t2)#块2的当前数据取到$t5
bne$t4,$t5,done#$t4和$t5的内容不等,则结束
addi$t1,$t1,4#块1中的当前数据指向下一个
addi$t2,$t2,4#块2中的当前数据指向下一个
addi$t3,$t3,-1#比较次数减1
bne$t3,$zero,compare#若没有全部比较完,则继续比较
addi$t1,$zero,0#若全部都相等,则将$t1置0
done:
(2)在类似图6.6所示的多周期数据通路中执行时,上述程序段中用到的指令beq、lw、bne和addi的时钟周期数分别为3、5、3和4。
若比较的数据块大小为50个字,则上述指令序列中的循环(粗体部分)最多被执行50次,因而所需的指令数最多为1+50×7+1=352。
其中,load指令为50×2=100条,时钟周期数为5×100=500;branch指令数为1+2×50=101,时钟周期数为3×101=303;addi指令数为1+3×50=151,时钟周期数为4×151=604。
所以,总时钟周期数最多为500+303+604=1407。
10.在一个指令集中增添功能强大的复杂指令时,通常使用微程序方式对这些复杂指令进行控制。
如果要求在图6.6所示的多周期数据通路中采用微程序控制方式实现第19题中的“bcmprs,rt,rd”指令,并且规定使用通用寄存器作为两个额外临时寄存器rt1和rt2。
(1)请给出全套的设计方案,包括该指令的汇编形式、机器码格式(与原有指令格式兼容)、指令执行流程(用RTL表示)、数据通路修改方案、控制信号增加或修改方案、指令执行对应的有限状态机等。
(2)与第19题的软件实现方式相比,该指令用硬件实现时的速度快了多少?
硬件实现速度快的原因是什么?
(3)能否用单周期数据通路实现?
若能,则用软件实现合算还是用硬件实现合算?
(4)如果rt1和rt2不用通用寄存器,而是用内部寄存器,则会有哪些好处?
【分析解答】
(1)该指令的汇编形式:
bcmprs,rt,rd,rt1,rt2。
该指令的机器码格式如下。
其中6位OP字段可以选择一个未被其他指令使用的编码。
指令的功能:
比较个数由rd指出,如果rd的内容为0则什么都不做,继续执行下条指令,否则,对rs和rt所指内存单元的数据依次比较,直到发生以下情况为止。
①若存在一对数据不相等,则将不相等的数据所在的内存单元地址分别保存在rs和rt中,结束执行;②若所有数据都相等,则将0存放在rs中,结束执行。
rt1和rt2是临时寄存器,在指令执行过程中,rs、rt、rd、rt1和rt2都会被破坏。
该指令执行流程如图6.14所示。
对图6.6所示的数据通路和控制信号做以下修改。
①在存储器的Adr处对原MUX进行修改,增加R[rs](在A中)和R[rt](在B中)两个输入,原控制信号IorD改为2位,当IorD为0、1、2和3时,分别将PC、ALUout、A和B送Adr处。
②在寄存器堆的Ra处增加一个MUX,除原来的rs外,增加rt、rd和rt1三个输入端,增加相应的2位控制信号RdAdd1,当RdAdd1为0、1、2和3时,寄存器读地址分别为rs、rt、rd和rt1。
③在寄存器堆的Rb处增加一个MUX,除原来的rt外,另一个输入来自rt2,增加相应的1位控制信号RdAdd2,当RdAdd2为0和1时,寄存器读地址分别为rt和rt2。
④在寄存器堆的Rw处对原MUX进行修改,除了原来的rt和td外,增加rs、rt1和rt2三个输入,原控制信号RegDst改为3位,当RegDst为0、1、2、3、4时,寄存器写地址分别为rs、rt、rd、rt1和rt2。
⑤在寄存器堆的Dw处对原MUX进行修改,除了原来的输入以外,增加一个输入端“0”,原控制信号MemtoReg改为2位,当MemtoReg为0、1和2时,存入寄存器的内容分别为存储器读出数据、ALU输出结果和0。
⑥在ALU的B输入端处对原MUX进行修改,再增加两个输入“0”和“1”,以使ALU能执行“R[rd]-0”和“R[rd]-1