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

MIPS MARS汇编将Gauss消元程序从Double转Float的修改方法

MIPS双精度Gauss消元程序转单精度float版的完整修改指南

修改后结果异常的核心诱因:仅替换浮点操作指令,未同步适配内存寻址的字节长度差异。双精度浮点单元素占8字节,单精度浮点单元素仅占4字节,地址计算逻辑不匹配时,程序会读取完全错位的内存值,运算结果必然出错。


分模块修改清单

1. 数据段定义修改

  • 矩阵数组的类型声明从.double替换为.float,数组内的数值常量无需改动,会被汇编器自动识别为对应精度的浮点值
  • 解向量数组solution的每个元素声明从.double 0.0替换为.float 0.0,元素总数保持与矩阵阶数匹配

2. 内存寻址逻辑修改(最高频遗漏点)

  • 通用取址函数fetchaddress内的移位操作:原代码sll $v0, $v0, 3的作用是将元素下标值左移3位(等价乘8),匹配双精度8字节元素的偏移计算;需替换为sll $v0, $v0, 2,实现下标值乘4,匹配单精度4字节元素的偏移计算
  • 所有循环内的地址自增步长:原代码中跨元素的地址更新指令(如addiu $s1, $s1, 8、addiu $s2, $s2, 8),将立即数8改为4,保证每次地址跳转刚好跨过一个单精度浮点元素,无错位
  • 上回代求解环节的初始偏移计算:原代码中用于计算解向量内存位置的移位操作(如sll $s1, $t4, 3、sll $s2, $t1, 3),将移位位数从3改为2,适配4字节元素的偏移量计算

3. 浮点指令全量替换

  • 内存读写指令:所有双精度内存加载指令ldc1替换为单精度加载指令lwc1,双精度内存存储指令sdc1替换为单精度存储指令swc1;print_matrix函数内的l.d $f12, 0($s2)替换为单精度加载指令l.s $f12, 0($s2)
  • 寄存器运算指令:所有带.d后缀的双精度运算指令(div.d、mul.d、sub.d),全部替换为带.s后缀的对应单精度运算指令
  • 输出系统调用:所有用于浮点值打印的li $v0, 3(双精度浮点输出)替换为li $v0, 2(单精度浮点输出)

4. 原代码附带的运行异常修正(非float转换强制要求,但会导致程序跑飞)

  • print_matrix、print_solution函数入口申请了24字节栈空间,但末尾栈恢复操作写为addiu $sp, $sp, 20,需修正为addiu $sp, $sp, 24,避免栈指针错位导致的函数返回异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 08:15:01