MIPS,汇编 - 几个问题

时间:2012-05-26 10:11:23

标签: assembly 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循环(for t=5, ,t >0 t--)。

    问题是 - 此缓存的点击率和未命中率是多少以及如何计算

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

2 个答案:

答案 0 :(得分: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。但我不认为这个简单的处理器就是这种情况。

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

答案 1 :(得分:1)

  

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微体系结构只能加载4位移位的8位immediate,因此它几乎依赖于常量池来获得更大的常量

相关问题