簡體   English   中英

將C代碼轉換為MIPS匯編-使用數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM