MIPS汇编第3行报‘repetition must be positive’错误求助
问题解决与代码修正
核心错误原因
第3行的array: .word 200:0语法完全写反了。在MIPS汇编(MARS/SPIM)中,重复初始化的语法是**值:重复次数**,你写的200:0相当于要把200重复0次,这就触发了“repetition must be positive”错误。正确写法是array: .word 0:200,表示创建200个初始值为0的word类型元素。
其他需要修正的代码问题
除了核心错误,你的代码还有多处语法和逻辑问题:
.text段的globl main缺少前缀点,应该是.globl main- 未定义
exit_program、end_fill_array、end_sum标签,导致汇编失败 invalid_input段的li $t1,,-100是无效语法,需要替换为打印错误信息的正确代码- 输出部分错误:用
li $v0,1只能打印单个整数,无法处理带占位符的字符串,需要分步骤打印 sum_loop的结束条件错误:$t2是数组的字节偏移量,应该和总字节数(元素个数×4)比较,而非直接和输入值$t0比较
修正后的完整代码
# Data segment .data array: .word 0:200 # 创建包含200个初始值为0的word数组 input_prompt: .asciiz "Enter an integer between 0 and 100: " error_msg: .asciiz "Invalid input. Please enter a number between 0 and 100.\n" output_part1: .asciiz "The double sum of integers from 0 to " output_part2: .asciiz " is: " # Text segment .text .globl main main: # 提示用户输入 li $v0, 4 la $a0, input_prompt syscall # 读取用户输入的整数 li $v0, 5 syscall move $t0, $v0 # 检查输入是否有效 bgt $t0, 100, invalid_input blt $t0, 0, invalid_input beq $t0, 0, exit_program # 填充数组:从0到2*N的数值 li $t1, 0 # 循环计数器初始化为0 li $t2, 0 # 数组字节偏移量初始化为0 fill_array_loop: bgt $t1, $t0, end_fill_array sll $t3, $t1, 1 # 计数器×2 sw $t3, array($t2) # 存储结果到数组 addi $t1, $t1, 1 # 计数器+1 addi $t2, $t2, 4 # 偏移量+4(每个word占4字节) j fill_array_loop end_fill_array: # 计算数组元素的和 li $t4, 0 # 总和初始化为0 li $t2, 0 # 重置数组偏移量为0 sum_loop: # 计算总字节数:(t0+1)个元素 ×4字节 addi $t5, $t0, 1 sll $t5, $t5, 2 bge $t2, $t5, end_sum lw $t3, array($t2) # 加载数组元素到$t3 add $t4, $t4, $t3 # 累加到总和 addi $t2, $t2, 4 # 偏移量+4 j sum_loop end_sum: # 打印结果 mul $t4, $t4, 2 # 总和×2 # 打印输出前缀 li $v0, 4 la $a0, output_part1 syscall # 打印输入值 li $v0, 1 move $a0, $t0 syscall # 打印中间字符串 li $v0, 4 la $a0, output_part2 syscall # 打印最终结果 li $v0, 1 move $a0, $t4 syscall # 换行 li $v0, 11 li $a0, '\n' syscall j main # 重启程序 invalid_input: # 打印错误信息并重启 li $v0, 4 la $a0, error_msg syscall j main exit_program: # 退出程序 li $v0, 10 syscall
内容的提问来源于stack exchange,提问作者tr45
相关产品推荐
相关产品推荐

