QtSpim中Sort/Swap方法返回未知错误,汇编新手求助调试
排查你的MIPS汇编排序程序Main函数问题
嘿,刚接触汇编确实容易在寄存器初始化、函数传参这些细节上踩坑,我帮你梳理下main函数里的几个明显问题,应该能帮你推进排查:
1. 错误的参数初始化
你当前写的:
lw $a0, x # Reg $a0 = x lw $a1, y # Reg $a1 = y
这里有两个核心问题:
- 代码里根本没定义
x和y这两个变量,汇编器肯定会报错; - 你的目标是对
array1排序,排序函数需要的应该是数组的起始地址和元素个数,而不是无意义的x、y。正确的做法是把数组地址加载到$a0,元素数量(这里是5)放到$a1——这是MIPS汇编函数传参的常规约定(用$a0-$a3传递参数)。
2. 无效的冗余指令
move $a0, $a0这行完全是无用操作,把寄存器的值传给自己,对程序没有任何影响,直接删掉就行。
3. 未完成的打印逻辑(以及调用后的参数处理)
你写了move $a1, $v0,但如果你的sort函数是直接在原数组上修改元素(大部分汇编排序实现都是这样,因为数组是传址),其实不需要保存返回值。另外,你后面的打印部分只写了打印字符串的逻辑,没写打印数组元素的代码——要打印整数得用li $v0, 1,而不是li $v0,4(那是打印字符串的)。
修正后的Main函数示例
给你改了一份能正常工作的main函数,结合了参数传递、排序调用和数组打印逻辑:
.data array1: .word 2, 1, 3, 5, 4 mag1: .asciiz "Sorted array: " # 补上你提到的mag1字符串定义 .text .globl main main: # 给sort函数传参:数组地址和元素个数 la $a0, array1 # 加载array1的起始地址到$a0 li $a1, 5 # 数组共5个元素,把长度存入$a1 jal sort # 调用排序函数 # 打印提示字符串 li $v0, 4 la $a0, mag1 syscall # 遍历数组,逐个打印元素 la $t0, array1 # 用$t0保存当前要打印的元素地址 li $t1, 0 # 循环计数器,从0到4 print_loop: bge $t1, 5, exit_program # 计数器到5就退出循环 lw $a0, ($t0) # 加载当前元素到$a0 li $v0, 1 # 系统调用号1:打印整数 syscall # 打印空格分隔元素,提升可读性 li $a0, 32 li $v0, 11 syscall addi $t0, $t0, 4 # 每个word占4字节,地址加4指向下一个元素 addi $t1, $t1, 1 # 计数器加1 j print_loop exit_program: li $v0, 10 # 系统调用号10:退出程序 syscall
额外提示
- 确保你的
sort函数确实是接收$a0(数组地址)和$a1(元素个数)作为参数,如果你的sort函数参数定义不一样,要对应调整传参逻辑; - 如果你的
swap函数是用来交换数组元素的,记得它的参数应该是两个元素的内存地址,调用时要正确计算元素的位置(比如第i个元素的地址是array1 + i*4)。
内容的提问来源于stack exchange,提问作者bgb102
相关产品推荐
相关产品推荐

