1

我目前正在写一篇关于机器语言和 MIPS 的研讨会论文,在研究小于立即无符号指令集时,我发现了一些我不理解的奇怪东西。

MIPS v5 文档(p. 277) 指出 16 位立即数在与寄存器 rs 的内容比较之前是符号扩展的,但被视为无符号数。这意味着,他们还在文档中指出,您可以表示 32 位无符号整数的下部和无符号整数的上部,两者之间有很大的差距。这是有道理的,因为您的立即数要么前面有 16 个零,要么是 16 个。

现在我不太明白的是他们作为示例提供的数字:他们说可表示的无符号整数的上下部分各有 32,767 大,这是 15 位可表示的最高数字。但是它们不应该是 65,535(最大的 16 位可表示数字),因为整数是无符号的,因此 MSB 不用作符号位吗?

4

1 回答 1

2

两个范围都是 32768 大,而不是 7。全​​套 2^16 (65536) 个可编码的 16 位立即数分为两部分,高位设置高位,低位清零。

(官方的 MIPS 文档当然是正确的,说可表示的值在无符号范围的最小[0, 32767]或最大[max_unsigned-32767, max_unsigned]端。 这些是包含范围,因此它们每个都包含 32768 个数字。计数很重要,小心 off-by-1 错误.)


可编码的值范围是

  • 0x00000000 .. 0x00007FFF(符号扩展产生零):最低无符号数
  • 不可编码;你需要多条指令
  • 0xffff8000 .. 0xffffFFFF(符号扩展产生一个):最高的无符号数

(我对符号扩展的结果使用小写字母,对立即字面编码的部分使用f大写字母F。)


对于像 (not u) 这样将值视为有符号的其他指令slti,这些相同的十六进制值仍然是您可以编码的位模式,但您将它们解释为 -32768 ( 0xffff8000) .. 32767 ( 0x00007FFF)。

ori有趣的事实:像零扩展它们的立即数这样的 MIPS 按位布尔指令,因此您可以使用一条ori $dst, $zero, imm16指令在寄存器中构造 0 .. 65535 (0x00000000 .. 0x0000FFFF)。相比之下,RISC-V 总是对立即数进行符号扩展。

于 2021-01-10T02:56:02.057 回答