Question

Je suis en train de convertir des nombres décimaux Entassés dans des chaînes de ascii. Voici ma compréhension à ce jour:

Ce qui suit:

bcd BYTE 34h

Si la conversion au 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 comme suit ...

0011 0100 

Maintenant, si j'ai mon impression de procédure sur chaque valeur binaire 4bit à un moment, il doit imprimer la chaîne ascii des nombres, correct? Donc, si je passe par une boucle, prenez le premier 4 bit nombre binaire, imprimer sa valeur réelle sur, sa va imprimer 3 .. puis faire la même chose, sa va imprimer 4.

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

Prenez une valeur 8bit "34h", mov dans AH et AL. Dans AH, effacer la deuxième moitié des bits à l'aide de la suivante:

and ah, 11110000b

et en AL, effacer le premier moitié des bits à l'aide de ce qui suit:

and al, 00001111b

AH = 0110b ou 3 Et AL = 0100b ou 4, puis imprimer ce en conséquence ..

Est-ce une bonne approche? Ou suis-je au sujet de complètement incorrect ou chemin sur le penser?

EDIT: Voici ma solution finale à la valeur originale 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

Était-ce utile?

La solution

BCD ne utilise que les chiffres 0 thru 9.
Un chiffre décompacté BCD utilise le quartet inférieur d'un octet entier et pour le convertir en ASCII vous ajoutez 48.
Le nombre est 34h 52 décimal et sera représenté comme un BCD déballées 00000101 et 00000010
(Changé pour éviter toute confusion lors de l'utilisation intégrée des instructions) Quand il est emballé: 01010010 == BCD emballé 52

Pour décompresser, vous pouvez faire comme vous l'avez fait, mais vous devez changer AH droit de placer la valeur dans le lo-grignotage. Pour convertir en ASCII il suffit d'ajouter 48.

[modifier]

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

Lorsque vous enregistrez un numéro comme BCD, octet le moins significatif est au plus bas adresse à 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. Si vous voulez ADD, MUL, DIV, SUB vous devez présenter les valeurs requises par les présentes instructions. Rappelez-vous aussi ajouter zéro octets début et la fin de vos chiffres à la main porte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top