MIPS汇编中的双精度和整数运算

时间:2019-03-11 21:21:14

标签: math assembly mips mars-simulator

下面是将Fahrenheit转换为Celsius的MIPS程序。 我定义了3个变量,其中一个是double,其余的都是integer。但是,为了在变量之间进行除法或乘法,我不得不在代码后面将int变量转换为double

我将变量声明为int而不是floatdouble的全部原因是因为我实际上存储了一位数字的十进制常量,而我不需要使用两个按照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

0 个答案:

没有答案