【问题标题】:Can't add two 32 bit numbers on MIPS不能在 MIPS 上添加两个 32 位数字
【发布时间】:2019-03-30 21:09:11
【问题描述】:

我正在尝试编写一个可以添加 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

【问题讨论】:

    标签: assembly mips mars-simulator arithmetic-overflow


    【解决方案1】:

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

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


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

    【讨论】:

    • 非常感谢!它解决了我的第二个问题(现在我可以添加两个数字,例如 2bi + 2bi),但我仍然无法输入 32 位数字:/ 请您也帮我解决一下吗?
    • @AnaLauraChiocaVieira:没有minimal reproducible example,不清楚你在说什么问题。 MARS 的$v0=5 / syscall 应该能够处理可以用32 位2 的补码[-2^31 .. 2^31-1] 表示的整数范围。 en.wikipedia.org/wiki/Two%27s_complement。超出该范围的值显然无法放入 32 位寄存器,因此如果需要,您必须使用 2 个寄存器进行扩展精度数学运算。 (两个32位整数之和最多需要33位来表示。)
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多