MIPS中如何将整数存入数组并打印?代码运行退出报错如何排查
代码问题排查
- 系统调用类型不匹配:你使用的
li $v0, 4是MIPS中打印字符串的系统调用编号,打印整数需要将$v0设为1。 - 非法内存访问:执行
lw $t0, 0($s2)后,$t0中已经存储了数组的整数值,后续lw $a0, 0($t0)会把$t0的整数值当作内存地址去读取数据,触发访问异常。 - 缺少程序退出逻辑:
end标签后没有添加程序退出的系统调用,循环结束后程序会继续执行后续无效内存区域的内容,最终抛出你遇到的运行错误。
正确实现代码
.data a: .word 3, 2, 1 # 定义存储3个整数的数组 space: .asciiz " " # 可选:用于打印数字之间的分隔符,方便阅读 .text main: li $s0, 0 # i = 0,循环计数 li $s1, 3 # 数组总长度为3 la $s2, a # $s2存储数组首地址 loop: beq $s0, $s1, end # 计数等于数组长度时退出循环 lw $t0, 0($s2) # 取出当前数组元素存入$t0 # 打印当前整数 li $v0, 1 move $a0, $t0 syscall # 可选:打印空格分隔数字 li $v0, 4 la $a0, space syscall addi $s2, $s2, 4 # 地址偏移4字节,指向数组下一个元素 addi $s0, $s0, 1 # 计数+1 j loop end: # 程序正常退出系统调用 li $v0, 10 syscall
功能实现说明
整数存入数组
- 静态存储:在
.data段使用.word指令直接声明数组的初始值即可,每个整型元素占4字节内存空间。 - 动态存储:运行时可以通过
sw指令,将寄存器中的整数值写入数组对应的内存地址,例如sw $t0, 0($s2)就能把$t0的数值存入$s2指向的数组位置。
数组打印
- 提前加载数组首地址、数组长度到对应寄存器
- 循环遍历每个数组元素,通过
lw指令取出元素值到通用寄存器 - 调用打印整数的系统调用(
$v0=1,$a0存待打印的整数值) - 循环结束后调用退出系统调用(
$v0=10),避免程序跑飞
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

