[英]Translating C code to MIPS Assembly - Using Arrays
我正在做一個項目,似乎無法弄清楚我做錯了什么。 我正在將一段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
雖然我的代碼產生了一個值,但它與期望值不匹配。 幾個小時以來,我一直在腦袋上敲打頭,試圖看看我做錯了什么,但我無法弄清。 很感謝任何形式的幫助
每次循環時,您都將$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
。
多項式是正確的,這是代碼的固定版本:
.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 " "
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.