给定C代码对应的MIPS汇编代码正确性验证咨询
MIPS汇编代码正确性分析
前提条件
- 寄存器与变量映射:
f→$s0,g→$s1,数组A基地址→$s6,数组B基地址→$s7 - 目标C代码:
B[g] = A[f + 1] + A[f]; f = A[f];
你编写的汇编代码
sll $t0,$s0,2 add $t0,$t0,$s6 lw $t0,0($t0) lw $t1,4($t0) add $t2,$t0,$t1 sll $t3,$s1,2 add $t3,$t3,$s7 sw $t2,0($t3) add $s0,$t0,$zero
错误点说明
你的代码存在逻辑错误,核心问题出在内存地址的处理上:
- 第3行
lw $t0,0($t0)执行后,$t0的含义从**A[f]的内存地址变成了A[f]的数值** - 第4行
lw $t1,4($t0)会把A[f]的数值当作内存地址,去读取该地址+4位置的数据,这和C代码中A[f+1]的语义完全不符——A[f+1]应该是数组A中索引为f+1的元素,正确地址是A的基地址 + (f+1)*4,而非基于A[f]数值的偏移。
正确实现示例
要匹配原C代码逻辑,需保留A[f]的地址来获取A[f+1],示例代码如下:
# 计算A[f]的地址,存入$t0 sll $t0, $s0, 2 add $t0, $t0, $s6 # 取出A[f]的值存入$t1 lw $t1, 0($t0) # 取出A[f+1]的值(地址为$t0+4)存入$t2 lw $t2, 4($t0) # 计算两个元素的和 add $t3, $t1, $t2 # 计算B[g]的地址,存入结果 sll $t4, $s1, 2 add $t4, $t4, $s7 sw $t3, 0($t4) # 更新f的值为A[f] add $s0, $t1, $zero
内容的提问来源于stack exchange,提问作者karim ramadan
相关产品推荐
相关产品推荐

