MIPS如何实现整数与浮点数相乘并将结果存储为浮点数
问题解答
核心结论
不需要完全重写代码段,现有代码的主体业务逻辑(输入读取、消息打印)都是正确的,仅需要调整类型转换、浮点数运算相关的几行代码即可完成需求。
现有代码存在的问题梳理
- 读取时薪的逻辑冗余:
syscall 6读取用户输入的单精度浮点数会直接存入$f0寄存器,不需要提前用lwc1 $f4, rate加载初始值 - 寄存器操作错误:不能用通用寄存器的
move指令搬运浮点数,MIPS的浮点数运算和通用整数运算使用两套独立的寄存器体系 - 缺少类型转换步骤:整数类型的工时不能直接和浮点数类型的时薪运算,需要先把整数转换为单精度浮点数
修正后的代码段(替换你卡住的尾部代码即可)
# 读取时薪逻辑修正 li $v0, 4 la $a0, ratePrompt syscall # 显示询问用户时薪的消息 li $v0, 6 syscall # 读取用户输入的时薪,结果存到$f0 mov.s $f4, $f0 # 把时薪存到$f4备用 li $v0,4 la $a0, rateMSG syscall # 显示时薪相关提示消息 li $v0, 2 mov.s $f12, $f4 syscall # 打印用户输入的时薪数值 # 薪资计算部分 li $v0, 4 la $a0,finalMSG syscall # 显示薪资计算结果相关提示消息 mtc1 $t0, $f1 # 把整数工时从通用寄存器$t0搬到浮点寄存器$f1 cvt.s.w $f2, $f1 # 把$f1里的整数转换为单精度浮点数,存入$f2 mul.s $f12, $f2, $f4 # 浮点数乘法:工时*时薪,结果直接存到$f12用于打印 li $v0, 2 syscall # 打印薪资结果 # 程序正常退出 li $v0, 10 syscall
关键指令说明
mtc1:Move To Coprocessor 1,把通用寄存器的内容搬运到浮点协处理器的寄存器中,是整数转浮点数的前置操作cvt.s.w:Convert Word to Single Float,把浮点寄存器中存储的32位整数转换为单精度浮点数mul.s:单精度浮点数乘法指令,两个操作数都需要是浮点寄存器中的单精度浮点数
内容的提问来源于stack exchange,提问作者Sol_lunar
相关产品推荐
相关产品推荐

