在小于立即无符号数上设置:可表示整数的范围 - MIPS

问题描述

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

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

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

解决方法

两个范围都是 32768 大,而不是 7。完整的 2^16 (65536) 可编码 16 位立即数被分成两部分,高半部分设置高位,低半部分清除。

>

(官方 MIPS 文档当然是正确的,说可表示的值位于无符号范围的最小 class Product: def __init__ (self,productID) self.brandName = "" self.productID = str(productID) self.total_gallons_sold_of_this_product = 0 self.total_gallons_sold_to_retailers = 0 self.total_gallons_sold_to_customers = 0 class Transaction: def __init__ (self,productID) self.productID = str(productID) self.total_gallons_for_this_sale = 0 # gets input from generate_transaction_list function self.is_retailer_sale = 0 # boolean,if it's not a retailer sale then it's a customer sale def generate_transaction_list(): # Makes an array of Transaction objects from an excel spreadsheet,uses a pandas dataframe,returns the array ... def generate_product_list(): # Makes an array of the different products based on an excel spreadsheet,returns the array ... array_transaction_data = generate_transaction_list() product_list = generate_product_list() 或最大 [0,32767] 端。这些是包含范围所以它们每个都包含 32768 个数字。计数很重要,要小心 off-by-1 错误。)


可编码的值范围是

  • [max_unsigned-32767,max_unsigned](符号扩展产生零):最低的无符号数
  • 不可编码;您将需要多个说明
  • 0x00000000 .. 0x00007FFF(符号扩展产生的):最高的无符号数

(我使用小写 0xffff8000 .. 0xffffFFFF 表示符号扩展的结果,大写 f 表示直接编码的部分。)


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

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