You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修改说明

  1. 新增cvt.s.w $f4, $f4完成整数到单精度浮点数的格式转换;
  2. 把乘法改为除法div.s $f8,$f4,$f6,并将结果存在$f8(和公里值$f4区分开);
  3. 每次输出前用mov.s $f12, 目标寄存器把要输出的浮点数值放到$f12;
  4. 微调了字符串的内容,让输出格式更清晰。

内容的提问来源于stack exchange,提问作者Anonymous Poster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:49:56