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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top