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

如何实现浮点数的数组存储与读取?附MIPS汇编实现代码

你的MIPS浮点数数组读写实现验证与优化指导

首先先把你的原始代码贴出来方便对照:

.data
Arr : .word 40
.text
main: 
la $s0,Arr
add $t1,$t1,$zero
add $t2,$t2,$zero
inputloop: 
add $t1,$t1,1
beq $t1,5,outputloop
addi $v0,$zero,6
syscall
add $t0,$zero,$v0
mov.s $f1,$f0
swc1 $f1,0($s0)
add $s0,$s0,4
j inputloop
outputloop: 
add $t2,$t2,1
beq $t2,5,exit
lwc1 $f2,0($s0)
add $s0,$s0,4
mov.s $f12,$f2
addi $v0,$zero,2
syscall
j outputloop
exit: 
addi $v0,$zero,10
syscall

一、核心逻辑的合理性验证

先给你点个赞,你用两个循环分离输入输出逻辑、用swc1/lwc1处理单精度浮点数内存操作的思路是完全正确的,这符合MIPS架构对浮点数的处理规范:

  • 用la指令加载数组基地址到寄存器,是MIPS内存访问的标准流程
  • 针对单精度浮点数,必须使用swc1/lwc1完成内存与浮点寄存器的交互,不能用普通的sw/lw(它们只针对整数寄存器)
  • 独立循环的结构清晰,可读性不错

二、需要修复的细节问题

不过代码里有几个细节bug,会导致功能不符合预期,我帮你逐一梳理:

  1. 数组空间分配错误
    你在.data段用.word 40只分配了1个4字节的内存单元,但你的逻辑是要存储5个单精度浮点数(每个占4字节),总共需要20字节的连续空间。这样会导致后续存储操作越界访问未知内存,可能引发运行错误。
    修复:把.word 40改成.space 20,显式分配20字节的连续空间给数组。

  2. 输出循环的数组指针未重置
    输入循环结束后,$s0已经指向了数组末尾的下一个地址(因为每次输入后$s0加4,执行5次后偏移了20字节),此时直接进入输出循环会读取未知内存的数据,而不是你之前输入的数组内容。
    修复:在进入outputloop之前,重新加载数组基地址到$s0,比如添加一行la $s0,Arr。

  3. 循环计数逻辑错误,导致读写次数不足
    你的循环是先给计数器加1,再判断是否等于5,这样实际只会执行4次读写操作(计数器从0→1→2→3→4→5,当计数器到5时直接退出,只执行了4次输入/输出),但你想要的是处理5个浮点数。
    修复:调整循环顺序,先判断计数器是否达到5,再执行读写操作,最后递增计数器。

三、修复后的完整代码

.data
Arr : .space 20  # 分配5个单精度浮点数的空间(5*4=20字节)
.text
main: 
la $s0,Arr       # $s0 = 数组基地址
add $t1,$zero,$zero  # $t1 = 输入计数器,初始化为0
add $t2,$zero,$zero  # $t2 = 输出计数器,初始化为0

inputloop: 
beq $t1,5,reset_ptr  # 处理完5个浮点数,跳转到重置指针
addi $v0,$zero,6     # 调用系统读取单精度浮点数(v0=6)
syscall
swc1 $f0,0($s0)      # 直接把读取到的f0存入数组,省去多余的mov指令
add $s0,$s0,4        # 指针移动到下一个浮点数位置
add $t1,$t1,1        # 输入计数器加1
j inputloop

reset_ptr:
la $s0,Arr           # 重置数组指针到起始位置,准备输出

outputloop: 
beq $t2,5,exit       # 输出完5个浮点数就退出
lwc1 $f12,0($s0)     # 直接把数组内容加载到f12(系统输出要求的寄存器)
addi $v0,$zero,2     # 调用系统输出单精度浮点数(v0=2)
syscall
add $s0,$s0,4        # 指针移动到下一个位置
add $t2,$t2,1        # 输出计数器加1
j outputloop

exit: 
addi $v0,$zero,10    # 程序退出系统调用
syscall

四、小优化建议

  • 给寄存器添加注释,比如# $s0 = 数组基地址,能让代码可读性更强
  • 读取浮点数后可以直接用swc1 $f0,0($s0),不需要额外的mov.s $f1,$f0,减少不必要的指令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:11