MARS MIPS冒泡排序代码问题:排序后输出无空格分隔
MIPS冒泡排序数组打印无空格问题修复
问题根源
你的代码里数组定义出错了:.data段的array: .word 10是定义一个值为10的单整数,而非10个元素的数组。当你输入10个整数时,后续输入会覆盖array之后的内存区域——包括你定义的space字符串内容。原本的空格字符串被覆盖成其他数值,导致用v0=4调用打印空格时,找不到正确的空格字符,自然输出不了空格。
修复步骤
修正数组定义:把
array: .word 10替换成以下两种写法之一:array: .word 0:10:显式定义10个初始值为0的整数元素array: .space 40:直接分配40字节内存(每个整数占4字节,10个正好40字节)
(可选优化)冒泡排序逻辑:原代码每次循环都重复执行
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
相关产品推荐
相关产品推荐

