不能在 MIPS 上添加两个 32 位数字

Can't add two 32 bit numbers on MIPS

我正在尝试编写一个代码,使添加 2 个数字成为可能,即使它们是 32 位长。但是,如果我添加两个 32 位数字,或者如果我添加两个构成 32 位数字的数字(如 2bi + 2bi),我的程序将无法运行。在第一种情况下,我得到一个 "Invalid Interger Input" 错误,在第二种情况下,我得到一个 "Arithmetic Overflow" 错误。我认为第 32 位用于“+”或“-”信号。我该如何解决这个问题?

    li $v0, 4  
la $a0, primeiro.num  #asks for the first number
syscall
li $v0, 5  
syscall
move $s0, $v0  

li $v0, 4  
la $a0, segundo.num  #asks for the second number
syscall
li $v0, 5 
syscall
move $s1, $v0 
blt $s1, $zero, erro_num_neg

add $s2, $s0, $s1

使用 addu / addiu 进行普通二进制添加。最高位的进位被丢弃,并且不检查 2 的补码有符号溢出,所以它只是作为包装无符号或有符号加法。

如果您特别希望它在签名溢出时引发异常,您应该只使用 add / addi。 (例如,检测 错误并且您希望程序中止而不是继续处理包装数据的情况。)


C 编译器不使用 MIPS add 即使是有符号算术也是如此。有符号溢出在 C 中是未定义的行为,所以他们 可以 在某些情况下使用它(当 asm 操作数具有 C 抽象机中存在的值,而不是重新排序或其他东西的结果),但大多数编译器选择不这样做。