请求将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
代码关键部分解释
- 初始化阶段:用
li(加载立即数)指令给寄存器赋初始值,这是MIPS中给寄存器设置小整数的常用方式。 - 循环条件判断:用
slti(小于立即数则置位)判断i < 11,等价于i <= 10;再用beq(等于则跳转)判断是否退出循环。 - 奇偶判断:用
andi(立即数按位与)提取i的最低位,最低位为1则是奇数,为0则是偶数,比除法取余效率更高。 - 分支处理:奇数分支用
mul计算平方后更新sum,偶数分支直接把i加到sum,最后统一跳转到i自增逻辑,避免冗余。 - 循环更新:用
addi(立即数加法)实现i自增,再跳回循环开头重新判断条件,完成循环迭代。 - 结果验证:末尾添加打印sum的系统调用,运行后可看到最终计算结果(197),方便验证代码正确性。
内容的提问来源于stack exchange,提问作者Doubt
相关产品推荐
相关产品推荐

