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

请求将C语言for循环转换为MIPS汇编代码并附解释

C语言for循环转MIPS汇编(带详细解释)

原C代码:

int sum = 0;
for (int i = 1; i <= 10; i ++){
    if (i & 1) sum = sum + i * i;
    else sum = sum + i;
}

寄存器分配说明

  • $s0:存储变量sum
  • $s1:存储循环变量i
  • $t0、$t1:临时寄存器,用于计算中间值(如i*i、奇偶判断结果)

MIPS汇编代码(带逐行注释)

.data
    # 数据段:无需定义全局变量,所有变量存于寄存器
.text
.globl main
main:
    # 初始化sum = 0
    li      $s0, 0          # 把立即数0加载到$s0,sum初始化为0
    # 初始化i = 1
    li      $s1, 1          # 把立即数1加载到$s1,i初始化为1

loop_start:
    # 循环条件判断:i <= 10?
    slti    $t0, $s1, 11    # 若$s1(i) < 11,$t0置1;否则置0(等价于i<=10)
    beq     $t0, $zero, loop_end # 若$t0为0(i>10),跳转到循环结束处

    # 判断i是否为奇数:i & 1
    andi    $t1, $s1, 1     # 对i和1做按位与,结果存$t1。奇数结果为1,偶数为0
    beq     $t1, $zero, even_case # 若$t1为0(偶数),跳转到偶数分支

    # 奇数分支:sum = sum + i*i
    mul     $t0, $s1, $s1   # 计算i*i,结果存$t0
    add     $s0, $s0, $t0   # 更新sum:sum = sum + i*i
    j       increment_i     # 跳转到i自增部分,跳过偶数分支

even_case:
    # 偶数分支:sum = sum + i
    add     $s0, $s0, $s1   # 更新sum:sum = sum + i

increment_i:
    # i自增:i = i + 1
    addi    $s1, $s1, 1     # $s1(i)加1
    j       loop_start      # 跳回循环开头,重新判断条件

loop_end:
    # 打印sum结果(用于验证)
    li      $v0, 1          # 设置系统调用号1(打印整数)
    move    $a0, $s0        # 将sum的值从$s0移到$a0作为参数
    syscall                 # 执行系统调用,输出sum

    # 退出程序
    li      $v0, 10         # 设置系统调用号10(退出程序)
    syscall

代码关键部分解释

  1. 初始化阶段:用li(加载立即数)指令给寄存器赋初始值,这是MIPS中给寄存器设置小整数的常用方式。
  2. 循环条件判断:用slti(小于立即数则置位)判断i < 11,等价于i <= 10;再用beq(等于则跳转)判断是否退出循环。
  3. 奇偶判断:用andi(立即数按位与)提取i的最低位,最低位为1则是奇数,为0则是偶数,比除法取余效率更高。
  4. 分支处理:奇数分支用mul计算平方后更新sum,偶数分支直接把i加到sum,最后统一跳转到i自增逻辑,避免冗余。
  5. 循环更新:用addi(立即数加法)实现i自增,再跳回循环开头重新判断条件,完成循环迭代。
  6. 结果验证:末尾添加打印sum的系统调用,运行后可看到最终计算结果(197),方便验证代码正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:15:16