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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:07:11