Арифметика между двойным и целым числом в сборке MIPS - PullRequest
0 голосов
/ 12 марта 2019

Ниже приведена программа MIPS, которая конвертирует из Фаренгейта в Цельсий. Я определил 3 переменные, одна из которых double, а все остальные integer. Однако, чтобы выполнить деление или умножение между переменными, мне пришлось преобразовать int переменные в double позже в коде.

Причина, по которой я объявил переменные как int, а не float или double, заключается в том, что я буквально храню десятичные десятичные константы, и мне не нужно использовать два регистра для этого, так как double требуется. Однако теперь я понимаю, что столкнулся с двумя новыми проблемами:

1) Теперь мне нужно сделать два дополнительных шага для каждой переменной (перейти к cp1 и преобразовать в double)

2) После строки mtc1.d $t1, $f6 значения становятся double, и они сохраняются в двух регистрах, как обычные двойные числа, а не в одном регистре, как целые числа, поэтому полностью пропускают мое намерение.

У меня вопрос, какой путь лучше для памяти и эффективности программы? Объявление переменных как одного и того же типа данных и сокращение количества инструкций, но занимающих больше места в памяти, чем мне нужно? Или дать переменным более подходящие типы данных, но стоить себе 3 шага вместо одного? Нет ли эффективного способа сделать арифметику между двумя различными типами данных в MIPS, используя как можно меньше регистров?

.data
input: .double
cons1: .double 32
cons2: .word 5
cons3: .word 9

.text
#take double input from user
li $v0, 7
syscall             #value is stored in f0 (and f1 probably)


#subtract first constant
ldc1 $f2, cons1         #load the value 32 into f2 and f3
sub.d $f12, $f0, $f2        

#multiply by 5
lw $t1, cons2           #load 5 into t1     
mtc1.d $t1, $f4         #move the value in t1 to f4
cvt.d.w $f4, $f4        #convert value to single precision to be able to do 
                        #multiplication
mul.d $f12, $f12, $f4   

#divide by 9    
lw $t2, cons3           #load 9 into t2
mtc1.d $t2, $f6         #move the value in t2 to f5
cvt.d.w $f6, $f6        #convert value to single precision to be able to do 
                        #division
div.d $f12, $f12, $f6

#show result
li $v0, 3
syscall
...