下面是将Fahrenheit转换为Celsius的MIPS程序。
我定义了3个变量,其中一个是double
,其余的都是integer
。但是,为了在变量之间进行除法或乘法,我不得不在代码后面将int
变量转换为double
。
我将变量声明为int
而不是float
或double
的全部原因是因为我实际上存储了一位数字的十进制常量,而我不需要使用两个按照double
的要求进行注册。但是,现在我意识到我面临两个新问题:
1)现在,我需要为每个变量执行两个额外的步骤(移至cp1并转换为double
)
2)在mtc1.d $t1, $f6
行之后,这些值变为double
,它们被存储在两个寄存器中,例如普通的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