Assembly 使用寄存器作为偏移量

Assembly 使用寄存器作为偏移量,assembly,mips,cpu-architecture,addressing-mode,Assembly,Mips,Cpu Architecture,Addressing Mode,我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量。我知道不能像这样使用寄存器作为偏移量:lw$t3、$t1$t4);我只是好奇为什么会这样 这是硬件限制吗?或者只是ISA的一部分 我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量 我不确定您的意思是“为什么MIPS程序集不允许您编写此表单”还是“为什么基础ISA不提供此表单” 如果是前者,那么答案是基本ISA没有任何提供该功能的机器指令,而且显然设计者没有决定提供任何在幕后实现该功能的机器指令。2 如果你问为什么ISA一开始不提供

我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量。我知道不能像这样使用寄存器作为偏移量:
lw$t3、$t1$t4)
;我只是好奇为什么会这样

这是硬件限制吗?或者只是ISA的一部分

我很好奇为什么我们不允许在MIPS中使用寄存器作为偏移量

我不确定您的意思是“为什么MIPS程序集不允许您编写此表单”还是“为什么基础ISA不提供此表单”

如果是前者,那么答案是基本ISA没有任何提供该功能的机器指令,而且显然设计者没有决定提供任何在幕后实现该功能的机器指令。2

如果你问为什么ISA一开始不提供它,这只是一个设计选择。通过提供更少或更简单的寻址模式,您可以获得以下优势:

  • 编码一组更有限的可能性需要更少的空间,因此您可以为更多的操作码、更短的指令等节省编码空间
  • 硬件可以更简单,也可以更快。例如,在地址计算中允许两个寄存器可能导致:
  • 在寄存器文件1中需要额外的读取端口
  • 寄存器文件和AGU之间的附加连接,以在其中获取两个寄存器值
  • 需要对偏移量进行全宽(32或64位)加法,而不是更简单的地址端+16位加法
  • 如果您仍然希望支持2寄存器地址的即时偏移量,则需要有一个三输入ALU(如果您不支持,它们就不那么有用)
  • 指令解码和地址生成的额外复杂性,因为您可能需要支持两种完全不同的地址生成路径
当然,在某些情况下,所有这些折衷方案都很有可能获得回报,这些情况下可以使用更小或更快的代码很好地利用2-reg寻址,但最初的设计深受RISC理念的启发,没有包括它。正如Peter指出的,在某些情况下,新的寻址模式随后被添加,尽管显然不是加载或存储的通用2-reg寻址模式

这是硬件限制吗?或者只是ISA的一部分

这里有一点错误的二分法。当然,这并不是硬件限制,因为即使在设计MIPS时,硬件也可以支持这一点。这似乎暗示了某些现有硬件有这种限制,因此MIPS以某种方式继承了它。我怀疑这是另一种方式:ISA是这样定义的,基于对硬件实现可能性的分析,然后它变成了一种硬件简化,因为MIPS硬件不需要支持MIPS ISA之外的任何东西


1例如,支持需要从3个寄存器读取的存储指令

2当然值得一问这样的伪指令是否是一个好主意:它可能会扩展到将两个寄存器添加到一个临时寄存器,然后添加一个
lw
,并产生结果。总有一种危险,这隐藏了“太多”的工作。由于这在一定程度上掩盖了将1:1映射到硬件负载的真实负载与在幕后进行额外运算的版本之间的差异,因此很容易想象这可能会导致sup最优决策


以在循环中线性访问两个元素大小相等的数组为例。使用2-reg寻址时,自然会将此循环写入两个2-reg访问(每个访问具有不同的基址寄存器和公共偏移寄存器)。补偿维护的唯一“开销”是单个补偿增量。这隐藏了一个事实,即在内部,支持寻址模式需要两个隐藏的加法:最好直接增加每个基,而不使用偏移量。此外,一旦开销被清除,您可以看到展开循环并使用即时偏移可以进一步减少开销

他们就是这样设计的。你必须问设计师为什么他们决定反对它。我想稍后MIPS确实有索引加载(以及PC相关)。可能支持PC relative意味着AGU中需要一个2寄存器加法器,因此也可以允许2个任意寄存器,而不仅仅是PC+寄存器。(当然可以是零)。维基百科说,很明显,这使得解码和地址生成更简单。嗯,但他们只提到FP加载/存储。仅列出整数加载/存储的
关闭(Rs)
模式,包括未对齐和LL/SC,并使用常用的
符号扩展(偏移量我猜动机是整个RISC理念的一部分。MIPS是最早的RISC设计之一。
li
具有小常量的指令只有一条,对于
lw
具有小偏移量的指令也是一样。
lw
是常规的加载字机指令。我认为一些MIPS汇编程序有一个无伪模式,可以如果你想确保你没有无意中使用多条指令,你可以使用。但不管怎样,我认为寄存器读取端口参数可以很好地解释为什么MIPS仍然没有索引整数加载/存储。还有大量的编码空间,MIPS第6版重新分配了一些操作码,为新指令腾出空间ons(例如,没有分支延迟槽的分支)!因此,就编码空间和向后兼容而言,它根本不像x86。翻阅指令集参考手册(搜索
索引
)很有趣。(端口解释了它为什么索引FP load/store,因为那是另一个寄存器文件。)@PeterCordes-是的,今天的理由很好。许多其他成本随着时间的推移而降低,但添加额外读取端口的成本仍然很低