我正在研究一个项目,似乎无法弄清楚我做错了什么。我正在将一段C代码翻译成MIPS汇编语言。
C代码如下:
int A[10];
int sum = 0;
int i = 0;
while(i < 10){
sum += A[i++];
sum *= 2;
}
我已经制作了以下MIPS代码
where $s1 is base address of A
$s2 is sum
$s3 is i
s4 is 10
loop:
beq $s3, $s4, exit #if s3 and s4 equal, go to else
add $t0, $s3, $s3 #2i
add $t0, $t0, $t0 #4i
add $s1, $s1, $t0 #A[i]
lw $t2, 0($s1) #t2 = A[i]
add $s2, $s2, $t2 #sum = sum + A[i]
addi $s3, $s3, 1 #i = i + 1
add $s2, $s2, $s2 #sum = sum * 2
j loop
虽然我的代码产生了一个值,但它与预期值不匹配。我一直在桌子上敲了几个小时试图看看我做错了什么,我无法弄清楚。非常感谢任何帮助
答案 0 :(得分:1)
每次循环时,您都会将$t0
添加到$s1
。因此,不是每次将数组指针递增4,而是每次递增i*4
。
所以,不是得到A [0],A [1],A [2],A [3],......,实际得到A [0],A [1],A [3], A [6],......
我的建议是删除前两个add
说明,然后执行add $s1, $s1, 4
。
答案 1 :(得分:1)
Polynomial是对的,这是您的代码的固定版本:
.text
.globl main
main:
li $s4 , 4
li $s3 , 0
la $s1 , array1
loop:
beq $s3, $s4, exit #if s3 and s4 equal, go to else
lw $t2, 0($s1) #t2 = A[i]
add $s2, $s2, $t2 #sum = sum + A[i]
addi $s3, $s3, 1 #i = i + 1
add $s2, $s2, $s2 #sum = sum * 2
addi $s1, $s1, 4 #$s1 = &(A[i++])
move $a0, $s2
jal print_int
j loop
exit:
li $v0, 10 # Exit
syscall
print_int:
li $v0, 1
syscall
la $a0, space
li $v0, 4
syscall
jr $ra
.data
array1: .word 3, 0, 1, 2
space: .asciiz " "