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

上传人:s****u 文档编号:12788952 上传时间:2020-05-24 格式:DOC 页数:9 大小:138.50KB
返回 下载 相关 举报
计算机组织与系统结构第五章习题答案.doc_第1页
第1页 / 共9页
计算机组织与系统结构第五章习题答案.doc_第2页
第2页 / 共9页
计算机组织与系统结构第五章习题答案.doc_第3页
第3页 / 共9页
点击查看更多>>
资源描述
第 5 章 习 题 答 案3 假定某计算机中有一条转移指令,采用相对寻址方式,共占两个字节,第一字节是操作码,第二字节是相对位移量(用补码表示),CPU每次从内存只能取一个字节。假设执行到某转移指令时PC的内容为200,执行该转移指令后要求转移到100开始的一段程序执行,则该转移指令第二字节的内容应该是多少?参考答案:因为执行到该转移指令时PC为200,所以说明该转移指令存放在200单元开始的两个字节中。因为CPU每次从内存只能取一个字节,所以每次取一个字节后PC应该加1。该转移指令的执行过程为:取200单元中的指令操作码并译码PC+1取201单元的相对位移量PC+1计算转移目标地址。假设该转移指令第二字节为Offset,则100=200+2+Offset,即Offset = 100202 = 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:0000OP (6位)R t (3位)Rs (3位)RR型0010OP (6位)Rt (3位)Imm16 (16位)RI型0100OP (6位)R t (3位)Rs (3位)RS型0110OP (6位)Rt (3位)Offset16 (16位)RX型Rx (3位)1000OP (6位)Rx (3位)Imm16 (16位)XI型1010OP (6位)R t (3位)000SI型1100OP (6位)Rt (3位)SS型Rs (3位)Offset16 (16位)000000Imm16 (16位)指令格式例2:01OP (6位)R t (3位)Rs (3位)RR型01OP (6位)Rt (3位)Imm16 (16位)RI型000OP (6位)R t (3位)Rs (3位)RS型OP (6位)Offset16 (16位)RX型Rx (3位)OP (6位)Rx (3位)Imm16 (16位)XI型OP (6位)R t (3位)000SI型OP (6位)Rt (3位)SS型Rs (3位)Offset16 (16位)00Imm16 (16位)011001R t (3位)0111110000010001010 寻址方式字段(2位)-00:立即;01:寄直;10:寄间;11-变址 8 有些计算机提供了专门的指令,能从32位寄存器中抽取其中任意一个位串置于一个寄存器的低位有效位上,并高位补0,如下图所示。MIPS指令系统中没有这样的指令,请写出最短的一个MIPS指令序列来实现这个功能,要求i=5, j=22, 操作前后的寄存器分别为$s0和$s2。31ji0(31j)位(ji)位(i+1)位310(32(ji) )位(ji)位0000参考答案:可以先左移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, $zeroloop:beq $a1, $zero, finishadd $t0, $t0, $a0sub $a1, $a1, 1j loopfinish:addi $t0, $t0, 100 add $v0, $t0, $zero参考答案:1: 将t0寄存器置零2: 如果a1的值等于零则程序转移到finish处3: 将t0和a0的内容相加,结果存放于t04: 将a1的值减15: 无条件转移到loop处6: 将t0的内容加上100,结果存放于t07: 将t0的值存放在v0该程序的功能是计算“100+ab”10 下列指令序列用来对两个数组进行处理,并产生结果存放在$v0中。假定每个数组有2500 个字,其数组下标为0到2499。两个数组的基地址分别存放在$a0和$a1中,数组长度分别存放在$a2和$a3中。要求为以下MIPS指令序列加注释,并简单说明该过程的功能。假定该指令序列运行在一个时钟频率为2GHz的处理器上,add、addi和sll指令的CPI为1;lw和bne指令的CPI为2,则最坏情况下运行所需时间是多少秒?sll $a2, $a2, 2sll $a3, $a3, 2add $v0, $zero, $zeroadd $t0, $zero, $zeroouter:add $t4, $a0, $t0lw $t4, 0($t4)add $t1, $zero, $zeroinner:add $t3, $a1, $t1 lw $t3, 0($t3)bne $t3, $t4, skipaddi $v0, $v0, 1 skip: addi $t1, $t1, 4bne $t1, $a3, inneraddi $t0, $t0, 4bne $t0, $a2, outer参考答案:1: 将a2的内容左移2位,即乘42: 将a3的内容左移2位,即乘43: 将v0置零4: 将t0置零5: 将第一个数组的首地址存放在t46: 取第一个数组的第一个元素存放在t47: 将t1置零8: 将第二个数组的首地址存放在t39: 取第二个数组的第一个元素存放在t310: 如果t3和t4不相等,则跳转到skip11: 将v0的值加1,结果存于v012: 将t1的值加4,结果存于t113: 如果t1不等于a3,即还未取完数组中所有元素,则转移到inner14: 将t0的值加415: 如果t0不等于a2,即还未取完数组中所有元素,则转移到outer该程序的功能是统计两个数组中相同元素的个数。程序最坏的情况是:两个数组所有元素都相等,这样每次循环都不会执行skip。因此,指令总条数为:5+2500(3+25006+2)=37512505,其中:add,addi和sll的指令条数为:4+2500(2+25003+1)=18757504 lw和bne的指令条数为: 1+2500(1+25003+1)=18755001所以:程序执行的时间为:(2GHzclock的clock time=1/2G=0.5ns) (187575041+187550012) 0.5ns = 28133753ns0.028s11 用一条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, 1or $t1, $t0, $t112 以下程序段是某个过程对应的MIPS指令序列,其功能为复制一个存储块数据到另一个存储块中,存储块中每个数据的类型为float,源数据块和目的数据块的首地址分别存放在$a0和$a1中,复制的数据个数存放在$v0中,作为返回参数返回给调用过程。在复制过程中遇到0则停止,最后一个0也需要复制,但不被计数。已知程序段中有多个Bug,请找出它们并修改。addi $v0, $zero, 0 loop: lw $v1, 0($a0)sw $v1, 0($a1)addi $a0, $a0, 4addi $a1, $a1, 4beq $v1, $zero, loop参考答案:修改后的代码如下: addi $v0, $zero, 0 loop: lw $v1, 0($a0)sw $v1, 0($a1)beq $v1, $zero, exitaddi $a0, $a0, 4addi $a1, $a1, 4addi $v0, $v0, 1j loop exit:13 说明beq指令的含义,并解释为什么汇编程序在对下列汇编源程序中的beq指令进行汇编时会遇到问题,应该如何修改该程序段?here: beq $s0, $s2, therethere:addi $s1, $s0, 4参考答案:beq是一个I-型指令,可以跳转到当前指令前,也可以跳转到当前指令后。其转移目的地址的计算公式为:PC+4+offset4,offset是16位带符号整数,用补码表示。因此,分支指令beq的相对转移范围如下。其正跳范围为:0000 0000 0000 0000(4) 0111 1111 1111 1111(217=4+(2151)4) 负跳范围为:1000 0000 0000 0000(4217=4+(215)4) 1111 1111 1111 1111(0=4+(1)4)超过以上范围的跳转就不能用上述指令序列实现。因此,上述指令序列应该改成以下指令序列: here: bne $s0, $s2, skip j there skip: there: add $s0, $s0, $s014 以下C语言程序段中有两个函数sum_array和compare,假定sum_array函数第一个被调用,全局变量sum分配在寄存器$s0中。要求写出每个函数对应的MIPS汇编表示,并画出每个函数调用前、后栈中的状态、帧指针和栈指针的位置。1int sum=0;2int sum_array(int array, int num) 34int i;5for (i = 0; i b)12return 1;13else14return 0;15参考答案(图略):程序由两个过程组成,全局静态变量sum分配给$s0。为了尽量减少指令条数,并减少访问内存次数。在每个过程的过程体中总是先使用临时寄存器$t0$t9,临时寄存器不够或者某个值在调用过程返回后还需要用,就使用保存寄存器$s0$s7。MIPS指令系统中没有寄存器传送指令,为了提高汇编表示的可读性,引入一条伪指令move来表示寄存器传送,汇编器将其转换为具有相同功能的机器指令。伪指令“move $t0, $s0”对应的机器指令为“add $t0,$zero,$s0”。(1)过程set_array:该过程和教材中例5.10中的不同,在例5.10中array数组是过程sum_array的局部变量,应该在过程栈帧中给数组分配空间,但该题中的数组array是在其他过程中定义的,仅将其数组首地址作为参数传递给过程sum_array(假定在在$a0中),因此,无需在其栈帧中给数组分配空间。此外,还有一个入口参数为num(假定在$a1中),有一个返回参数sum,被调用过程为compare。因此,其栈帧中除了保留所用的保存寄存器外,还必须保留返回地址,以免在调用过程compare时被覆盖。是否保存$fp要看具体情况,如果确保后面都不用到$fp,则可以不保存,但为了保证$fp的值不被后面的过程覆盖,通常情况下,应该保存$fp的值。栈帧中要保存的信息只有返回地址$ra和帧指针$fp,其栈帧空间为42=8B。汇编表示如下:move $s0, $zero # sum=0set-array: addi$sp, $sp, 8# generate stack frame sw$ra, 4($sp)# save $ra on stack sw$fp, 0($sp)# save $fp on stack addi$fp, $sp, 4# set $fp move $t2, $a0# base address of array move $t0, $a1 # $t0=num move $t3, $zero # i=0 loop: slt $t1, $t3, $t0 # if i=num, $t1= 0 beq $t1, $zero, exit1 # if $t1= 0, jump to exit1 move $a0, $t0 # $a0=num move $a1, $t3 # $a1=i addi$a1, $a1, 1# $a1=i+1jal compare # call compare beq $v0, $zero, else # if $v0 = 0, jump to elsesll $t1, $t3, 2 # i4 add $t1, $t2, $t1 # $t1=arrayi lw $t4, 0($t1) # load arrayiadd $s0, $s0, $t4 # sum+=arrayielse: addi $t3, $t3, 1# i=i+1j loop exit1: lw $ra, 4($sp)# restore $ra lw$fp, 0($sp) # restore $fp addi $sp, $sp, 8# free stack frame jr $ra# return to caller(2)过程compare:入口参数为a和b,分别在$a0和$a1中。有一个返回参数,没有局部变量,是叶子过程,且过程体中没有用到任何保存寄存器,所以栈帧中不需要保留任何信息。compare: move $v0, $zero # return 0beq $a0, $a1, exit2 # if $a0=$a1, jump to exit2slt $t1, $a0, $a1# if $a0=$a1, $t1= 0 bne $t1, $zero, exit2 # if $a0$a1, jump to exit2 ori $v0, $zero,1 # return 1 exit2: jr $ra15 以下是一个计算阶乘的C语言递归过程,请按照MIPS过程调用协议写出该递归过程对应的MIPS汇编语言程序,要求目标代码尽量短(提示:乘法运算可用乘法指令“mul rd, rs, rt”来实现,功能为“rd(rs) (rt)”)。int fact ( int n) if (n 1) return (1) ; else return (n*fact (n-1) );参考答案:Fact:addi $sp,$sp,-8sw $ra,4($sp)sw $a0,0($sp)slti $t0,$a0,1beq $t0,$zero,L1addi $v0,$zero,1addi $sp,$sp,8jr $raL1:addi $a0,$a0,-1jal Factlw $a0,0($sp)lw $ra,4($sp)addi $sp,$sp,8mul $v0,$a0,$v0jr $ra 144
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!