Не могу добавить два 32-битных числа на MIPS - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь написать код, который позволяет добавлять 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 Ответ

0 голосов
/ 31 марта 2019

Используйте addu / addiu для простого двоичного сложения.Вынос из верхнего бита отбрасывается, и проверка переполнения со знаком дополнения 2 не выполняется, поэтому он просто работает как упаковка без знака или со знаком.

Вы должны когда-либо использовать add / addi если вы специально хотите , это вызовет исключение при переполнении со знаком.(например, для обнаружения случаев, когда это является ошибкой, и вы хотите, чтобы ваша программа прерывала работу вместо продолжения с упакованными данными.)


Компиляторы C не используют MIPS addдаже для подписанной арифметики.Переполнение со знаком - неопределенное поведение в C, поэтому они могут использовать его в некоторых случаях (когда у операндов asm есть значения, которые существовали в абстрактной машине C, а не результат переупорядочения или чего-то еще), но большинство компиляторов выбираютне делать.

...