【问题标题】:Set on Less Than Immediate Unsigned: Range of representable integers - MIPS设置小于立即无符号:可表示整数的范围 - MIPS
【发布时间】:2021-01-10 00:26:38
【问题描述】:

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

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

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

【问题讨论】:

  • 指令中有 16 位。那只能编码 2^16=65536 个数字。其中一半是负数,它们位于范围的顶部,另一半位于范围的底部。
  • 立即数是从 16 位到 32 位的符号扩展,就像一个有符号的 16 位字段(即一个负数或正数 16 位数字)。因此,使用正立即数,我们可以与 0 到 32767 范围内的任何数字进行比较。因为符号扩展立即数最终被视为无符号数:使用负立即数我们可以与 4,294,934,528 到 4,294,967,295 范围内的任何数字进行比较(下限:0xFFFF 8000,从 16 位立即数 0x8000;上限:0xFFFF FFFF 从 16 位立即数 0xFFFF)。
  • 该指令 TYPE (I-type, R-type...) 符号的逻辑扩展了立即数。然后在发生这种情况之后,该指令将这些 BITS 用作无符号。不要试图在符号扩展和位的无符号使用之间建立任何联系。它只是简单地指出,有很多数字无法在一条指令中表示。

标签: assembly mips twos-complement immediate-operand


【解决方案1】:

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

p>

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


可编码的值范围是

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

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


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

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

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多