2012-04-06 10 views
0

Ich versuche, Arrays in MIPS zu verstehen. Ich weiß, dass Sie den Stapelzeiger entweder um ein Wort vor oder zurück (in Schritten von 4) verschieben müssen. Aber ich weiß nicht, wie ich diese Idee in MIPS-Code umsetzen soll.Brauchen Sie Hilfe beim Implementieren eines Arrays in MIPS

j = 0 
x = a[j+k] 
a[j+k] = a[j] 

Was weiß ich sicher ist, 0 in ein Register zu laden (j = 0), dann denke ich, du Wort, um die Basisadresse $ a0 geladen wird und ein [j], dann fügen Sie k, um es vor sw diesen Wert in 0 ($ a0).

li $t0, 0  
lw $t0 0($a0) 
add $t0, $t0, $a2 
sw $t0, ($a0) 

Wir wurden zugewiesen, um diesen Code in MIPS zu konvertieren, und der vorherige war der erste Teil davon.

# Register usage 
# $a0 = base address of array 
# $a1 = n, size of array 
# $a2 = k, the shift amount 

# j = 0 
# x = a[j+k] 
# a[j+k] = a[j] 
# repeat n-1 times 
# j = (j+k) mod n 
# m = (j+k) mod n 
# y = a[m] 
# a[m] = x 
# x = y 
# end repeat 

Meine Frage ist, wie kann ich tun, um die n-1 mal Schleife in MIPS? Ist es eine Bedingung dann nur

subi $a1 $a1 

Und schließlich, wie man den Umb. findet? Ich glaube, es ist mit Div und dann das $ HI. Das habe ich bisher.

add $t1, $t0, $a2 #j+k 
div $t1, $a1   #divide (j+k) by n 
mfhi $t2    #move rem into t2 
move $t2, $t0  #j = (j+k) mod n 

add $t1, $t0, $a2 #j+k 
div $t1, $a1   #divide (j+k) by n 
mfhi $t2    #move rem into t2 
move $t2, $t0  #m = (j+k) mod n 

sw $t0, 0($t0) 
lw $t3, 0($t0) 

Ich bin verwirrend ich glaube. Aufklärung wäre erwünscht.

Antwort

1
li $t3, 0  #j = 0 
lw $t3, 0($a0)  #load the value of @a0 in to j 
add $t3, $t3, $a2 # j = j+k 
sw $t3, 4($a0)  # store the new value of j in to $a0 

loop: 
beq $a1, $zero, return 
sub $a1, $a1, 1  #n = n-1 
add $t4, $t3, $a2 #j+k 
div $t4, $a1   #divide (j+k) by n 
mfhi $t5   

move $t5, $t3  #j = (j+k) mod n 


add $t4, $t3, $a2 #j+k 
div $t4, $a1   #divide (j+k) by n 
mfhi $t5    #move rem into t2 
move $t5, $t3  #m = (j+k) mod n 
b loop 

return: 
sw $t3, 4($a0) 
jr $ra 
lw $t3, 0($a0) 

Ich sah Ihren Code hier und nach ein wenig Basteln. Ich hatte das Programm ausgeführt, aber die Ausgaben waren falsch und ich sah einen Fehler, den ich mit der Bedingung gemacht habe, und nachdem ich es repariert habe, gibt das Programm keinen Ausgang mehr zurück. Ich habe die Register geändert.

Verwandte Themen