1

我正在尝试研究一个我必须了解 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 循环(for t=5, ,t >0 t--)。

    问题是 -这个缓存的命中率和未命中率是多少,你如何计算它

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

4

2 回答 2

2
  1. 如果您在谈论 MIPS 32 位,那么当然,I 类指令不可能包含 32 位立即数。这种指令的布局是(操作码、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。但我认为这个简单的处理器并非如此。

仅供参考,这里有很多关于 MIPS 架构和 ISA 的信息。您可能还对一本关于计算机体系结构的经典书籍感兴趣:计算机体系结构:一种定量方法

于 2012-05-26T10:47:53.060 回答
1

MIPS中的直接操作数32位操作数可以包含任何32位值吗?

显然不是,因为在 MIPS 中,指令宽度固定为 32 位。如果立即数是 32 位长,则操作码和其他操作数将没有更多空间

请注意,betabandido 关于 MIPS64 的说法是不正确的。在 MIPS64 中,指令长度仍然是 32 位,所以你仍然不能加载任何大于 16 位的立即数。事实上,我所知道的任何架构都没有固定 64 位指令。这太浪费了,而且更有可能错过指令缓存。要加载 32 位常量,您需要 2 条指令(lui + ori/addui)。对于 64 位常量,您需要 6 条指令(4 次立即加载加上 2 次移位)。这是一个关于编译器如何构造大常量的示例

这是一个很长的系列,只是为了加载一个简单的值,所以你有另一个选择是使用一个常量池(比如在 ARM 上)。例如指向池的指针存储在 $5 中,索引为 4,可以使用以下指令加载值

lw t1, 0x4($5)

Older ARM microarchitectures can only load 8-bit immediates with a 4-bit shift, so it almost relies on constant pool for bigger constants

See

于 2013-07-28T13:16:05.413 回答