MIPS汇编根据$t0正负修改寄存器值 可否用算术移位优化实现
问题解答
现有代码存在的问题
- 边界处理错误:未覆盖
$t0 = 0的场景,bgt $t0, $0, pos的判断逻辑中,0不会触发跳转,会进入负数分支被赋值为-1,不符合题目中非负数设为0的要求 - 存在大量冗余操作:你在两个分支中的核心操作本质完全相同,MIPS移位指令只会取寄存器值的低5位作为移位长度,你在负数分支中
li $t1, -1后做的srav,实际就是对$t0做31位算术右移,和正数分支的sra $t0, $t0, 31效果完全一致,额外的分支跳转、寄存器赋值都是无用操作,反而会增加指令数和分支预测失败的开销。
最优实现方案
题目的要求可以仅用1条算术移位指令实现,不需要任何分支和额外寄存器操作:
sra $t0, $t0, 31
实现原理
MIPS使用32位补码存储有符号整数,最高位为符号位,算术右移时会用符号位填充空缺位:
- 若
$t0为负数,符号位为1,算术右移31位后所有位都为1,对应补码值就是-1 - 若
$t0为正数或0,符号位为0,算术右移31位后所有位都为0,正好得到要求的结果
该实现比你原有代码减少了4条指令,无分支开销,执行效率更高。
内容的提问来源于stack exchange,提问作者Harry Battersby
相关产品推荐
相关产品推荐

