2017-11-01 3 views
0

Ich wurde den folgenden C-Code zur Implementierung in MIPS-Assembly gegeben.Arrays in geschachtelten für Schleifen, MIPS-Assembly

for(i=0; i<16, i++){ 
    for(i=0; j<16, j++){ 
    C[i][j] = A[i][j] = B[j][i] 
    } 
} 

Die Arrays sind bereits für uns initialisiert, wir müssen uns nur mit dem Speicher beschäftigen.

Hier ist, wie ich meine verschachtelte Schleife gemacht.

First: 
    bge $t1, $t0, Exit 
     Second: 
      bge $t2, $t0, Continue 
    #do work here. 
      addi $t2, $t2, 1 
      j Second 
    Continue: 
    addi $t1, $t1, 1 
    j First 
    Exit: 

Laden der Zähler:

addi $t0, $t0, 16 

move $t1, $zero 
move $t2, $zero 

la $t3, A 
la $t4, B 
la $t5, C 

Und Logik für A [i] [j] mit der Formel Base + Wortlänge * (Row * Max Größe + Col):

sllv $t6, $t0, $t1 #Row, shift 16 by current counter -> 32 -> 64.. 
    addu $t6, $t6, $t2 #Column, add column counter. 
    sll $t6, $t6, 2 #Shift entire count by word length. 
    addu $t6, $t6, $t3 #Add A base address. 
    lw $t7, ($t6) #Load word from that address. 

Voll Code:

addi $t0, $t0, 16 

    move $t1, $zero 
    move $t2, $zero 

    la $t3, A 
    la $t4, B 
    la $t5, C 

First: 
    bge $t1, $t0, Exit 
     Second: 
      bge $t2, $t0, Continue 

      ### 

      #Zero out counters first. 
      move $t6, $zero 
      move $t7, $zero 
      move $t8, $zero 
      move $t9, $zero 

      sllv $t6, $t0, $t1 #Row, shift 16 by current counter -> 32 -> 64.. 
      addu $t6, $t6, $t2 #Column, add column counter. 
      sll $t6, $t6, 2 #Shift entire count by word length. 
      addu $t6, $t6, $t3 #Add A base address. 
      lw $t7, ($t6) #Load word from that address. 

      sllv $t7, $t0, $t2 #Row, shift 16 by current counter -> 32 -> 64.. 
      addu $t7, $t7, $t1 #Column, add column counter. 
      sll $t7, $t7, 2 #Shift entire count by word length. 
      addu $t7, $t7, $t4 #Add B base address. 
      lw $t8, ($t7) #Load word from that address. 

      addu $t9, $t7, $t8 #add A and B results. 

      addu $t7, $t6, $t5 #add C base address, reuses $t7, copies $t6 from *A* array. 

      sw $t9, 0($t7) #store above result to C. 

      ### 

      addi $t2, $t2, 1 
     j Second 
    Continue: 
    addi $t1, $t1, 1 
    j First 
Exit: 

Ich bekomme einen schlechten Adressenfehler, aber ich kann nicht herausfinden, was falsch ist.

+1

hallo Kollegen CS2100 Mitschüler (die effektiv Reihe von 16 multipliziert) können sich ändern – davidchoo12

Antwort

1

Es gibt mindestens drei Fehler:

  • Sie $t6 überschreiben, die den Versatz von A und C mit der Basisadresse von A
  • haben, sollten Sie $t7 überschreiben, die den Inhalt von A halten sollte [i] [j] mit der Adresse B [j] [i]
  • Sie verrechnen den Zeilenoffset falsch. Stattdessen 16 Zeilenzeiten verschieben, sollten Sie die Zeile 4 mal verschieben

Sie

sllv $t6, $t0, $t1 #Row, shift 16 by current counter -> 32 -> 64.. 
    ... 
addu $t6, $t6, $t3 #Add A base address. 
lw $t7, ($t6) #Load word from that address. 
    ... 
sllv $t7, $t0, $t2 #Row, shift 16 by current counter -> 32 -> 64.. 
    ... 
addu $t9, $t7, $t8 #add A and B results 

mit

sll $t6, $t1, 4 # Row 
    ... 
addu $t7, $t6, $t3 #Add A base address. 
lw $t9, ($t7) #Load word from that address. 
    ... 
sll $t7, $t2, 4 # Row 
    ... 
addu $t9, $t9, $t8 #add A and B results. 
Verwandte Themen