无法在MIPS上添加两个32位数字

时间:2019-03-30 21:09:11

标签: assembly mips mars-simulator arithmetic-overflow

我正在尝试编写一个使两个数字相加的代码,即使它们的长度为32位。但是,如果我添加两个32位数字,或者添加两个数字组成32位数字(例如2bi + 2bi),则程序将无法工作。在第一种情况下,我收到“无效的整数输入”错误,在第二种情况下,我得到了“算术溢出”错误。我认为第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

1 个答案:

答案 0 :(得分:0)

使用.ag-theme-material .ag-icon-checkbox-checked:empty { $color: mat-color($accent); background-image: icon(checkbox-checked, 'rgb(' + red($color) + ', ' + green($color) + ', ' + blue($color) + ')'); } .ag-theme-material .ag-icon-checkbox-unchecked { $color: mat-color($foreground, icon); background-image: icon(checkbox-unchecked, 'rgb(' + red($color) + ', ' + green($color) + ', ' + blue($color) + ')', opacity($color)); } / addu进行纯二进制添加。丢弃从最高位开始的进位,并且不检查2的补码有符号溢出,因此它可以像包装无符号或有符号加法一样工作。

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


C编译器甚至不对有符号算术使用MIPS addi。有符号溢出是C中未定义的行为,因此在某些情况下(当asm操作数具有C抽象机中存在的值,而不是重新排序之类的结果时),它们可以使用,但是大多数编译器选择不做。