MIPS入门:如何将现有2输入计算器改造为4输入连续运算版本
改造核心思路
现有两输入计算器的核心是「单次二元运算逻辑」,要实现同运算符下四个数字的连续计算,完全不需要推翻原有代码重写,只要把原来的“一次性完成两数运算”的流程,改成基于累计值的多次二元运算流程即可,整体改动量极小,对新手友好。
具体分步改造操作
- 调整输入流程顺序,适配同运算符连续计算的逻辑
原有两输入版本的典型流程是:读取第一个数 → 读取运算符 → 读取第二个数 → 执行单次运算 → 输出结果。改造后的流程不需要大幅变动,只需要调整读入节点的逻辑:- 第一阶段读第一个数字,存入原来存储第一运算数的寄存器(比如原代码用
s0存第一个数,就继续沿用,作为计算的初始累计值) - 第二阶段读取用户输入的运算符,存入原来存储运算符标记的寄存器(比如原代码用
s1存运算符类型,这个值从读入后全程保留,不需要让用户重复输入) - 第三阶段连续读取剩余3个数字:每读入一个新数字,就用当前的累计值和这个新数字,按照之前存好的运算符做一次二元运算,把得到的新结果重新写回累计值寄存器,直到4个数字全部处理完。
- 第一阶段读第一个数字,存入原来存储第一运算数的寄存器(比如原代码用
- 100%复用原有运算判断分支,不新增判断逻辑
你原来写的针对+、-、*、/的运算分支代码可以直接沿用,不需要重写:每次做累计运算时,只要读取之前存好的运算符值,走原来的比较、跳转、计算流程就行。举个实际的计算例子:如果要算1+3+3+2
初始累计值s0 = 1
第一次读入3,判断到运算符是+,执行add s0, s0, 3,此时s0=4
第二次读入3,还是判断到运算符是+,执行add s0, s0, 3,此时s0=7
第三次读入2,还是判断到运算符是+,执行add s0, s0, 2,此时s0=9
整个过程没有新增任何判断代码,只是把原来只执行1次的运算块,执行了3次而已。 - 寄存器复用注意事项
改造过程中只要遵守两个寄存器使用规则,就不会出现数值错误:- 存累计值的寄存器、存运算符类型的寄存器,从赋值之后就不要再被输入读取、临时操作改写,一直留到所有运算完成
- 每次读新数字时,放到空闲的临时寄存器(比如
$t0)里,做完当前的累计运算后,这个临时寄存器可以随时被下一次读入的新数字覆盖,不影响整体流程。
- 输出逻辑完全不需要修改
等3次累计运算全部做完,存在累计值寄存器里的就是四个数字连续运算的最终结果,直接调用你原来写的整数输出、换行的系统调用即可,和两输入版本的输出逻辑没有任何区别。
新手容易踩的几个坑
- 不要设计复杂的输入格式:现在的需求是同运算符连续计算,完全不需要让用户每输入两个数字就输一次运算符,只要让用户在第一个数字之后输入一次运算符,再连续输剩下三个数字即可,这种输入逻辑下代码实现难度最低,也符合题目要求的连续运算场景
- 乘法运算注意寄存器溢出问题:32位MIPS架构下乘法结果会存在
hi、lo两个寄存器中,连续三次做乘法时,一定要在每次乘法完成后把正确的结果(低32位的有效部分)移回累计值寄存器,避免下一次乘法操作覆盖hi、lo的值,导致中间结果丢失 - 推荐用循环结构代替硬抄代码:你不需要把“读数字-累计运算”的流程硬写三遍,只要设置一个计数器初始值为3(因为第一个数字已经读入,剩3个需要处理),每次完成一个数字的处理就把计数器减1,减到0的时候就退出循环去输出结果就行,这种写法代码量少,也不容易因为抄写三次代码出现笔误。
内容的提问来源于stack exchange,提问作者KeKDee
相关产品推荐
相关产品推荐

