计算机组成与系统结构课后答案全(清华大学出版社 袁春风主编) 下载本文

内容发布更新时间 : 2024/5/13 15:25:41星期一 下面是文章的全部内容请认真阅读。

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 参考答案:

beq是一个I-型指令,可以跳转到当前指令前,也可以跳转到当前指令后。其转移目的地址的计算公式为:PC+4+offset×4,offset是16位带符号整数,用补码表示。因此,分支指令beq的相对转移范围如下。

其正跳范围为:0000 0000 0000 0000(4)~ 0111 1111 1111 1111(217=4+(215–1)×4) 负跳范围为:1000 0000 0000 0000(4–217=4+(–215)×4)~ 1111 1111 1111 1111(0=4+(–1)×4) 超过以上范围的跳转就不能用上述指令序列实现。 因此,上述指令序列应该改成以下指令序列: here: bne $s0, $s2, skip j there skip: …… ……

there: add $s0, $s0, $s0 14. 以下C语言程序段中有两个函数sum_array和compare,假定sum_array函数第一个被调用,全局变

量sum分配在寄存器$s0中。要求写出每个函数对应的MIPS汇编表示,并画出每个函数调用前、后

栈中的状态、帧指针和栈指针的位置。

1 int sum=0;

2 int sum_array(int array[], int num) 3 { 4 int i; 5 for (i = 0; i < num; i ++) 6 if compare (num, i+1) sum+=array[i] ; 7 return sum; 8 }

9 int compare (int a, int b) 10 { 11 if ( a >b) 12 return 1; 13 else 14 return 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,其栈帧空间为4×2=8B。 汇编表示如下:

move $s0, $zero # sum=0

set-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 jal $a1, $a1, 1 compare # $a1=i+1 # call compare

beq $v0, $zero, else # if $v0 = 0, jump to else sll $t1, $t3, 2 # i×4

add $t1, $t2, $t1 # $t1=array[i] lw $t4, 0($t1) # load array[i]

add $s0, $s0, $t4 # sum+=array[i]

else: addi $t3, $t3, 1 # i=i+1

j 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 0

beq $a0, $a1, exit2 # if $a0=$a1, jump to exit2 slt $t1, $a0, $a1 # if $a0<$a1, $t1=1; if $a0>=$a1, $t1= 0

bne $t1, $zero, exit2 # if $a0<$a1, jump to exit2 ori $v0, $zero,1 # return 1 exit2: jr $ra

15. 以下是一个计算阶乘的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,-8 sw $ra,4($sp) sw $a0,0($sp) slti $t0,$a0,1 beq $t0,$zero,L1 addi $v0,$zero,1 addi $sp,$sp,8 jr $ra L1:

addi $a0,$a0,-1 jal Fact

lw $a0,0($sp) lw $ra,4($sp) addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 习题

1. 给出以下概念的解释说明。

指令周期(Instruction Cycle) 机器周期(Machine Cycle) 同步系统(Synchronous system) 时序信号(Timing signal) 控制单元(Control Unit, CU) 执行部件(Execute Unit,EU) 组合逻辑元件(Combinational logic element)或操作元件(Operate element) 时序逻辑元件(Sequential logic circuit)或状态元件(State element) 多路选择器(Multiplexor) 扩展器(Extension unit) “零”扩展(0- extend) “符号”扩展(Sign extend) 算术逻辑部件ALU(Arithmetic Logic Unit) 加法器(Adder) CPU总线(CPU Bus) 寄存器堆(Register file) 定时方式(Clocking methodology) 边沿触发(Edge-triggered) 寄存器写信号(Register Write) 指令存储器(Instruction Memory) 数据存储器(Data Memory) 程序计数器(Program Counter) 指令寄存器(Instruction Register) 指令译码器(Instruction Decoder) 时钟周期(Clock Cycle) 主频(CPU Clock Rate / Frequency 转移目标地址(Branch target address) 控制信号(Control signal)

微程序控制器(Microprogrammed control) 硬布线控制器(Hardwared control) 控制存储器(Control Storage,控存CS) 微代码(Microcode) 微指令(Microinstruction) 微程序(Microprogram) 固件(Firmware) 中断过程(Interrupt Processing) 异常(Exception) 故障(fault)

自陷(Trap) 终止(Abort) 中断(Interrupt) 中断服务程序(Interrupt Handler) 中断允许位(Interrupt Enable Bit) 关中断(Interrupt OFF) 开中断(Interrupt ON) 中断响应(Interrupt Response) 向量中断(Vector Interrupt) 中断向量(Interrupt vector) 中断向量表(Interrupt vector table) 向量地址(vector Address) 中断类型号(Interrupt number) 2. 简单回答下列问题。

(1)CPU的基本组成和基本功能各是什么? (2)取指令部件的功能是什么? (3)控制器的功能是什么?

(4)为什么对存储器按异步方式进行读写时需要WMFC信号?按同步方式访问存储器时,CPU如何实

现存储器读写?

(5)单周期处理器的CPI是多少?时钟周期如何确定?为什么单周期处理器的性能差?元件在一个指

令周期内能否被重复使用?为什么?

(6)多周期处理器的设计思想是什么?每条指令的CPI是否相同?为什么在一个指令周期内某个元件

可被重复使用?

(7)单周期处理器和多周期处理器的控制逻辑设计的差别是什么? (8)硬布线控制器和微程序控制器的特点各是什么?

(9)为什么CISC大多用微程序控制器实现,RISC大多用硬布线控制器实现? (10)水平型微指令和垂直型微指令的基本概念和优缺点是什么? (11)CPU检测内部异常和外部中断的方法有什么不同?

3. 在书中图6.9中,假定总线传输延迟和ALU运算时间分别是20ps和200ps,寄存器建立时间为10ps,寄存器保持时间为5ps,寄存器的锁存延迟(Clk-to-Q time)为4ps,控制信号的生成延迟(Clk-to-signal time)为7ps,三态门接通时间为3ps,则从当前时钟到达开始算起,完成以下操作的最短时间是多少?各需要几个时钟周期? (1)将数据从一个寄存器传送到另一个寄存器 (2)将程序计数器PC加1

所示。