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
相关产品推荐
相关产品推荐

