2010-10-12 10 views
-1

J'écris un simple extrait de code pour une affectation et j'ai besoin de convertir un nombre décimal en binaire, octal et hexadécimal. Je l'ai fonctionné, mais j'ai réalisé par la suite qu'à cause de l'algorithme que j'utilise, j'imprime le nombre binaire en arrière. La stratégie que j'utilisais consistait à imprimer un chiffre à la fois. Je suis toujours un débutant donc j'ai pensé que ce serait un moyen facile d'éviter plus de problèmes intermédiaires. Malheureusement, je n'ai pas tout compris.Conversion de décimal en binaire et impression dans MIPS

binary: la  $a0, bType       #binary function selected, notify user 
      li  $v0, 4        #print notification 
      syscall 
      la  $a0, in_val       #ask user for input decimal number 
      li  $v0, 4        #print 
      syscall 
      li  $v0, 5        #syscall read int 
      syscall 
      move  $t0, $v0        #save input value to $t0 
      li  $t1, 2        #load 2 into $t1 to divide by 2 
      li  $v0, 4 
      la  $a0, bRes        
      syscall           #print result tag 
binLoop: divu  $t0, $t1        #LO = $t0/2, HI = $t0 % 2 
      mfhi  $t2         #$t2 = HI (remainder) 
      mflo  $t0         #$t0 = $t0/2 (quotient) 
      move  $a0, $t2        #store digit to print 
      li  $v0, 1        #Print digit 
      syscall 
      bgtz  $t0, binLoop       #if input != 0, keep dividing 
      j   main 

Est-il possible que je peux peut-être stocker chaque chiffre dans une chaîne avec une étiquette et concaténer chaque chiffre à la suite, puis lire la chaîne en arrière ou quelque chose? Peut-être que vous pourriez me suggérer une meilleure suggestion. Il suffit de noter que le code fonctionne à ce stade en imprimant un seul chiffre binaire à la fois, mais dans l'ordre inverse que nous le voulons. Le programme est supposé être capable de gérer de gros nombres (comme 20 chiffres binaires), donc je ne peux pas stocker chaque chiffre dans son propre registre. Merci a tous!

+0

N'est-il une sorte de pile? – ruslik

Répondre

0

Vous pouvez stocker les valeurs calculées en mémoire, puis les lire au verso pour les imprimer. Utilisez un registre de réserve pour conserver le décalage des chiffres dans le tampon (pour imprimer), disons $ a1, et supposons que vous allez stocker les chiffres commençant à l'adresse mémoire 0x1000. Ensuite, au lieu de faire le syscall pour imprimer le chiffre, magasin juste avec quelque chose comme ceci:

sw $t2, 0x1000($a1) 
addiu $a1, $a1, 4 

Maintenant, lorsque vous avez terminé le traitement des données d'entrée, vous pouvez traverser dans l'ordre inverse du vecteur que vous avez fait et imprimer chaque chiffre:

addiu $a1, $a1, -4 
lw $t2, 0x1000($a1) 
# Now your code to print the digit 

Vous auriez à boucle jusqu'à ce que a1 $ atteint 0