Ниже приведена программа 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