MARS环境下MIPS循环实现Km转Mi表格输出全0及多一行问题求助
MIPS公里转英里代码问题分析与修正
问题原因
- 整数转浮点数缺失格式转换:
mtc1 $s0,$f4只是把整数寄存器的二进制位直接拷贝到浮点寄存器$f4,但整数和单精度浮点数的二进制编码规则完全不同,必须用cvt.s.w $f4, $f4把整数格式转成单精度浮点数格式,不然$f4里的数值完全不符合预期。 - 输出未指定正确浮点寄存器:调用
syscall 2输出单精度浮点数时,默认读取$f12的值,但代码里计算结果存在$f4,没把$f4的值复制到$f12,导致每次输出的都是$f12的初始值(通常是0.0)。 - 转换公式逻辑错误:公里转英里的正确公式是
英里 = 公里 / 1.609344,但代码里用了乘法mul.s,实际是在做英里转公里的计算,逻辑完全搞反了。
修正后的代码
.data milesstr: .asciiz " mi" linestr: .asciiz "\n" kilomstr: .asciiz " km, " conversion: .float 1.609344 header: .asciiz "Km, Mi\n" .text .globl main main: li $v0,4 la $a0,header syscall li $s0,0 loop: bgt $s0,20,exit # 整数转单精度浮点数 mtc1 $s0,$f4 cvt.s.w $f4, $f4 # 新增:将整数格式转为浮点数格式 lwc1 $f6,conversion div.s $f8,$f4,$f6 # 修改:用除法计算英里值,结果存$f8 # 输出公里数 mov.s $f12, $f4 # 将公里值拷贝到$f12 li $v0,2 syscall li $v0,4 la $a0,kilomstr syscall # 输出英里数 mov.s $f12, $f8 # 将英里值拷贝到$f12 li $v0,2 syscall li $v0,4 la $a0,milesstr syscall li $v0,4 la $a0,linestr syscall addi $s0,$s0,1 j loop exit: li $v0,10 syscall
修改说明
- 新增
cvt.s.w $f4, $f4完成整数到单精度浮点数的格式转换; - 把乘法改为除法
div.s $f8,$f4,$f6,并将结果存在$f8(和公里值$f4区分开); - 每次输出前用
mov.s $f12, 目标寄存器把要输出的浮点数值放到$f12; - 微调了字符串的内容,让输出格式更清晰。
内容的提问来源于stack exchange,提问作者Anonymous Poster
相关产品推荐
相关产品推荐

