Comment faire pour convertir à partir de 4 bits en hexadécimal ASCII de 7 bits?

La mission est d'apprendre de l'assemblée de la programmation par l'écriture d'un sous-programme qui peut convertir entre les 4 bits en hexadécimal et ASCII 7 bits. Au début, je n'avais aucune idée, mais après quelques recherches j'ai pu faire et de l'effort et de dessiner un organigramme et d'en faire un programme mais il n'est pas tout à fait correct c'est pourquoi je sollicite vos conseils pour m'aider à résoudre ce problème.

L'attribution texte, le voici:

HA 3.1. Dessiner un organigramme pour une sous-routine pour convertir un 4 bits
la valeur hexadécimale correspondant à l'7-bit ASCII-code. Voir l'intégralité de l'
spécification pour hexasc ci-dessous. Exemple: binaire 0010 (hexadécimal
chiffre 2) est converti 011 0010 (ASCII-code '2'). Un autre
exemple: binaire 1011 (chiffre hexadécimal B) est convertie à 100 0010
(ASCII-code 'B') assurez-vous que votre sous-routine est documenté
en fonction de nos exigences.

HA 3.2. À l'aide de la labwork projet dans le Nios II IDE, créer un nouveau
fichier appelé hexasc.s

HA 3.3. Dans le fichier hexasc.s, écrire un sous-programme appelé hexasc, que
convertit un 4 bits, la valeur hexadécimale correspondant à 7 bits
ASCII-code.

J'ai dessiné un diagramme de flux pour le programme:
Comment faire pour convertir à partir de 4 bits en hexadécimal ASCII de 7 bits?

Et le programme que j'ai essayé est ce mais je soupçonne qu'il n'est pas conforme aux spécifications:

        .global main 

        .text
        .align 2

main:   movi r8, 0x09
        movi r9, 0x0f

        andi r4, r4, 0x0f

        bgt r8, r4, L1  

        movi r2, 0x1e
        add r2, r2, r4  
        andi r2, r2, 0xff

        movia   r2,putchar
        br  L2  

L1:     movi r2, 0x29   
        add r2, r2, r4
        andi r2, r2, 0xff

        movia   r2,putchar

L2:  .end 

Pouvez-vous m'aider à développer et à résoudre cette mission? Il ya beaucoup de temps, il n'est pas en raison jusqu'à un mois.

Mise à jour

Après avoir vu ici dans un commentaire que l'organigramme a été incorrect, j'ai fait les ajustements nécessaires:
Comment faire pour convertir à partir de 4 bits en hexadécimal ASCII de 7 bits?

Je tiens aussi à discuter de la façon dont cet algorithme est correct qui convertit entre le format hexadécimal et ASCII.

Mise à jour /modifier

Voici le programme complet.

.global hexasc 

        .text
        .align 2

hexasc: movi r8, 0x09
        movi r9, 0x0f
        andi r4, r4, 0x0f #keep only 4 bits
        bgt r4, r8, L1  #is x>9?
        movi r2, 0x30
        add r2, r2, r4  
        andi r2, r2, 0xff
        ret  

L1:     movi r2, 0x37
        add r2, r2, r4
        andi r2, r2, 0xff
        ret
Le schéma est numériquement incorrect. ASCII(x) = x + 30H(48d) si 0<=x<=9 ou x + 37H(55d) sinon (10<=x<=15).
Je suis sûr que vous êtes censé masque et de ne garder que les quatre derniers bits, pas d'octets. Votre code ne fait que correctement.
Ce n'est pas clair dans a=h+((h>9)?55:49)? C'est ce que le corrigé schéma décrit maintenant, à l'exception de la formule doit avoir 48 et pas 49.
Je ne sais pas ce que l'assembleur que vous utilisez, mais il ne peut certainement travailler avec les chaînes de caractères au lieu de seulement des chiffres. Pour convertir 5 ASCII, vous venez d'ajouter 5 au caractère '0'. Laissez l'assembleur faire le travail d'évaluation que '0' est 30H et 30H + 5 est de 35H, qui est le caractère ASCII '5'. Si vous le faites de cette façon, votre code est auto-documenter au lieu de jonché avec des numéros de magie.
De la myriade de comment puis-je convertir décimal, binaire, hexadécimal, ascii questions que nous avons vu lors de. Celui-ci est la peine de répondre parce que vous avez tenté de le faire, de la pensée à travers elle, de comprendre le nombre de systèmes et de représentations en bits, juste eu un subtil mathématiques erreur.

OriginalL'auteur Niklas Rosencrantz | 2012-08-21