Assembly 为什么我们要使用addiu而不是addi?

Assembly 为什么我们要使用addiu而不是addi?,assembly,mips,add,unsigned,immediate-operand,Assembly,Mips,Add,Unsigned,Immediate Operand,在MIPS汇编中,使用addi而不是addi有什么好处?是不是addiu没有签名(这会破坏我们的计算?) 会毁了我们的计算 不,MIPS使用,因此相同的加法/减法指令可用于有符号和无符号运算。结果没有差别 对于位指令、非加宽乘法和许多其他操作也是如此。看 它们之间唯一的区别是addi在溢出时生成陷阱,而addiu则不会。因此,addi及其溢出族(add,sub…)通常是无用的。事实上,它很少被用来向其他指令释放宝贵的操作码空间 这里的指令名非常容易引起误解,因为它实际上不是一个“无符号”

在MIPS汇编中,使用
addi
而不是
addi
有什么好处?是不是
addiu
没有签名(这会破坏我们的计算?)

会毁了我们的计算

不,MIPS使用,因此相同的加法/减法指令可用于有符号和无符号运算。结果没有差别

对于位指令、非加宽乘法和许多其他操作也是如此。看

它们之间唯一的区别是
addi
在溢出时生成陷阱,而
addiu
则不会。因此,
addi
及其溢出族(
add
sub
…)通常是无用的。事实上,它很少被用来向其他指令释放宝贵的操作码空间

这里的指令名非常容易引起误解,因为它实际上不是一个“无符号”加法。立即数仍然是符号扩展的,而不是零扩展的。因此,
addiu$1,$2,0xFFFF
实际上将从
$2
中减去1,而不是将65535相加

尽管名称不同,addimmediate unsigned(
addiu
)用于在不考虑溢出的情况下向有符号整数添加常量。MIPS没有减法立即数指令,负数需要符号扩展,因此MIPS架构师决定对立即数字段进行符号扩展


阅读更多

我认为MIPS数字是32位的,所以
addiu$1,$2,0xFFFFFFFF
应该从
$2
中减去1,并且使用
0xFFFF
应该只增加该数量(只要它明显合适)。还是我错了?@snowflake MIPS指令是32位长的,因此不能在其中编码32位常量。I型指令只包含一个16位的立即数,在大多数情况下,它将符号扩展到32位,包括
addiu
case名称似乎与C未定义的行为语义相匹配,其中未定义符号溢出(和MIPS
addi
traps),但未签名溢出被定义为包装(这
addiu
实现). 当然,许多编译器也选择实际实现带符号整数的包装语义,并对所有内容使用
addu
/
addu
。这仍然是一个奇怪的命名约定,但这就是如何记住它们是如何工作的,以及为什么它与16位立即数的处理方式无关是有意义的。