首页 > 解决方案 > MIPS汇编中双精度和整数之间的算术

问题描述

下面是一个将华氏温度转换为摄氏温度的 MIPS 程序。我已经定义了 3 个变量,其中一个是 a double,其余的都是integer. 但是,为了在变量之间执行除法或乘法运算,我必须在代码中将int变量转换为double后面的值。

int我将变量声明为非变量float的全部原因double是因为我实际上是在存储一位十进制常量,并且我不需要根据需要为此使用两个寄存器double。然而,现在我意识到我面临两个新问题:

1)我现在需要为每个变量做两个额外的步骤(移动到 cp1 并转换为double

2)在 line 之后mtc1.d $t1, $f6,值变为double并且它们像普通双精度一样存储在两个寄存器中,而不是像整数那样存储在一个寄存器中,因此完全没有我的意图。

我的问题是,哪种方式对内存和程序效率更好?将变量声明为所有相同的数据类型并缩短指令数量但占用的内存空间比我需要的多?或者为变量提供更合适的数据类型,但花费我 3 步而不是 1 步?通过使用尽可能少的寄存器,难道没有一种有效的方法可以在 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

标签: mathassemblymipsmars-simulator

解决方案


推荐阅读