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
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. –
@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