请求验证代码f = g + 2*h - A[3]对应的MIPS汇编代码正确性
你的MIPS汇编代码分析与修正
原代码存在两处关键问题,同时有冗余操作,具体分析如下:
核心问题点
lw指令理解错误+冗余操作
第一行lw $t0, 12($s6)的注释完全错误:lw指令的作用是从内存地址$s6 + 12中直接加载数据到$t0,也就是已经把A[3]的数值读到$t0里了,根本不是加载地址。后面的lw $t1, 0($t0)属于完全多余的错误操作——它会把$t0里的数值当作内存地址去加载内容,大概率会触发非法内存访问。注释逻辑颠倒
最后一行sub $s0, $t3, $t1的注释写反了:这条指令是计算$t3 - $t1(即g + 2*h - A[3]),但注释描述成了“Subtract the result of g + 2*h from A[3]”,逻辑完全颠倒。
修正后的代码(假设寄存器映射符合惯例:f→$s0、g→$s1、h→$s2、数组A基地址→$s6`)
如果追求简洁高效,直接去掉冗余步骤即可:
# 加载A[3]的值到$t0($s6是A的基地址,3*4=12字节偏移) lw $t0, 12($s6) # h乘2,结果存$t1 add $t1, $s2, $s2 # 计算g + 2*h,结果存$t2 add $t2, $s1, $t1 # 计算(g+2h) - A[3],结果存入f对应的$s0 sub $s0, $t2, $t0
如果一定要保留“先取地址再取值”的分步逻辑,需要把第一行的lw换成la(加载地址指令):
# 加载A[3]的地址到$t0 la $t0, 12($s6) # 从该地址加载A[3]的值到$t1 lw $t1, 0($t0) # h乘2 add $t2, $s2, $s2 # 计算g + 2*h add $t3, $s1, $t2 # 计算(g+2h) - A[3],结果存入f sub $s0, $t3, $t1
内容的提问来源于stack exchange,提问作者Mary Ramirez
相关产品推荐
相关产品推荐

