2010-07-22 7 views
0

Je réécrire ma réponse (s) au projet des questions d'Euler dans l'assemblage MIPS, et je ne peux pas obtenir celui-ci à la sortie de la bonne réponse. Je suis allé sur le code de la dernière heure, et je ne peux pas comprendre ce qui ne va pas avec mon approche (que je reçois 33165 quand la réponse est un 200,00+ frais supérieur à celui), donc je figure le problème doit être mon tremblement avec la syntaxe. Y a-t-il quelque chose de stupide que je fais ici, comme utiliser un registre réservé?Algorithmique Problème dans MIPS

## p1.asm 
## 
## Andrew Levenson, 2010 
## Project Euler, Problem 1 
## In MIPS Assembly for SPIM 

## Calculate the sum, s, 
## of all natural numbers, n, 
## Such that n < 1000. 
     .text 
     .globl main 

main: 
     ori  $8, $0, 0x0  # Init sum s in $8 to 0 
     ori  $9, $0, 0x0  # Init variable number n in $9 to 0 
     ori  $10, $0, 0x3  
     ori  $11, $0, 0x5 
     la  $14, lim   


loop: 
retry: 
     addiu $9, $9, 0x1  # Increment n by 1 

    # Is n less than 1000? 
     sltiu $15, $9, 1000 # if n >= 1000 then jump to print 
     beq  $15, $0, print # if $15 == 0 

     sll  $0, $0, $0  # no op 


    # Is n a multiple of three or five? 
     div  $9, $10   # n/3 
     mflo $12    # $12 = floor(n/3) 
     mfhi $13    # $13 = n mod 3 

     bne  $13, $0, retry # if n mod 3 != 0 then retry 
     sll  $0, $0, $0  # no op 
     beq  $13, $0, sum # else, print 
     sll  $0, $0, $0  # no op 

     div  $9, $11   # n/5 
     mflo $12    # $12 = floor(n/5) 
     mfhi $13    # $13 = n mod 5 

     bne  $13, $0, retry # if n mod 5 != 0 then retry 
     sll  $0, $0, $0  # no op 

    # If we've made it this far, n is good! 
sum: 
     addu $8, $8, $9  # s = s + n 

     j  loop   # jump to loop 
     sll  $0, $0, $0  # no op 


print: 
     li  $v0, 1   # system call #1 - print int 
     move $a0, $8 
     syscall     # execute 

exit: 
     li  $v0, 0xA  # system call #10 - exit 
     syscall 



## End of Program 

## Variable declarations  
       .data 
lim:   .word 1000 # loop bound 

EDIT: code modifié depuis leur publication. Corrections faites suggéré, mais il donne encore une réponse d'environ 100.000. :(

+0

Pourquoi vous ne en utilisant le registre noms au lieu de numéros de registre? $ a0, $ a1, $ t0, etc. – Tom

+0

Je me suis un petit programme comme celui-ci, qu'il n'a pas été nécessaire. – Andy

Répondre

1

Par incrémenter 9 $ par 3 à chaque boucle, vous manquez beaucoup de multiples 5, en commençant par 5 ...

MISE À JOUR: par branchement lorsque $9 est divisible par 3, puis par 5 , vous ne garder que les multiples de 3 et 5.

MISE À JOUR: vous devez supprimer la ligne suivante:

bne  $13, $0, retry # if n mod 3 != 0 then retry 
+0

Wow ... Je ne peux pas croire que j'ai raté, merci. Malheureusement, il ne donne toujours pas la bonne réponse. – Andy

+0

J'ai fait les corrections que vous avez soulevées et fait un autre changement ou deux (je pense? Il est assez tard ici), mais maintenant il est Cédant 166833 qui est encore hors d'environ 100K. Le code est mis à jour pour la dernière fois ce soir, mais je pense que je dois me traîner au lit. Merci d'avoir cherché mes erreurs de débutant. :) – Andy