为什么我们要用addiu代替addi?

qai*_*pak 5 assembly unsigned add mips immediate-operand

在MIPS组件中,使用addiuover有addi什么好处?是不是addiu未签名的(会破坏我们的计算?)

phu*_*clv 5

会破坏我们的计算

不,MIPS使用二进制补码,因此相同的加/减指令可用于有符号和无符号运算。结果没有差异。

对于按位指令,非扩展乘法和许多其他运算,也是如此。看到

它们之间的唯一区别是,addiaddiu没有溢出时会生成陷阱。因此addi,它的溢出族(addsub...)通常是无用的。实际上,它很少使用,addi因此已在MIPSr6中删除,以释放宝贵的操作码空间给其他指令

这里的指令名称极具误导性,因为它实际上不是“未签名”的加法。立即数仍然是符号扩展而不是零扩展。因此addiu $1, $2, 0xFFFF实际上将减去1 $2而不是将65535加到它。

尽管有名字,但是addiu当我们不关心溢出时,使用添加立即无符号()将常量添加到有符号整数中。MIPS没有立即数减法指令,负数需要扩展符号,因此MIPS架构师决定对立即数字段进行符号扩展。

计算机组织和设计:硬件/软件接口,作者:David A. Patterson,John L. Hennessy

阅读更多add和addu之间的区别

  • @snowflake MIPS指令的长度为32位,因此您无法在其中编码32位常量。I型指令仅包含16位立即数,在大多数情况下,包括“ addiu”情况,都会将其符号扩展为32位 (2认同)
  • 这些名称似乎与 C 的 undefined-behaviour 语义相匹配,其中有符号溢出是未定义的(和 MIPS `addi` 陷阱),但无符号溢出被定义为包装(`addiu` 实现)。当然,许多编译器也选择为有符号整数实际实现包装语义,并且对所有内容都使用 `addu` / `addiu`。这仍然是一个奇怪的命名约定,但这是如何记住它们是如何工作的,以及为什么它与 16 位立即数的处理方式无关。 (2认同)