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

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

关键修改说明

  1. 栈恢复逻辑修正:严格按照寄存器的保存顺序加载,确保每个寄存器恢复到函数调用前的状态,避免寄存器值混乱导致后续系统调用失败。
  2. 交换条件修正:将slt $t4, $t5, $t6改为slt $t4, $t6, $t5,同时调整跳转判断,确保只有当前字符大于下一个字符时才执行交换,符合冒泡排序的核心逻辑。
  3. 换行符处理(可选):添加了移除输入换行符的代码,避免换行符(ASCII码10)因小于小写字母而排在排序结果的最前面。
  4. 代码精简:移除了未使用的冗余代码,优化了字符串地址传递的指令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:33:15