我想知道,在MIPS 32中,以下两种情况是否完全相同:
add $t1 $t1 $t1
sll $t1 $t1 1
sll处理可能的溢出是否与add不同?我似乎在网上找不到一个很好的解释。
谢谢!
发布于 2022-02-07 22:07:24
是的,您正确地怀疑:sll永远不会触发溢出异常,而add则会在将数字解释为不适合32位的数字时触发溢出。
正如Jester所说,addu也不会触发溢出,因此更等同于您的sll。
大多数指令集都有这样的重复/重叠,因为这需要设计和实现两方面的努力来防止,可以说是投资回报很少或根本没有回报。
我们应该始终使用addu作为指针算法,因为我们不需要有符号的溢出检查。指针是无符号的,而addu代表添加无符号--但是它执行与add相同的算法,只是省略溢出检查。您可能认为它检查无符号溢出,但它不检查,所以称它为addu. 有点奇怪。出于同样的原因,我们也应该使用addiu而不是带有指针的addi --放弃有符号整数溢出检查。堆栈指针的调整应该用addiu来完成。但是您经常会看到人们错误地使用addi。
RISC决定完全删除溢出检查,因此如果您想要溢出检查,您必须使用更多的指令;常规指令只是add,并且对有符号或无符号整数都有效(您将添加的检查溢出的附加指令将特定于是否签名)。
https://stackoverflow.com/questions/71025554
复制相似问题