Не могу добавить два 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, а не результат переупорядочения или чего-то еще), но большинство компиляторов решают этого не делать.

Другие вопросы по тегам