MIPS汇编实现字符串冒泡排序无输出问题求助
MIPS汇编冒泡排序无输出问题修复
问题根源分析
你的代码存在两个核心问题导致无输出,同时附带冗余代码:
- 寄存器栈恢复顺序错误:函数中寄存器的栈加载顺序和保存顺序完全不匹配,还遗漏了
$t6的恢复,导致寄存器值混乱,直接影响后续输出系统调用的执行。 - 冒泡排序交换逻辑颠倒:当前代码判断「当前字符小于下一个字符」时跳过交换,但冒泡排序的正确逻辑是「当前字符大于下一个字符」时才需要交换,逻辑颠倒不仅会导致排序错误,还可能因输入时的换行符干扰结果。
- 冗余代码:
move $t2, $zero中的$t2未被实际使用,属于无效代码。
修正后的完整代码
.data InputPrompt: .asciiz "Please input a string(no more than 255 Characters: " Buffer: .space 256 .text li $v0, 4 la $a0, InputPrompt syscall li $v0, 8 la $a0, Buffer li $a1, 255 syscall #taking input # 可选:移除输入时的换行符(避免排序后排在最前面) move $t0, $a0 RemoveNewline: lb $t1, 0($t0) beq $t1, 10, ReplaceNull beqz $t1, EndRemove addi $t0, $t0, 1 j RemoveNewline ReplaceNull: sb $zero, 0($t0) EndRemove: jal BubbleSort move $a0, $v0 li $v0, 4 syscall li $v0, 10 syscall BubbleSort: addi $sp, $sp, -32 sw $ra, 0($sp) sw $t0, 4($sp) #temporary storage for the string sw $t1, 8($sp) #Used to go back to beginning of string sw $t2, 12($sp) #register to keep track of iterator sw $t3, 16($sp) #flag to check if a switch happened or not sw $t4, 20($sp) #for str[i] > str[i+1] condition sw $t5, 24($sp) #current byte sw $t6, 28($sp) #next byte move $t0, $a0 # 替换冗余的la指令,直接传递地址 li $t3, 0 OutterLoop: #while(!sorted) beq $t3, 1, Done # (!sorted) condition li $t3, 1 li $t1, 0 InnerLoop: lb $t5, 0($t0) #load current byte lb $t6, 1($t0) #load next byte beqz $t6, EndString #'\0' has value of 0 # 修正交换条件:当前字符大于下一个时交换 slt $t4, $t6, $t5 # str[i] > str[i+1] 等价于 str[i+1] < str[i] beq $t4, 0, ELSE # 不满足交换条件则跳转 sb $t6, 0($t0) sb $t5, 1($t0) li $t3, 0 ELSE: addi $t0, $t0, 1 addi $t1, $t1, 1 j InnerLoop EndString: sub $t0, $t0, $t1 #go back to beginning of string j OutterLoop Done: move $v0, $t0 #return string # 严格按保存顺序恢复寄存器 lw $ra, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) lw $t2, 12($sp) lw $t3, 16($sp) lw $t4, 20($sp) lw $t5, 24($sp) lw $t6, 28($sp) # 补充遗漏的$t6恢复 addi $sp, $sp, 32 jr $ra
关键修改说明
- 栈恢复逻辑修正:严格按照寄存器的保存顺序加载,确保每个寄存器恢复到函数调用前的状态,避免寄存器值混乱导致后续系统调用失败。
- 交换条件修正:将
slt $t4, $t5, $t6改为slt $t4, $t6, $t5,同时调整跳转判断,确保只有当前字符大于下一个字符时才执行交换,符合冒泡排序的核心逻辑。 - 换行符处理(可选):添加了移除输入换行符的代码,避免换行符(ASCII码10)因小于小写字母而排在排序结果的最前面。
- 代码精简:移除了未使用的冗余代码,优化了字符串地址传递的指令。
内容的提问来源于stack exchange,提问作者IsaacZa
相关产品推荐
相关产品推荐

