【发布时间】: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