我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量。我知道你不能使用寄存器作为这样的偏移量:lw $t3, $t1($t4)
;我只是好奇为什么就是这种情况。
是硬件限制吗?或者只是ISA的一部分?
答案 0 :(得分:1)
我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量。
我不确定你的意思是“为什么MIPS程序集不允许你用这种形式写”或“为什么底层的ISA不提供这种形式”。
如果是前者,那么答案是基础ISA没有提供该功能的任何机器指令,显然设计师没有决定提供任何可以实现该功能的pseudo-instruction。场景。 2
如果你问为什么ISA不首先提供它,它只是一个设计选择。通过提供更少或更简单的寻址模式,您将获得以下优势:
当然,所有这些权衡取舍可能会在某些情况下得到很好的回报,这些情况可以通过更小或更快的代码充分利用2-reg寻址,但原始设计受到RISC理念的极大启发并没有'包括它。正如彼得指出in the comments,在某些情况下随后添加了新的寻址模式 ,尽管显然不是加载或存储的通用2-reg寻址模式。
是硬件限制吗?或者只是ISA的一部分?
那里有一点错误的二分法。当然,即使设计了MIPS,硬件也肯定支持这一点,这不是硬件限制。它似乎意味着某些现有硬件具有这种限制,因此MIPS ISA以某种方式继承了它。我怀疑它反过来了:ISA是以这种方式定义的,基于对硬件实现可能性的分析,然后它变成了硬件简化,因为MIPS硬件不需要支持MIPS ISA中的任何内容。
1 例如,支持需要从3个寄存器中读取的存储指令。
2 当然,值得一提的是,这样的伪指令是否是一个好主意:它可能会扩展到将两个寄存器添加到临时寄存器然后{{1}结果。总是存在这种隐藏“过多”工作的危险。由于这部分掩盖了将1:1映射到硬件负载的真实负载与在封面后进行额外算术的版本之间的差异,因此很容易想象它可能会导致最佳决策。
采用线性访问循环中两个元素大小相等的数组的经典示例。使用2-reg寻址,很自然地将此循环写为两个2-reg访问(每个具有不同的基址寄存器和公共偏移寄存器)。偏移维护的唯一“开销”是单个偏移增量。这隐藏了这样一个事实:在内部有两个隐藏的添加需要支持寻址模式:直接增加每个基数并且不使用偏移量会更好。此外,一旦开销明确,您可以看到展开循环并使用立即偏移可以进一步减少开销。