math - 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
解决方案
推荐阅读
- node.js - 通知用户(客户端应用程序)服务器端应用程序正在处理他们上传的文件的最佳实践是什么。反应、节点和 MongoDB
- python - 如何通过 Resnet、FCn、DeepLab 图像分割评估解决 GPU OOM 问题?
- javascript - 如何为 React Table 中的三个或更多嵌套列启用列排序?
- c - 如何在vscode中调试多个C文件?
- python - 使用 numpy 和 jax 进行非传递子类化
- python - 创建登录和注册页面 HTML 和 CSS 后如何获取用户输入并保存到数据库?
- html - 根据对象在 Mat-Dialog 中显示不同的信息?
- javascript - 如何在 git-hook 中应用 eslint/prettier 自动修复
- office-ui-fabric - Fluent UI 组合框 allowFreeform
- shopify - 创建新订单时,Shopify 如何更新库存?