addi $a1, $a1, 1 jalcompare # $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
所示。
Clk Clk-to-Q 寄存器输出开始有效 接通三态 总线传门时间 输时间 建立时间 保持 时间 Clk-to-Signal Riout Rjin
t0 t1 t2 t3 t4 (a) 当前周期内不执行ALU运算
Clk-to-Q 寄存器输出开始有效 接通三态 总线传门时间 输时间 ALU时延 建立时间 保持 时间
Clk
Clk-to-Signal Riout Zin
t0 t1 t2 t3 t4 t5 (b) 当前周期内执行ALU运算 图6.10 单总线数据通路中主要路径的定时
参考答案:
(1)寄存器的锁存延迟与控制信号的生成延迟的时间重叠,
且Clk-to-signal time> Clk-to-Q time,所以完成寄存器传送的时间延迟为:7+3+20+10=40ps。 因为在这个过程中,只要最后保存一次信息到寄存器,所以只需要一个时钟周期。 (2)分两个阶段:
PC+1→Z:7+3+20+200+10=240ps; Z→PC:7+3+20+10==40ps
寄存器保持时间用来作为时间约束。
因为在这个过程中,需要经过两次总线传输,每次都将传输信息保存在某个寄存器中,所以需要两个时钟周期。
4. 右图6.30给出了某CPU内部结构的一部分,MAR和MDR直接连到存储器总线(图中省略)。在两个总线之间的所有数据传送都需经过算术逻辑部件ALU。ALU可实现的部分功能及其控制信号如下: MOVa:F=A; MOVb:F=B;