Domanda

Sto cercando di convertire i numeri decimali imballati in stringhe ASCII. Qui è la mia comprensione finora:

Il seguente:

bcd BYTE 34h

In caso di convertire il numero decimale 34 dopo essere stato "spacchettato". Ora io non sono sicuro sul modo migliore di fare questo. Se converto questo numero esadecimale a binario è come segue ...

0011 0100 

Ora, se ho la mia procedura di stampa fuori ogni valore binario 4bit alla volta, allora dovrebbe stampare la stringa ascii di numeri, giusto? Quindi, se vado attraverso un ciclo, afferrare il primo a 4 bit numero binario, stampare il suo valore reale fuori, la sua intenzione di stampare 3 .. poi fare lo stesso, la sua intenzione di stampare 4.

Quindi, ecco la mia idea generale:

Prendere un valore 8bit "34h", mov in AH e AL. In AH, deselezionare la seconda metà dei bit utilizzando seguito:

and ah, 11110000b

e in AL, deselezionare la prima metà dei bit utilizzando la seguente:

and al, 00001111b

Quindi, AH = 0110b o 3 E AL = 0100b o 4, quindi stampare questi fuori di conseguenza ..

E 'questo un approccio buono? O sto andando su tutto errata o senso sopra pensando che?

EDIT: Ecco la mia soluzione finale con il valore originale di 12345678h. Grazie a tutti coloro che hanno contribuito!

;-----------------------------------------------------------------------------
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

È stato utile?

Soluzione

usi BCD solo le cifre 0 thru 9.
Una cifra BCD scompattato utilizza l'inferiore nibble di un intero byte e per convertirlo in ASCII si aggiunge 48.
Il numero 34h è 52 decimale e verrà rappresentato come un BCD decompresso come 00.000.101 e 00000010
(cambiato per evitare confusione durante l'utilizzo incorporato istruzioni) Quando viene compresso: 01.010.010 == BCD imballato 52

Per scompattarlo, si può fare come hai fatto, ma è necessario spostare AH diritto di inserire il valore nel lo-bocconcino. Per convertire in ASCII basta aggiungere 48.

[modifica]

MASM (=> TUTTE le istruzioni, Linux incluso) che gira su processori 80x86 utilizza lo schema little-endian. CPU come ad esempio il Motorola 68000 (Apple Mac) e RISC usa big-endian.

Quando si memorizza un numero come BCD, il byte meno significativo è l'indirizzo più basso attraverso il più significativo al più alto, per esempio:.

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

Pranzo BCD dipende da cosa si vuole fare con esso. Se si vuole ADD, MUL, DIV, SUB è necessario presentare i valori come richiesto da queste istruzioni. Ricorda anche di aggiungere zero byte per inizio e fine delle vostre cifre a hold porta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top