簡體   English   中英

MIPS匯編 - 陣列?

[英]MIPS Assembly - Arrays?

我絕對是匯編編程的新手,我正在嘗試在MIPS中實現以下功能(在C中):

int main()
{
  int A[5]; // Empty memory region for 5 elements
  int B[5] = {1,2,4,8,16};
  int i;

  for(i=0; i<5; i++) {
    A[i] = B[i] - 1;
  }

  i--;
  while(i >= 0) {
    A[i]=(A[i]+B[i]) * 2;
    i--;
  }
}

到目前為止我所擁有的是:

main:
#Register Map
#i --> $s0
#A[0] --> $s1   address of start of A
#B[0] --> $s2   address of start of B   
#A[i] --> $t0
#B[i] --> $t1
#(A[i] + B[i]) --> $t2
#((A[i] + B[i]) * 2) --> $t3

    li  $s0, 0      #Load immediate value 0 into i

#Begin for loop:
#for(i=0; i<5; i++){ A[i] = B[i] - 1; }

FOR_LOOP:   
    beq     $s1, $t0, END_FOR #Branch if i == 5, go to END_FOR

    addi    $s0, $s0, 1 #Add immediate value 1 to i (i++)
    j FOR_LOOP          #Jump back to the top to loop again

END_FOR:                #End for loop
    addi    $s0, $s0, -1    #Add immediate value -1 to i (i--)

#Begin while loop:  
#while(i >= 0) { A[i] = (A[i] + B[i]) * 2; i--; }

WHILE_LOOP:
    blt     $s1, 0, END_WHILE #Branch END_WHILE when !(i > 0)

    addi    $s0, $s0, -1    #Add immediate value -1 to i (i--)
    j WHILE_LOOP        #Branch back to the while loop

END_WHILE:
    sw      $s0, i      #Copy value in register to memory i
    li      $v0, 10     #Read integer from user, returned in $v0 (10=exit)

    syscall         #End program

#Store A, B in memory
    .data

A:  .word   0:5         #Allocate 20 consecutive bytes for 5-element integer word array A
B:  .word   1, 2, 4, 8, 16  #Integer words stored in 5-element array B
i:  .word   1       #Initial Value 1

我的主要問題是

  1. 我將如何訪問數組中的元素,或者我在哪里開始la

  2. 我是否正確聲明了數組?

  3. 我的注冊圖是否對於想要完成的內容有意義?

感謝您的幫助。

.text
main:
    #Register Map
    #i --> $s0
    #A[0] --> $s1   address of start of A
    #B[0] --> $s2   address of start of B   
    #A[i] --> $t0
    #B[i] --> $t1
    #(A[i] + B[i]) --> $t3
    #((A[i] + B[i]) * 2) --> $t3
    li  $s0, 0      #Load immediate value 0 into i
    li $t4,5        #upper limit
    la $s1,A        #address of start of A
    la $s2,B        #address of start of B  

    #Begin for loop:
    #for(i=0; i<5; i++){ A[i] = B[i] - 1; }
FOR_LOOP:  
    bge     $s0, $t4, END_FOR #Branch if i >= 5, go to END_FOR
    lw $t1,($s2)              #$t1=B[i]
    addi $t1, $t1, -1         #$t1=B[i]-1
    sw $t1,($s1)              #A[i]=B[i]-1
    addi $s1, $s1,4           #next element A[i+1]
    addi $s2, $s2,4           #next element B[i+1]
    addi    $s0, $s0, 1       #Add immediate value 1 to i (i++)
    j FOR_LOOP                #Jump back to the top to loop again

END_FOR:                      #End for loop
    addi    $s0, $s0, -1      #Add immediate value -1 to i (i--)
    addi $s1, $s1,-4          #previous element A[i-1]
    addi $s2, $s2,-4          #previous element B[i-1]

    #Begin while loop:  
    #while(i >= 0) { A[i] = (A[i] + B[i]) * 2; i--; }
WHILE_LOOP:
    blt     $s0, 0, END_WHILE #Branch END_WHILE when (i < 0)
    lw $t0,($s1)              #$t0=A[i]
    lw $t1,($s2)              #$t1=B[i]
    add $t3, $t0,$t1          #$t3=A[i] + B[i]
    mul $t3, $t3, 2           #$t3=(A[i] + B[i]) * 2
    sw $t3,($s1)              #A[i] = (A[i] + B[i]) * 2
    addi $s1, $s1,-4          #previous element A[i-1]
    addi $s2, $s2,-4          #previous element B[i-1]
    addi    $s0, $s0, -1      #Add immediate value -1 to i (i--)
    j WHILE_LOOP              #Branch back to the while loop

END_WHILE:

PRINT:                        #print array A[i]
    li $s0, 0                 #i=0
    la $s1, A                 #$s1=A[0]
LOOP:
    bge $s0, $t4, END         # if i >=5 goto END
    lw $a0, ($s1)             #  $a0 = A[i]
    li $v0, 1         #function print integers          
    syscall
    la $a0, space             #print separator (1 space)
    li $v0, 4         #function print strings               
    syscall
    addi $s1, $s1, 4          #next element A[i+1]
    addi $s0, $s0, 1          #i++
    b LOOP

END:
    li $v0, 10                # $v0 (10=exit)
    syscall                   #End program

#Store A, B in memory
.data    
A:  .word   0:5         #Allocate 20 consecutive bytes for 5-element integer word array A
B:  .word   1, 2, 4, 8, 16  #Integer words stored in 5-element array B
space: .asciiz " "  #space as separator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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