2010-11-09 2 views
4

Je suis en train de convertir des nombres décimaux condensés en chaînes ascii. Voici ma compréhension jusqu'ici:assemblé decimal à ascii assembly

qui suit:

bcd BYTE 34h 

devez convertir le nombre décimal 34 après avoir été « décompressé ». Maintenant, je ne suis pas sûr de la meilleure façon de le faire. Si je convertir ce nombre hexadécimal en binaire, il est la suivante ...

0011 0100 

Maintenant, si j'ai ma procédure imprimer chaque valeur binaire 4bit à un moment, il doit imprimer la chaîne ascii des nombres, correct ? Donc, si je passe par une boucle, saisissez le premier nombre binaire à 4 bits, imprimez sa valeur réelle, elle va imprimer 3 .. alors faites la même chose, elle va imprimer 4.

Alors, voici mon général idée:

Prenez une valeur de 8 bits "34h", déplacez-le dans AH et AL. Dans AH, effacer la deuxième moitié des bits en utilisant la suivante:

and ah, 11110000b 

et AL, effacer la première moitié des bits en utilisant ce qui suit:

and al, 00001111b 

Donc AH = 0110b ou 3 Et AL = 0100b ou 4, puis imprimez-les en conséquence ..

Est-ce une bonne approche? Ou est-ce que je vais à peu près tout à fait incorrect ou bien en train de le penser?

EDIT: Voici ma solution finale avec la valeur d'origine de 12345678h. Merci à tous ceux qui ont aidé!

;----------------------------------------------------------------------------- 
PackedToAsc PROC USES eax ebx edx ecx esi 
; This function displays a packed decimal value in its "ascii" form 
; i.e. 12345678h would display decimal, 12345678 in decimal form 
; 
; Requires ECX = SIZEOF packed decimal 
;   ESI to be pointing to the packed decimal 
;----------------------------------------------------------------------------- 
mov edx, [esi]    ; temp store our offset 
mov eax, 0     ; clear eax 
mov ebx, 0     ; clear ebx 

L1: rol edx, 8    ; rotate left 8 bits to avoid little endian 
    mov [esi], edx   ; mov our temp back to the actual value 

    mov al, BYTE PTR [esi] ; al = 12h 0001 0010 
    mov bl, BYTE PTR [esi] ; bl = 12h 0001 0010 
    shr al, 4    ; al = 0000 0001 
    and bl, 00001111b;  ; bl = 0000 0010 
    add al, 48    ; convert to ascii 
    call WriteChar   ; display al 
    mov al, bl 
    add al, 48    ; convert to ascii 
    call WriteChar   ; display bl 
    loop L1 

    call Crlf 
ret 
PackedToAsc END 

P

+1

L'approche semble correcte. Il n'y a pas beaucoup d'options à portée de main quand il s'agit de code au niveau de l'assemblage. –

+0

@Gunner: Non, ce n'est pas le cas. Ce qu'il fait, c'est manipuler les chiffres, et non emballer et déballer des décimaux codés binaires. – slashmais

Répondre

2

BCD utilise uniquement les chiffres 0 à travers 9.
Un décompressé chiffre BCD utilise le quartet inférieur d'un octet entier et pour le convertir en ASCII vous ajoutez 48.
Le nombre 34h est 52 décimal et sera représenté comme décompressé BCD 00000101 et 00000010
(changé pour éviter toute confusion lors de l'utilisation des instructions incorporées) quand il est emballé: 01010010 == BCD 52

emballés

pour UNPAC k, vous pouvez faire comme vous avez fait, mais vous devez déplacer AH à droite pour placer la valeur dans le lo-grignoter. Pour convertir en ASCII 48. Il suffit d'ajouter

[modifier]

MASM (=> toutes les instructions, Linux inclus) qui fonctionne sur les processeurs 80x86 utilise le schéma petit-boutiste. Les processeurs tels que Motorola 68000 (Apple Mac) et RISC utilisent big-endian.

Lorsque vous enregistrez un numéro comme BCD, octet le moins significatif est à l'adresse plus bas à travers la plus importante au plus haut, par exemple:

my_unpacked_bcd DB 4,3,2,1 ; this is the decimal number 1234 
my_packed_bcd DW 3412h ; this defines the same number as packed 

Emballé BCD dépend de ce que vous voulez faire avec il. Si vous voulez ADD, MUL, DIV, SUB, vous devez présenter les valeurs requises par ces instructions. Souvenez-vous également d'ajouter des octets de zéro au début et à la fin de vos chiffres pour contenir des reports.

+0

Ok, c'est logique, mais maintenant je viens à un petit problème endian. Dites que j'ai le décimal emballé .. bcd BYTE 12345678h si je fais quelque chose comme ça ... mov al, BYTE PTR bcd, je reçois le numéro 78 pour commencer, une suggestion pour éviter cela? –

+0

@Dalton Conley: J'ai mis à jour ma réponse pour vous donner plus de pointeurs – slashmais

+1

Pour little-endian, le BCD emballé 12345678h sera 78563412 lorsqu'il sera déballé si vous suivez les méthodes conventionnelles. Si vous voulez juste réduire l'empreinte mémoire d'un nombre en le stockant comme un BCD compressé, votre approche est OK, mais vous devez vous rappeler d'ajuster vos valeurs lorsque vous voulez les utiliser. – slashmais