不能在 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 抽象机中存在的值,而不是重新排序或其他东西的结果),但大多数编译器选择不这样做。
我正在尝试编写一个代码,使添加 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 抽象机中存在的值,而不是重新排序或其他东西的结果),但大多数编译器选择不这样做。