将C语言代码转换为MIPS汇编语言

3

以下是C代码:

int A[10];
int sum = 0;
int i = 0;

while (i<10){
sum += A[i++];
sum *= 2;
}

这是我将其转换为MIPS的方法:
**Reg. Allocation Table:
A = $s1
sum = $s2
i = $s3
10 = $s4**

loop: beq $s3, $s4, endloop 

"here's where i get stuck, inside the while loop."

j: loop
endloop:

我理解在基本的while循环中,如下所示:i = $s15 = $s3
i=0;
while(i != 5)
i=i+1;

addi $s1, $zero, 0 #i=0

loop: beq $s1, $s3, endloop
add   $s1, $s1, 1
j     loop:

endloop:

我遇到了一些困难,不太理解一个稍微复杂的循环,其中引入了 sum+= A[i++];sum*= 2;

非常感谢任何帮助。我并不想要完整的答案,所以请帮我思考。

谢谢!


sum *= 2 翻译成中文为 mul <存储 sum 的寄存器>, <存储 sum 的寄存器>, 2。然后 sum += A[i++] 可以翻译成 add sum, sum, <A 数组第 i 项的地址>, 需要根据汇编器对内存寻址方式的处理略作调整。接着需要执行指令 add i, i, 1(其中 i 是存储 i 值的寄存器)。 - user529758
1
为什么你的编译器没有做到这一点? - Ignacio Vazquez-Abrams
1个回答

4

分解它:

sum += A[i++]; 变成 sum = sum + A[i]; i = i + 1; 在MIPS汇编中可以表达为:

add $t0 $s3 $s1 #index A at i
lw  $t1 0($t0)  #load A at i

add  $s2 $s2 $t1 #add A[i] to sum
addi $s3 $s3 1   #increment i

sll $s2 $s2 1 #double sum

谢谢您的解释。我今晚会仔细研究并理解它。非常感谢您的帮助! - Lord Bahamut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接