将C代码转换为MIPS汇编 - 使用数组

时间:2014-10-28 23:09:46

标签: c assembly translation mips

我正在研究一个项目,似乎无法弄清楚我做错了什么。我正在将一段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

虽然我的代码产生了一个值,但它与预期值不匹配。我一直在桌子上敲了几个小时试图看看我做错了什么,我无法弄清楚。非常感谢任何帮助

2 个答案:

答案 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 " "