décimal condensé à l'assemblage ascii
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
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.