我有一个关于 MIPS 汇编语言中无符号和有符号数字的问题,特别是关于 add 指令。
在这里:https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf, 例如,addu 指令被称为无符号加法。我知道这个名字在 MIPS 中应该是用词不当,因为 ADDU 中的 U 实际上意味着该指令不检查溢出(取消检查溢出),而不是它专门处理“无符号”数字。
根据此网站:https://mathcs.holycross.edu/~csci226/MIPS/MIPS_InstructionReference.html
“之后,根据指令,将它们作为有符号或无符号 32 位数字进行处理。有符号指令和无符号指令之间的唯一区别是有符号指令可以生成溢出异常,而无符号指令则不能。”
我的问题是,哪些加法指令变体 - add、addi、addiu、addu - 处理无符号数(正数)?其中哪些数字处理有符号数字(正数和负数)?
我也对 LBU 和 LHU 感到困惑。 我在某处读到,加载字节是无符号扩展,LHU 是加载半字(无符号扩展)。那是关于什么的?两者中哪一个涉及签名数字?
我的问题是,哪些加法指令变体 - add、addi、addiu、addu - 处理无符号数(正数)?其中哪些数字处理有符号数字(正数和负数)?
正如您所知,
add
和addi
形式将陷入有符号溢出。
因此,这些形式在一般情况下不适合用于无符号数字,并且仅适用于无符号数字,如果您知道它们将保持在较小的数字范围内(例如,总和小于 2^31)。
addu
和addiu
形式不会陷入有符号或无符号溢出,因此,它们适用于有符号和无符号数字的一般使用(除非可能发生溢出,在这种情况下它们可能是解决方案但不够)。
lb
与 lbu
形成符号扩展与零扩展。如果您的 8 位数据已签名,则在扩展到 32 位时使用 lb
保持相同的数值(在整个 8 位有符号范围内);如果您的 8 位数据是无符号的,则使用 lbu
在扩展到 32 位时保持相同的数值。如果您从不使用大于 2^7 (127) 的 8 位数据,那么您可以不受惩罚地使用其中任何一个。