Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le document
Retour à la liste

La conversion décimale

On peut être amené à devoir afficher de grands nombres entiers en décimal, comme les tailles de fichiers en octets. Il existe bien sûr des routines utilisant des algorithmes de division avec reste ou passant par des boucles de soustractions, avec des tables, etc... Voici une proposition parmi tant d'autres (le nombre sur 24 bits est passé par B et X):

  TBASE  EQU    4              Taille pour buffer base/résultat
  * Module de conversion binaire/décimal pour 24 bits
  CNVDEC PSHS   A,B,X,Y,U       |
         LDX    #BASE          |
         LDA    #TBASE*2       | Efface les buffers
  CNVDC0 CLR    ,X+            | pour la base
         DECA                  | et le résultat
         BNE    CNVDC0         |
         INC    -TBASE-1,X     Initialise la base à 1
         LDY    #24            24 bits à tester
  CNVDC1 LSR    1,S             |
         ROR    2,S             | Décale le nombre binaire
         ROR    3,S             |
         BCC    CNVDC2         | Si bit à 1,
         LDU    #RESULT+TBASE  | ajoute la
         BSR    AJOUT          | base au résultat
  CNVDC2 LDU    #BASE+TBASE     | Multiplie la base par 2
         BSR    AJOUT           | (ajoute la base à la base)
         LEAY   -1,Y           | Bit
         BNE    CNVDC1         | suivant
         PULS   A,B,X,Y,U,PC    |
  * Ajoute la base au buffer pointé par U
  AJOUT  LDX    #BASE+TBASE    Pointeur sur la base
         LDB    #TBASE         Taille du buffer
         CLRA                  C de CC à 0
  AJOU0  LDA    ,-U            Charge le nombre
         ADCA   ,-X            Ajoute la base + la retenue
         DAA                   Ajustement décimal
         STA    ,U             Ecrit le nombre
         DECB                  | Octet
         BNE    AJOU0          | suivant
         RTS                    |
  BASE   RMB    TBASE          Buffer pour la base
  RESULT RMB    TBASE          Buffer pour le résultat

Ce programme décale bit par bit le nombre binaire à décomposer. S’il trouve un bit à 1, il ajoute la base initialisée à 1 au résultat. A chaque décalage, il multiplie la base par 2, qui passe alors à 2, 4, 8, 16, 32, etc... Une fois le nombre binaire entièrement décomposé, il ne reste plus qu'à afficher le nombre décimal avec un programme ayant pour fonction d'afficher plutôt de l'hexadécimal, puisque chaque chiffre du nombre converti est traduit sur un quartet par l'ajustement décimal. Le programme suivant affiche tous les chiffres du nombre, les 0 préalables y compris:

  * Affiche un nombre hexadécimal à plusieurs octets
  * ou affiche un nombre décimal ajusté
  AFFDEC LDU    #RESULT        Pointeur sur buffer à afficher
         LDX    #TBASE         Nombre d'octets à traiter
  AFFDE0 LDB    ,U+            Récupère un octet
         BSR    HEX            Affiche les deux quartets
         LEAX   -1,X           | Octet
         BNE    AFFDE0         | suivant
         RTS                    |
  * Décomposition par quartet d'un octet sous forme ASCII numérique
  HEX    PSHS   B               |
         LDA    #$10           | Dizaine
         MUL                   | dans A
         PULS   B               |
         ANDB   #$0F           Isole les unités
         BSR    HEX0           Affiche la dizaine
  HEX0   EXG    A,B            Valeur dans B pour affichage
         ADDB   #’0            Ajuste le chiffre
         JMP    $E803          Affiche caractère

L'avantage de ce programme de conversion binaire/décimal est qu'il ne nécessite pas beaucoup de mémoire et permet néanmoins de décomposer de très grands nombres.

Si vous fixez la taille des buffers (TBASE) à 10, que vous utilisez les registres A, B, X, Y et U pour passer votre nombre à 64 bits et que vous insérez cette partie de programme:

         ...
         LDY    #64            64 bits à tester
  CNVDC1 LSR    ,S              |
         ROR    1,S             |
         ROR    2,S             |
         ROR    3,S             | Décale le
         ROR    4,S             | nombre binaire
         ROR    5,S             |
         ROR    6,S             |
         ROR    7,S             |
         BCC    CNVDC2         | Si bit à 1, etc...
         ...

...vous pourrez afficher des nombres décimaux allant jusqu'à 18446744073709551615, plus que ne saurait faire votre calculatrice de poche!

Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret