2012-05-26 44 views
1

我想学习一个测试,我必须知道一些关于MIPS和汇编代码的内容。你能帮我吗?我会尽力写出我认为是给定问题的正确答案,但我不知道我是否正确MIPS,程序集 - 几个问题

1)MIPS中的操作数32位操作数是否可以包含任何32位值? 我认为“不 - 从不”,因为前16位是为操作码和源+最终寄存器保留的。是正确的还是有一些指令可以包含任何32位值?

2)我们有指令倍(IF = 400PS,ID = 500PS,EX = 450ps,MEM = 500PS,WB = 150ps的) 请告诉我时钟节拍为 a)无流水线处理机? b)带流水线的处理器?

我认为a)是2000ps(所有时间的总和)和b)500ps(表中最大的时间),但是再一次,林不知道。

3)我有以下汇编代码:

0x0000  addi t0, $0, 5 
0x0004 loop: beq t0, $0, done 
0x0008  nop 
0x000C  lw t1, 0x4($0) 
0x0010  lw t2, 0x24($0) 
0x0014  addi t0, t0, -1 
0x0018  j loop 
0x001C  nop 
0x0020 done 

我不是100%肯定它做什么(因为我不充分已了解了是为0x4($ 0的结果)在负荷运转) 。我知道有一个for循环(对于t = 5,t> 0 t--)。 现在的问题是 - 什么是这个缓存的命中率和丢失率,以及你如何计算它

如果你至少能回答前两个问题,那就太好了。非常感谢...

+2

时钟机制?机智是什么意思? – betabandido

+1

时钟*费率*可能? –

回答

2
  1. 如果您在谈论MIPS 32位,那么当然,类型I指令不可能包含32位立即数。这种指令的布局是(opcode,rs,rt,IMM),它们的大小(6,5,5,16)位。所以立即值只有16位大小。当然如果体系结构是64位的,那么你可以有更长的立即值。

  2. 我假设你指的是指令执行的延迟。正如你所指出的,如果没有管道,你需要为所有阶段增加时间。如果处理器使用流水线,则必须将时钟设置为匹配最慢的阶段。在你的情况下,这是500ps,无论是解码和内存阶段。

  3. lw t1, 0x4($0)从存储器地址0x4加载一个字($ 0代表总是包含零的寄存器0)并将该值存储到t1中。所以如果你仔细看代码,你会发现它总是从位置0x4和0x24加载数据。假设缓存在开始时是空的,那么在第一次迭代中你将会有两次失误,而在以后的失败中没有其他错误。因此缺失率将是(1 * 2)/(5 * 2)= 2/10 = 1/5。但是,您必须考虑高速缓存是否以块的形式传输数据。在这种情况下,第一个加载可能会传输一个包含例如64个字节的大块。这将使第二次加载操作不会错过,所以未命中率将降低到1/10。但我认为这种简单的处理器并不是这种情况。

仅供参考,here你有很多关于MIPS架构和ISA信息。您可能还对以下计算机体系结构的经典书籍感兴趣:Computer Architecture: A Quantitative Approach

+0

非常感谢非常清楚的解释 - 我现在明白了...... :-) – Smajl

+0

@betabandido:MIPS 64位仍然使用相同的固定32位长度指令,因此不可能加载大于16位的立即数 –

+0

@LưuVĩnhPhúc事实上,如果是这样的话,这是不可能的。不过,您可以分两步加载它,或者使用您提到的常量池。我会尽力更新我的答案。 – betabandido

0

@betabandido:MIPS 64位仍然使用相同的32位长度指令,因此您仍然无法加载任何大于16位的立即数。唯一的解决方案是从常量池加载。像ARM程序集只能在4位移位时立即加载8位,因此它几乎依赖于常量池

例如,指向池的指针存储在$ 5中,索引是4,可以使用以下指令加载该值

lw t1, 0x4($5)