2015-03-17 4 views
0

Я пытаюсь сделать простую программу для добавления двух чисел с плавающей запятой в MIPS с использованием SPIM simulator.The кода показан ниже:Как использовать регистры с плавающей запятой в MIPS

.data 
prompt1: .asciiz "\nPlease Enter first no then hit <enter>:" 
prompt2: .asciiz "\nPlease Enter second no then hit <enter>:" 
result: .asciiz "\nSum is : " 
.text 
main: 

li $v0 , 4 
la $a0, prompt1 
syscall 

li $v0, 5 
syscall 
move $f1,$v0 

li $v0 , 4 
la $a0, prompt2 
syscall 

li $v0, 5 
syscall 
move $fp2 , $v0 

add.d $fp4,$fp2,$fp0 

li $v0,4 
la $a0,result 
syscall 

li $v0 , 1 
move $a0 , $fp4 
syscall 

li $v0 , 10 
syscall 

Когда я загружаю программу симулятор PCSPIM, он дает мне сообщение об ошибке. Но когда я использую общие регистры, такие как $s0, $s1, $s2) вместо регистров с плавающей запятой, чтобы добавить два простых целых числа, он отлично работает.

Как добавить два числа с плавающей запятой, используя регистры с плавающей запятой?

+2

Какая ошибка? Пожалуйста уточни. – JonasCz

+0

Ошибка при загрузке файла –

ответ

1

Регистры с плавающей точкой в ​​MIPS находятся в сопроцессоре 1, поскольку сопроцессор 1 предназначен для использования в FPU. Чтобы переместить данные в регистр с плавающей запятой, вам нужно будет использовать команду mtc1 вместо инструкции перемещения. Это означает «переход на сопроцессор 1».

Вы можете передать этот документ в интерактивном режиме для набора инструкций по эксплуатации: http://www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf

EDIT: Кроме именовании регистров с плавающей точкой является $ f0- $ f31, а не $ fp0- $ fp31.

+0

Но он по-прежнему дает мне ту же ошибку –

+0

Я пробовал вашу программу на XSPIM с указанными изменениями, и при загрузке проблем не возникало. Но сама программа не может добавить дробную часть двух входных чисел. Возможно, это просто проблема ввода/вывода, придется отлаживать и проверять. –

0

Ошибка «Ошибка при загрузке файла» - это не ошибка времени выполнения, а ошибка ассемблера. В частности, ваш источник не будет собираться, как это имеет несколько проблем:

  • Вы не можете сделать move $f1,$v0, вы должны использовать mfc1 (переход от сопроцессора 1) и mtc1 (шаг в сопроцессор, 1) инструкции по переносу данных от/до регистров с плавающей запятой.

  • Регистры с плавающей точкой не указаны fpN, но f0 - f31. Если вы хотите использовать двойную точность, вы должны преобразовать после загрузки, с (например) cvt.d.w $f0, $f2

Если сборка была успешной, add.d $fp4,$fp2,$fp0 будет пытаться добавить плавающую точка регистров f0 и f2, но у вас есть загрузили прилагаемые целые числа до f1 и f2.

Смежные вопросы