RISC-V汇编华氏度转摄氏度代码浮点寄存器f0/f1无法加载值问题
错误原因
- 核心错误是混淆了
flw指令的作用:flw属于访存类指令,第二个操作数需要传入存储了浮点数的内存地址,但你代码里x5、x6、x7、x8寄存器里存储的是浮点数对应的IEEE 754位模式立即数,不是合法的内存地址,所以调用flw时要么触发访存异常,要么加载到无意义的垃圾值,自然无法得到正确结果。 - 你需要的是将整数寄存器中直接存储的浮点位模式搬运到浮点寄存器,应该使用
fmv.w.x指令,该指令不需要访问内存,直接完成整数寄存器到浮点寄存器的位模式拷贝。
修正后的代码
_start: li x5,0x40a00000 # 单精度浮点数5.0对应的IEEE754十六进制表示,存入x5 li x6, 0x41100000 # 单精度浮点数9.0对应的IEEE754十六进制表示,存入x6 li x7, 0x42000000 # 单精度浮点数32.0对应的IEEE754十六进制表示,存入x7 li x8, 0x42c80000 # 单精度浮点数100.0对应的IEEE754十六进制表示,存入x8,即输入值 fmv.w.x f0, x5 # 将x5存储的5.0位模式直接拷贝到浮点寄存器f0 fmv.w.x f1, x6 # 将x6存储的9.0位模式直接拷贝到浮点寄存器f1 fmv.w.x f2, x8 # 将x8存储的100.0位模式直接拷贝到浮点寄存器f2 fdiv.s f0, f0, f1 # 计算5.0/9.0,结果存入f0 fmv.w.x f1, x7 # 将x7存储的32.0位模式直接拷贝到浮点寄存器f1 fsub.s f2, f2, f1 # 计算100.0 - 32.0 = 68.0,结果存入f2 fmul.s f0, f0, f2 # 计算68.0*(5.0/9.0),最终结果存入f0
补充注意项
如果编译后运行仍触发浮点相关异常,可在编译命令中添加-march=rv64imafd -mabi=lp64d参数,显式指定编译目标支持浮点指令集。
内容的提问来源于stack exchange,提问作者Abhinav Anurag
相关产品推荐
相关产品推荐

