如何实现浮点数的数组存储与读取?附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,会导致功能不符合预期,我帮你逐一梳理:
数组空间分配错误
你在.data段用.word 40只分配了1个4字节的内存单元,但你的逻辑是要存储5个单精度浮点数(每个占4字节),总共需要20字节的连续空间。这样会导致后续存储操作越界访问未知内存,可能引发运行错误。
修复:把.word 40改成.space 20,显式分配20字节的连续空间给数组。输出循环的数组指针未重置
输入循环结束后,$s0已经指向了数组末尾的下一个地址(因为每次输入后$s0加4,执行5次后偏移了20字节),此时直接进入输出循环会读取未知内存的数据,而不是你之前输入的数组内容。
修复:在进入outputloop之前,重新加载数组基地址到$s0,比如添加一行la $s0,Arr。循环计数逻辑错误,导致读写次数不足
你的循环是先给计数器加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
相关产品推荐
相关产品推荐

