【问题标题】:MIPS, assembly - a few questionsMIPS,汇编 - 几个问题
【发布时间】:2012-05-26 10:11:22
【问题描述】:

我正在尝试学习一项测试,我必须了解一些关于 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--)。

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

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

【问题讨论】:

  • 时钟机智?机智是什么意思?
  • 也许时钟滴答声

标签: assembly mips


【解决方案1】:
  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。但我不认为这个简单的处理器会出现这种情况。

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

【讨论】:

  • 非常感谢您非常清楚的解释 - 我现在明白了... :-)
  • @betabandido:MIPS 64 位仍然使用相同的固定 32 位长度指令,因此无法加载大于 16 位的立即数
  • @LưuVĩnhPhúc 确实,如果是这样,那是不可能的。不过,您可以分两步加载它,或者使用您提到的常量池。我会尝试更新我的答案。
【解决方案2】:

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

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

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

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

lw t1, 0x4($5)

较旧的 ARM 微架构只能加载 8 位立即数和 4 位移位,因此它几乎依赖于常量池来获取更大的常量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多