在MIPS中,“立即扩展到32位”是什么意思?

问题描述 投票:0回答:2

我正在阅读MIPS数据路径中的指令解码(ID)阶段,我得到以下引用:“一旦操作数已知,读取实际数据(来自寄存器)或将数据扩展到32位(即时) “。

有人可以解释一下“将数据扩展到32位(immediates)”部分意味着什么?我知道寄存器都包含32位,我知道什么是立即数。我只是不明白为什么你需要将立即数从26位扩展到32位。

谢谢!

mips cpu-architecture machine-code sign-extension
2个回答
1
投票

在32位CPU上,您执行的大多数操作(如添加,减去,取消引用指针)都是使用32位数字完成的。当你有一个位数较少的数字时,你需要以某种方式决定当你想在其中一个操作中使用那个数字时那些其他位是什么。决定那些新高位的行为被称为“扩展”。

假设您正在进行标准的零扩展或符号扩展,扩展非常便宜。但是,它确实需要一些电路,因此MIPS数据路径的描述会提到它是有道理的。


1
投票

26位立即仅在跳转指令中,并且没有符号或零扩展到32位,因为它们不是要添加/减去的位移。

具有16位立即数的I型指令是不同的。

  • addi / addui immediates是符号扩展的(通过将立即数的顶部/符号位复制到所有更高的位)。 https://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension 这允许编码来自-2^15 ... +2^15-1的2的补数。 (0xFFFF8000到0x00007FFF)
  • ori / andi / xori boolean immediates是零扩展的(通过将所有高位设置为零) 这允许编码来自0 .. 2^16-1的无符号/ 2的补数。 (0x00000000到0x0000FFFF)

这使得可以使用16位立即数作为32位二进制运算的输入,只有2个等宽输入才有意义。 (在一个简单的经典MIPS流水线中,解码级从寄存器和/或立即数中取出操作数。寄存器输入总是32位,因此ALU连接32位输入。将时钟扩展为32位均值CPU的其余部分不必关心数据来自即时数据还是寄存器。)

签名延期:

  • lw / sw使用的reg + imm16寻址模式中的偏移量以及其他加载/存储指令
  • 相对分支(PC += imm16<<2

也许是其他人,请查看手册中的说明,我没有提及他们是否签名或零延伸。


您可能想知道“为什么addiu签署 - 即使它没有签名也会立即延伸?”

请记住,没有subiu,只有addiu,负面立即。能够在-2^15 .. +2^15-1范围内添加或减去数字比仅添加0 .. 2^16-1更有用。

通常你不想在有符号溢出上引发异常,所以通常编译器甚至在有符号整数上使用addu / addiuaddu的名字很糟糕:它不是“对于无符号整数”,它只是add / addi的包装允许/永不断层的版本。如果你想到C,它有意义,其中有符号溢出是未定义的行为(因此如果编译器希望以这种方式实现它,可以使用add并引发异常),但是无符号整数具有良好定义的溢出行为:base 2环绕式。

© www.soinside.com 2019 - 2024. All rights reserved.