Не могу добавить два 32-битных числа на 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
1 ответ
Использование addu
/ addiu
для простого двоичного дополнения. Вынос из верхнего бита отбрасывается, и проверка переполнения со знаком дополнения 2 не выполняется, поэтому он просто работает как упаковка без знака или со знаком.
Вы должны только когда-либо использовать add
/ addi
если вы конкретно хотите, чтобы это вызвало исключение при переполнении со знаком. (например, для выявления случаев, когда это ошибка, и вы хотите, чтобы ваша программа прервала работу, а не продолжала перенос данных).
Компиляторы C не используют MIPS add
даже для подписанной арифметики. Переполнение со знаком является неопределенным поведением в C, поэтому они могут использовать его в некоторых случаях (когда у операндов asm есть значения, которые существовали в абстрактной машине C, а не результат переупорядочения или чего-то еще), но большинство компиляторов решают этого не делать.