Assembly 为什么我们要使用addiu而不是addi?
在MIPS汇编中,使用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…)通常是无用的。事实上,它很少被用来向其他指令释放宝贵的操作码空间 这里的指令名非常容易引起误解,因为它实际上不是一个“无符号”
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未定义的行为语义相匹配,其中未定义符号溢出(和MIPSaddi
traps),但未签名溢出被定义为包装(这addiu
实现). 当然,许多编译器也选择实际实现带符号整数的包装语义,并对所有内容使用addu
/addu
。这仍然是一个奇怪的命名约定,但这就是如何记住它们是如何工作的,以及为什么它与16位立即数的处理方式无关是有意义的。