【发布时间】:2016-03-29 02:59:14
【问题描述】:
在 MIPS 汇编中,使用 addiu 比使用 addi 有什么好处? addiu 不是没有签名吗(会破坏我们的计算?)
【问题讨论】:
标签: assembly mips add unsigned immediate-operand
在 MIPS 汇编中,使用 addiu 比使用 addi 有什么好处? addiu 不是没有签名吗(会破坏我们的计算?)
【问题讨论】:
标签: assembly mips add unsigned immediate-operand
会破坏我们的计算
不,MIPS 使用two's complement,因此相同的加法/减法指令可用于有符号和无符号运算。结果没有区别。
对于按位指令、非扩展乘法和许多其他操作也是如此。见
它们之间的唯一区别是addi 在溢出时会生成一个陷阱,而addiu 不会。所以addi 和它的溢出家族(add、sub...)通常是没用的。事实上,addi was removed in MIPSr6 很少使用它来释放宝贵的操作码空间给其他指令
这里的指令名称极具误导性,因为它实际上不是“无符号”加法。立即数仍然是符号扩展,而不是零扩展。所以addiu $1, $2, 0xFFFF 实际上会从$2 中减去 1,而不是加上 65535。
尽管它的名字,add immediate unsigned (
addiu) 用于在我们不关心溢出时向有符号整数添加常量。 MIPS 没有立即数减法指令,负数需要符号扩展,因此 MIPS 架构师决定对立即数字段进行符号扩展。
【讨论】:
addiu $1, $2, 0xFFFFFFFF 应该从 $2 中减去 1,并且使用 0xFFFF 应该只添加那个数量(只要它明显适合)。还是我错了?
addiu case
addi 陷阱),但无符号溢出被定义为包装(addiu 实现)。当然,许多编译器也选择实际为有符号整数实现包装语义,并为所有内容使用addu / addiu。这仍然是一个奇怪的命名约定,但这就是如何记住它们是如何工作的,以及为什么它与如何处理 16 位立即数无关。