2009-04-08 9 views
0

Je travaille sur du code MIPS pour mon cours sur les Organisations Informatiques, et bien je n'arrive pas à faire fonctionner MIPS correctement et il n'y a pas beaucoup de ressources MIPS en ligne. Je cours le code sur PCSPIM. Le code est censé ajouter 10 au contenu de array2 et les stocker dans array1, puis imprimer le tableau 1. Retravaillé le code fonctionne correctement maintenant.Code MIPS cassé

.text 
main: 
    la $t0, array1 
    la $t1, array2 
    la $s0, valuec 
    li $s2, 6 
    add $t6, $zero, 1 #i = 1 

Loop: 
    addi $t6, $t6, 1 #i++ 

    lw $t2, ($t0) 
    lw $t5, ($t1) 
    lw $s1, ($s0) 
    addu $t2, $t5, $s1 
    sw $t2, ($t0) 
    add $t0, $t0, 4 
    add $t1, $t1, 4 
    li $v0, 1 
    move $a0, $t2 
    syscall 
    blt $t6, $s2, Loop 

    li $v0, 10 
    syscall 
.data 
    array1: .space 20 
    array2: .word 1,2,3,5,9 
    valuec: .word 10 

imprime PCSPIM 0 5 fois et retourne Exception 7 [Bad Données] est survenue et ignora

Répondre

2

Ceci est un devoir, donc je vais seulement vous donner des indices pour le moment et y ajouter au fur et à mesure. Un couple de choses:

1/Vous devez nous dire ce que c'est supposé à faire. C'est la chose la plus importante. 2/Vous stockez l'adresse array1 dans t0, puis réutilisez t0 dans la première boucle.

3/Vous semblez être confus au sujet des adresses et du contenu de ces adresses ("la $s0, valuec" et "addu $t0, $t1, $s0").

MISE À JOUR:

En fait, je dois signer pendant un certain temps, donc je posterai ma solution afin de ne pas vous laisser dans l'embardée. La confusion que j'ai mentionnée précédemment était le fait que vous chargiez deux adresses dans $ t1 et $ s0, puis les additionnait pour obtenir une autre adresse - ceci est probablement bien au-delà de votre zone de données (vous devriez vraiment ajouter une adresse et un offset).

C'est essentiellement le problème que vous avez avec votre code (à la fois les zéros en cours d'impression et le crash). Votre meilleur pari serait de résoudre ce problème et de se référer à mon code ci-dessous seulement en dernier recours pour voir comment je l'aurais fait. Copier le code ne vous aidera pas à long terme et il serait sage de supposer que votre éducateur vérifie également tous les sites Web pour le plagiat.

Ceci est le code que j'ai trouvé (rapidement, vous aurez donc besoin de le tester - il peut y avoir des bogues). Je vous suggère de lire les commentaires dans grand détail pour comprendre ce qu'il fait.

Je reviens dans quelques heures pour voir comment vous allez. À votre santé.

.text 
main: 

# Initialization of array pointers and loop 

    la  $t0, array1  # address of array 1 
    la  $t1, array2  # address of array 2 
    li  $t2, 1   # element number 
    li  $t3, 6   # upper limit of elements 

# Process each word in array 2, adding 10 and placing 
# into array 1. 

Loop: 
    lw  $t3, 0($t1)  # get word from array 2 
    addi $t3, $t3, 10  # add 10 to word 
    sw  $t3, 0($t0)  # store word into array 1 
    addi $t0, $t0, 4  # move to next entry in array 1 and 2 
    addi $t1, $t1, 4 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

# Initialize printing loop by going back to start of array 1 

    la  $t0, array1  # address of array 1 
    li  $t2, 1   # element number 

# Loop through array 1, printing each element. 

pLoop: 
    lw  $t2, 0($t0)  # get word from array 1 
    li  $v0, 1   # 'print' command code 
    move $a0, $t2   # needs value in $a0 
    syscall     # print it 
    addi $t0, $t0, 4  # move to next entry in array 1 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

    li  $v0, 10   # 'terminate' command code 
    syscall     # exit 

# Data arrays for array 1 and 2 

.data 
array1: .word 0,0,0,0,0 
array2: .word 1,2,3,4,5 
-1

Il y a un certain nombre de questions possibles, mais la plus évidente/est probable que vous ne remettons pas de la principale avant le début de votre section de données.

jr ra 
+0

Je pense que cela est géré par le dernier appel système avec le code de commande $ v0 défini sur 10. – paxdiablo

Questions connexes