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

MARS MIPS冒泡排序代码问题:排序后输出无空格分隔

MIPS冒泡排序数组打印无空格问题修复

问题根源

你的代码里数组定义出错了:.data段的array: .word 10是定义一个值为10的单整数,而非10个元素的数组。当你输入10个整数时,后续输入会覆盖array之后的内存区域——包括你定义的space字符串内容。原本的空格字符串被覆盖成其他数值,导致用v0=4调用打印空格时,找不到正确的空格字符,自然输出不了空格。

修复步骤

  1. 修正数组定义:把array: .word 10替换成以下两种写法之一:

    • array: .word 0:10:显式定义10个初始值为0的整数元素
    • array: .space 40:直接分配40字节内存(每个整数占4字节,10个正好40字节)
  2. (可选优化)冒泡排序逻辑:原代码每次循环都重复执行la $t0,array,可以提前把数组基地址存入寄存器,减少冗余操作,但这不是当前问题的核心。

修正后的完整代码

.data
    array: .word 0:10   # 修正为10个元素的数组
    sentence: .asciiz "Please enter a 10-integer array: "
    space: .asciiz " "
.text
main:
    li $v0,4
    la $a0,sentence
    syscall

    li $s0,0
    li $t0,10
    la $t1,array
    
    for_input:                     ##### 输入数组的循环
    beq $s0,$t0,exit_for_input
        li $v0,5
        syscall
        sw $v0,0($t1)
    addi $t1,$t1,4  
    addi $s0,$s0,1  
    j for_input
    exit_for_input:
    
    # 冒泡排序
    li $s0,0
    li $t1,9
    li $t2,10
    li $t3,0
    la $t0,array  # 提前加载数组基地址,避免重复la操作
    for_outter:
    beq $s0,$t1,exit_outter
    addi $s1,$s0,1
    addi $t4,$t3,4
        for_inner:
        beq $s1,$t2,exit_inner
            add $t5_addr, $t0, $t3
            lw $t5,0($t5_addr)       # arr[i]
            
            add $t6_addr, $t0, $t4 
            lw $t6,0($t6_addr)       # arr[j]
            
            slt $t7,$t5,$t6
            li $t8,0
            
            beq $t7,$t8,exitif  # 交换条件:arr[i] < arr[j]时交换(降序)
                sw $t5,0($t6_addr)
                sw $t6,0($t5_addr)
            exitif:
        addi $t4,$t4,4
        addi $s1,$s1,1
        j for_inner
        exit_inner:
    
    addi $t3,$t3,4
    addi $s0,$s0,1
    j for_outter
    exit_outter:
    
    li $s0,0
    li $t0,10
    la $t1,array
    
    for_output:
    beq $s0,$t0,exit_output
        lw $t2,0($t1)
        move $a0,$t2
        li $v0,1
        syscall     # 打印数组元素
    
        li $v0,4
        la $a0,space
        syscall     # 打印空格
    addi $s0,$s0,1      
    addi $t1,$t1,4
    j for_output
    exit_output:
    li $v0,10
    syscall

测试验证

输入1 2 3 4 5 6 7 8 9 10后,会正确输出10 9 8 7 6 5 4 3 2 1,元素间的空格正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:45:05