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

MIPS运行时实现连续K元素块求和的汇编代码问题咨询

嘿,我来帮你补全这个MIPS汇编程序,实现你需要的连续K个元素求和功能~先理清楚核心思路:我们需要先读入K,然后处理输入的序列,用滑动窗口的方式计算每连续K个元素的和——一开始先攒够K个元素求和输出,之后每新增一个元素,就减去窗口里最老的那个元素,加上新元素,再输出新的和,直到遇到0为止。

完整的MIPS汇编实现代码
.globl main
.data
    prompt_k: .asciiz "请输入整数K: "
    prompt_seq: .asciiz "请输入以0结尾的非零整数序列: "
    space: .asciiz " "

.text
main:
    # 提示用户输入K
    li $v0, 4
    la $a0, prompt_k
    syscall

    # 读取整数K到$a1(你定义的$K)
    li $v0, 5
    syscall
    move $a1, $v0       # $a1 = K
    blez $a1, exit      # 如果K<=0,直接退出(避免无效输入)

    # 提示用户输入序列
    li $v0, 4
    la $a0, prompt_seq
    syscall

    # 初始化变量
    move $t0, $zero     # $t0: 当前窗口内的元素计数
    move $t1, $zero     # $t1: 当前窗口的和(你定义的$S)
    # 在栈上分配K个整数的空间,用来存储最近的K个元素
    subu $sp, $sp, 4
    sw $a1, ($sp)       # 先把K存在栈顶,后续释放空间时用
    subu $sp, $sp, 4*$a1 # 分配K*4字节的数组空间
    move $t3, $sp       # $t3: 数组的起始地址
    move $t4, $zero     # $t4: 数组的当前索引(循环使用,模K)

read_seq:
    # 读取序列中的一个整数
    li $v0, 5
    syscall
    beq $v0, $zero, exit # 输入0,结束程序

    # 将当前元素存入数组对应位置
    sll $t5, $t4, 2     # 计算字节偏移:索引*4
    add $t5, $t5, $t3   # 得到元素的存储地址
    sw $v0, ($t5)       # 存入当前元素

    # 累加当前元素到窗口和
    add $t1, $t1, $v0
    addi $t0, $t0, 1    # 窗口元素计数+1

    # 判断窗口是否已满(达到K个元素)
    bne $t0, $a1, read_seq # 没满,继续读下一个元素

    # 窗口已满,输出当前和
    jal print_sum

    # 进入滑动窗口逻辑:每次读新元素,更新窗口和并输出
slide_window:
    # 读取下一个元素
    li $v0, 5
    syscall
    beq $v0, $zero, exit # 输入0,结束程序

    # 取出数组中最早加入窗口的元素(当前索引对应的位置)
    sll $t5, $t4, 2
    add $t5, $t5, $t3
    lw $t6, ($t5)       # $t6 = 窗口中最老的元素

    # 更新窗口和:减去最老元素,加上新元素
    sub $t1, $t1, $t6
    add $t1, $t1, $v0

    # 替换数组中的老元素为新元素
    sw $v0, ($t5)

    # 更新数组索引(循环模K,实现队列的FIFO)
    addi $t4, $t4, 1
    rem $t4, $t4, $a1

    # 输出更新后的窗口和
    jal print_sum

    # 继续处理下一个元素
    j slide_window

print_sum:
    # 输出当前窗口和
    li $v0, 1
    move $a0, $t1
    syscall
    # 输出空格分隔结果
    li $v0, 4
    la $a0, space
    syscall
    jr $ra

exit:
    # 释放栈上分配的空间
    lw $a1, 4($sp)      # 取出之前存储的K值
    addu $sp, $sp, 4*$a1 # 释放数组空间
    addu $sp, $sp, 4    # 释放存储K的空间
    # 退出程序
    li $v0, 10
    syscall

关键部分解释

  1. 输入合法性检查:加了blez $a1, exit,避免用户输入K≤0的无效情况,防止后续逻辑出错。
  2. 滑动窗口实现:用栈上的数组存储最近K个元素,通过循环索引(模K)来实现“先进先出”的队列效果,这样每次滑动时能快速找到要移除的老元素。
  3. 代码复用:把输出和的逻辑封装成print_sum函数,减少重复代码,让结构更清晰。
  4. 栈空间管理:手动分配和释放栈空间,避免内存泄漏,符合MIPS汇编的规范。

针对你原来的代码,我保留了你定义的$K对应$a1、$S对应$t1的映射,同时补全了从输入处理到滑动窗口计算的完整逻辑。

内容的提问来源于stack exchange,提问作者JusTRoll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:29