2009-04-29 16 views
2

Je suis en train d'écrire un programme MiPS qui examinera une liste de 15 résultats. Et il va entrer du terminal. Le critère de réussite est le score de 50. Les sorties au terminal incluront les scores dans chaque catégorie et le nombre d'étudiants qui réussissent et échouent. Je devrais utiliser les invites d'entrée et l'instruction de sortie. S'il vous plaît j'ai besoin d'aide, juste besoin de conseils sur la façon de le faire.Programme MIPS pour déterminer la réussite ou l'échec des tests

main: 
li $t1,15   #load 15 into $t1 

la $a1,array  #load a pointer to array into $a1 

J'ai une boucle:

addi $t1,$t1,-1 

li $v0,4 

la $a0,prompt 

syscall 
+3

Quelle partie vous rencontrez des problèmes avec? On dirait que vous avez déjà commencé, alors c'est bien. Cette boucle répète-t-elle vraiment? Je commencerais par ça. Savez-vous comment lire les entrées du clavier? C'est une bonne prochaine étape. Savez-vous comment stocker une valeur dans un tableau? Savez-vous comment comparer une valeur avec une autre? –

+0

Rappelez-vous également que vous ou vos parents PAYEZ pour que votre instructeur vous aide, alors vous voudrez peut-être profiter de ce privilège; Votre instructeur sait exactement à quoi la bonne réponse est censée ressembler et pourrait vous y guider plus directement que les gens ici. –

Répondre

2

Je ne voulez le donner, jeter quelques lignes directrices afin je vais. Vous devez lire Assemblers, linkers and the Spim simulator. C'est beaucoup d'aide.

Alors voilà.

Créez deux tableaux de 15 mots.

.data 
fail_vector: .word -1,-1,-1 ... #15 invalid words 
passed_vector: .word -1,-1,-1 ... #15 invalid words 

Charger sur certains registre la variable de contrôle de boucle.

li $t1,15 
beq $t1,$zero,END 
addiu $t1,$t1,-1 

maintenant dans cette boucle lire les valeurs

syscall...  #SYS_READ 

lire cette valeur (supposons que vous avez dans le registre t4) et décider de stocker dans l'échec vecteur, ou passer vecteur.

 addiu t4,t4,-50  #subtract 50 from input value. 
    blez t4,FAILED  #If its lower than 0, then read value is lower than 50 ->FAIL 
PASSED: 
    #STORE VALUE INTO passed_vector 

FAILED: 
    #STORE VALUE INTO failed_vector 

Lorsque vous avez terminé avec les 15 valeurs, imprimez les vecteurs. C'est un peu compliqué. Avant d'utiliser votre programme, vous devez remplir les deux vecteurs avec une valeur non valide, comme -1. Ainsi, lorsque vous imprimez un vecteur à l'écran, vous devez arrêter lorsque vous trouvez l'une de ces valeurs non valides. Et pendant que vous y êtes, gardez un compteur pour montrer combien ont réussi/échoué.

En pseudo-code

for both arrays 
    for (i in (0,15) and array[i] not -1) 
     print array[i] 
     add 1 to scores count //to count passed - failed test scores. 
Assemblée

(remplir les espaces vides)

END: 
    li $t4,15 
    li $t1,0 
    beq $t1,$t4,EXIT #condition. While (i < 15) kind of thing. 
    addiu $t1,$t1,-1 

    #print out vectors and keep count on other registers 
    #then print them out. 

    syscall... #SYS_WRITE 

EXIT: #exit syscall here. 

Une autre question délicate est l'indexation de ces vecteurs. Puisqu'ils sont des tableaux de mots, alors vous devez multiplier par 4 (en supposant des mots de 32 bits) la variable de contrôle de boucle (variable classique i en C) pour indexer le vecteur. Si elles étaient des tableaux d'octets, alors aucune multiplication ne serait nécessaire. Et si elles étaient des tableaux courts ...(Bien, vous obtenez mon point)

Par exemple:

passed_vector[i] #(C style sintax) 

et laissez variable i être enregistrée dans le registre $ t1 tournerait comme:

sll $t2,$t1,2    #i * sizeof(word) 
    la $a0,passed_vector  #$a0 points to passed_vector 
    add $a0,$a0,$t2   #$a0 now points to passed_vector + i 

Alors maintenant, vous pouvez charger/store to passed_vector [i]

sw $t3,0($a0)   #0($a0) is passed_vector[0] 
    lw $t3,0($a0) 

Une façon de résoudre ce genre de choses (c'est-à-dire ting in assembly) est d'écrire le programme en C (ou une autre langue que vous connaissez), puis de le traduire en assembly, instruction par instruction.

+0

Je suis confus, mais si je donnais un programme C, seriez-vous en mesure de me le traduire dans le programme MIP? –

+0

@chicagoman. Bien sûr. Vous pourriez aussi bien. http://gavare.se/gxemul/ – Tom

1

Ok, voici comment charger les deux tableaux d'entiers (et seulement)

.data 
#These are two integer arrays. Each position is 32 bits long. 
passed_vector: .word -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 
failed_vector: .word -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 

.text 

     # 
     # Previous code here. 
     # 

     li $t5,50    #For comparing test_scores against. 

     li $t0,0    # for (0..15) 
     li $t6,15    # 

LOOP: beq $t0,$t6,CONTINUE # loops while i<15 


     li $v0,5 
     syscall  
     move $t1,$v0   #read test score and move it to register $t1 

     bge $t1,$t5,PASSED #if score >=50, load into passed_vector 
FAILED:      # else: test score lower than 50. Loads into failed vector 

     #dont forget to increment the failed counter here 
     sll $t2,$t0,2   
     sw $t1,failed_vector($t2) 

     addiu $t0,$t0,1  #i++ 
     b  LOOP 

PASSED: 

     #dont forget to increment the passed counter here. 
     sll $t2,$t0,2   
     sw $t1,passed_vector($t2) 

     addiu $t0,$t0,1  #i++ 
     b  LOOP 

CONTINUE: #other code