ensamblaje de decimal empacado a ASCII
Pregunta
Estoy tratando de convertir números decimales empacados en cadenas ASCII. Aquí está mi comprensión hasta ahora:
El seguimiento:
bcd BYTE 34h
Debe convertirse al decimal número 34 después de ser "desempaquetado". Ahora no estoy seguro de la mejor manera de hacer esto. Si convierto este número hexadecimal en binario, es el siguiente ...
0011 0100
Ahora, si tengo mi procedimiento, imprima cada valor binario de 4 bits a la vez, entonces debería imprimir la cadena de números ASCII, ¿correcto? Entonces, si paso por un bucle, tome el primer número binario de 4 bits, imprima su valor real, va a imprimir 3 ... luego haz lo mismo, va a imprimir 4.
Entonces, aquí está mi idea general:
Tome un valor de 8 bits "34H", mueva a Ah y Al. En AH, borre la segunda mitad de los bits usando lo siguiente:
and ah, 11110000b
Y en AL, borre la primera mitad de los bits usando los siguientes:
and al, 00001111b
Entonces ah = 0110b o 3 y AL = 0100b o 4, luego imprima estos en consecuencia.
¿Es este un buen enfoque? ¿O me voy completamente completamente incorrecto o que lo piensa?
EDITAR: Aquí está mi solución final con un valor original de 12345678H. ¡Gracias a todos los que ayudaron!
;-----------------------------------------------------------------------------
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
PAGS
Solución
BCD usa solo los dígitos 0 a 9.
Un dígito BCD desempaquetado usa el mordisco inferior de un byte completo y para convertirlo en ASCII agregue 48.
El número 34H es de 52 decimales y se representará como un BCD desempaquetado como 00000101 y 00000010
(Cambiado para evitar confusiones al usar instrucciones incorporadas) cuando está empaquetado: 01010010 == BCD empaquetado 52
Para desempaquetarlo, puede hacer lo que ha hecho, pero debe cambiar el derecho a colocar el valor en el LO-Nibble. Para convertir a ASCII simplemente agregue 48.
editar
MASM (=> Todas las instrucciones, Linux incluidos) que se ejecuta en procesadores 80x86 usa el esquema de Little Endian. Las CPU como Motorola 68000 (Apple Mac) y RISC usan Big-Endian.
Cuando almacena un número como BCD, el byte menos significativo está en la dirección más baja a través del más significativo en el más alto, por ejemplo, por ejemplo:
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
BCD empaquetado depende de lo que quiera hacer con él. Si quieres ADD, MUL, DIV, SUB
Debe presentar los valores según lo requerido por estas instrucciones. También recuerde agregar cero-bytes para comenzar y finalizar sus dígitos para mantener los acarreos.