计算机组织与系统结构第五章习题答案
习题答案
3.假定某计算机中有⼀条转移指令,采⽤相对寻址⽅式,共占两个字节,第⼀字节是操作码,第⼆字节是相对位移量(⽤补码表⽰),CPU每次从内存只能取⼀个字节。假设执⾏到某转移指令时PC的内容为200,执⾏该转移指令后要求转移到100开始的⼀段程序执⾏,则该转移指令第⼆字节的内容应该是多少?
参考答案:
因为执⾏到该转移指令时PC为200,所以说明该转移指令存放在200单元开始的两个字节中。因为CPU每次从内存只能取⼀个字节,所以每次取⼀个字节后PC应该加1。
该转移指令的执⾏过程为:取200单元中的指令操作码并译码→PC+1→取201单元的相对位移量→PC+1→计算转移⽬标地址。假设该转移指令第⼆字节为Offset,则100=200+2+Offset,即Offset = 100–202 = –102 = 10011010B
(注:没有说定长指令字,所以不⼀定是每条指令占2个字节。)
4.假设地址为1200H的内存单元中的内容为12FCH,地址为12FCH的内存单元的内容为38B8H,⽽38B8H单元的内容为
88F9H。说明以下各情况下操作数的有效地址和操作数各是多少?
(1)操作数采⽤变址寻址,变址寄存器的内容为12,指令中给出的形式地址为1200H。
(2)操作数采⽤⼀次间接寻址,指令中给出的地址码为1200H。
(3)操作数采⽤寄存器间接寻址,指令中给出的寄存器编号为8,8号寄存器的内容为1200H。
参考答案:
(1)有效地址EA=000CH+1200H=120CH,操作数未知。
(2)有效地址EA=(1200H)=12FCH,操作数为38B8H。
(3)有效地址EA=1200H,操作数为12FCH。
5.通过查资料了解Intel 80x86微处理器和MIPS处理器中各⾃提供了哪些加法指令,说明每条加法指令的汇编形式、指令格式和功能,并⽐较加、减运算指令在这两种指令系统中不同的设计⽅式,包括不同的溢出处理⽅式。
参考答案(详细信息略):
MIPS:
Intel 80x86:
6.某计算机指令系统采⽤定长指令字格式,指令字长16位,每个操作数的地址码长6位。指令
分⼆地址、单地址和零地址三类。若⼆地址指令有k2条,⽆地址指令有k0条,则单地址指令最多有多少条?参考答案:
设单地址指令有k1条,则 ((16 – k2) ×26 – k1) ×26 = k0,所以 k1= (16 – k2) ×26 – k0/26
7.某计算机字长16位,每次存储器访问宽度16位,CPU 中有8个16位通⽤寄存器。现为该机
设计指令系统,要求指令长度为字长的整数倍,⾄多⽀持64种不同操作,每个操作数都⽀持4种寻址⽅式:⽴即(I )、寄存器
直接(R )、寄存器间接(S )和变址(X ),存储器地址位数和⽴即数均为16位,任何⼀个通⽤寄存器都可作变址寄存器,⽀持以下7种⼆地址指令格式(R 、I 、S 、X 代表上述四种寻址⽅式):RR 型、RI 型、RS 型、RX 型、XI 型、SI 型、SS 型。请设计该指令系统的7种指令格式,给出每种格式的指令长度、各字段所占位数和含义,并说明每种格式指令需要⼏次存储器访问?参考答案:
指令格式可以有很多种,只要满⾜以下的要求即可。
操作码字段:6位;寄存器编号:3位;直接地址和⽴即数:16位;变址寄存器编号:3位;总位数是8的倍数。指令格式例1:
指令格式例2:
RR 型
RI 型 RS 型 RX 型
XI 型 SI 型 SS 型
寻址⽅式字段(2位)----00:⽴即;01:寄直;10:寄间;11-变址
8.有些计算机提供了专门的指令,能从32位寄存器中抽取其中任意⼀个位串置于⼀个寄存器的
低位有效位上,并⾼位补0,如下图所⽰。MIPS 指令系统中没有这样的指令,请写出最短的⼀个MIPS 指令序列来实现这个功能,要求i=5, j=22, 操作前后的寄存器分别为$s0和$s2。
参考答案:
可以先左移9位,然后右移15位,即:
sll $s2, $s0, 9
srl $s2, $s2, 15
思考:(1) 第⼆条⽤算术右移指令sra ⾏不⾏?
不⾏,因为不能保证⾼位补0!
(2) 若第⼀条指令中的$s2改成其他寄存器R ,则会带来什么问题?所⽤寄存器R 的值被破坏!
9.以下程序段是某个过程对应的指令序列。⼊⼝参数int a 和int b 分别置于$a0和$a1中,返回
参数是该过程的结果,置于$v0中。要求为以下MIPS 指令序列加注释,并简单说明该过程的功能。
add $t0, $zero, $zero loop:
beq $a1, $zero, finish
j
(32–(j –i) )位
(j –i)位
RR 型
RI 型 RS 型
RX 型 XI 型 SI 型
SS 型
add $t0, $t0, $a0
sub $a1, $a1, 1
j loop
finish: addi $t0, $t0, 100
add $v0, $t0, $zero
参考答案:
1: 将t0寄存器置零
2: 如果a1的值等于零则程序转移到finish处
3: 将t0和a0的内容相加,结果存放于t0
4: 将a1的值减1
5: ⽆条件转移到loop处
6: 将t0的内容加上100,结果存放于t0
7: 将t0的值存放在v0
该程序的功能是计算“100+a×b”
10.下列指令序列⽤来对两个数组进⾏处理,并产⽣结果存放在$v0中。假定每个数组有2500 个字,其数组下标为0到2499。
两个数组的基地址分别存放在$a0和$a1中,数组长度分别存放在$a2和$a3中。要求为以下MIPS指令序列加注释,并简单说明该过程的功能。假定该指令序列运⾏在⼀个时钟频率为2GHz的处理器上,add、addi和sll指令的CPI为1;lw和bne 指令的CPI 为2,则最坏情况下运⾏所需时间是多少秒?
sll $a2, $a2, 2
sll $a3, $a3, 2
add $v0, $zero, $zero
add $t0, $zero, $zero
outer: add $t4, $a0, $t0
lw $t4, 0($t4)
add $t1, $zero, $zero
inner: add $t3, $a1, $t1
lw $t3, 0($t3)
bne $t3, $t4, skip
addi $v0, $v0, 1
skip: a ddi $t1, $t1, 4
bne $t1, $a3, inner
addi $t0, $t0, 4
bne $t0, $a2, outer
参考答案:
1: 将a2的内容左移2位,即乘4
2: 将a3的内容左移2位,即乘4
3: 将v0置零
4: 将t0置零
5: 将第⼀个数组的⾸地址存放在t4
6: 取第⼀个数组的第⼀个元素存放在t4
7: 将t1置零
8: 将第⼆个数组的⾸地址存放在t3
9: 取第⼆个数组的第⼀个元素存放在t3
10: 如果t3和t4不相等,则跳转到skip
11: 将v0的值加1,结果存于v0
12: 将t1的值加4,结果存于t1
13: 如果t1不等于a3,即还未取完数组中所有元素,则转移到inner
14: 将t0的值加4
15: 如果t0不等于a2,即还未取完数组中所有元素,则转移到outer
该程序的功能是统计两个数组中相同元素的个数。
程序最坏的情况是:两个数组所有元素都相等,这样每次循环都不会执⾏skip。因此,指令总条数为:
5+2500×(3+2500×6+2)=37512505,
其中:add,addi和sll的指令条数为:4+2500×(2+2500×3+1)=18757504
offset指令是什么意思lw和bne的指令条数为:1+2500×(1+2500×3+1)=18755001
所以:程序执⾏的时间为:(2GHzclock的clock time=1/2G=0.5ns)
(18757504×1+18755001×2) × 0.5ns = 28133753ns≈0.028s
11.⽤⼀条MIPS指令或最短的指令序列实现以下C语⾔语句:b=25|a。假定编译器将a和b分别分配到$t0和$t1中。如果把25换成65536,即b=65536|a,则⽤MIPS指令或指令序列如何实现?
参考答案:
只要⽤⼀条指令ori $t1, $t0, 25就可实现。
如果把25换成65536,则不能⽤⼀条指令ori $t1, $t0, 65536来实现,因为65536 (1 0000 0000 0000 0000B)不能⽤16位⽴即数表⽰。可⽤以下两条指令实现。
lui $t1, 1
or $t1, $t0, $t1
12.以下程序段是某个过程对应的MIPS指令序列,其功能为复制⼀个存储块数据到另⼀个存储块中,存储块中每个数据的类型为float,源数据块和⽬的数据块的⾸地址分别存放在$a0和$a1中,复制的数据个数存放在$v0中,作为返回参数返回给调⽤过程。在复制过程中遇到0则停⽌,最后⼀个0也需要复制,但不被计数。已知程序段中有多个Bug,请出它们并修改。addi $v0, $zero, 0
loop: lw $v1, 0($a0)
sw $v1, 0($a1)
addi $a0, $a0, 4
addi $a1, $a1, 4
beq $v1, $zero, loop
参考答案:
修改后的代码如下:
addi $v0, $zero, 0
loop: lw $v1, 0($a0)
sw $v1, 0($a1)
beq $v1, $zero, exit
addi $a0, $a0, 4
addi $a1, $a1, 4
addi $v0, $v0, 1
j loop
exit:
13.说明beq指令的含义,并解释为什么汇编程序在对下列汇编源程序中的beq指令进⾏汇编时会遇到问题,应该如何修改该程序段?
here: beq $s0, $s2, there
……
there: addi $s1, $s0, 4
参考答案:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论