2010-11-09 4 views
4

Я пытаюсь преобразовать упакованные десятичные числа в строки ascii. Вот мое понимание до сих пор:упакован десятичной до сборки ascii

Следующая:

bcd BYTE 34h 

Если преобразовать в десятичное число 34 после того, как «распакованный». Теперь я не уверен, как это сделать. Если преобразовать это шестнадцатеричное число в двоичное это следующим образе ...

0011 0100 

Теперь, если у меня есть процедура распечатки каждого 4bit двоичного значения в то время, то он должен напечатать ASCII строку чисел, правильно ? Поэтому, если я пройду через цикл, возьмите первый двоичный номер из 4 бит, напечатайте его фактическое значение, его напечатайте 3, затем сделайте то же самое, его напечатать 4.

Итак, вот мой общий Идея:

Возьмите 8-битное значение «34h», переместите его в AH и AL. В АГ, очистить вторую половину битов с использованием следующим образом:

and ah, 11110000b 

и AL, очистить первую половину битов, используя следующее:

and al, 00001111b 

Так AH = 0110b или 3 И AL = 0100b или 4, затем распечатайте их соответствующим образом.

Это хороший подход? Или я собираюсь полностью ошибиться или подумать об этом?

EDIT: Вот мое окончательное решение с оригинальным значением 12345678h. Спасибо всем, кто помог!

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

+1

Подход выглядит нормально. Существует не так много вариантов, когда речь заходит о коде уровня сборки. –

+0

@Gunner: Нет, это не так. То, что он делает, это манипулировать цифрами, а не упаковывать и распаковывать двоичные кодовые десятичные знаки. – slashmais

ответ

2

BCD использует только цифры 0 через 9.
распакованный BCD цифра использует нижний клев целого байта и преобразовать его в ASCII добавить 48.
Число 34ч в 52 десятичное и будет представлен в виде распакованного BCD в 00000101 и 00000010
(Измененная, чтобы избежать путаницы при использовании встроенных в инструкции) когда она упакована: 01010010 == BCD упаковано 52

для unpac k это, вы можете сделать, как вы это сделали, но вам нужно сдвинуть AH, чтобы поместить значение в lo-nibble. Для того, чтобы преобразовать в ASCII просто добавьте 48.

[править]

MASM (=> ВСЕ инструкции, Linux входит в комплект), который работает на процессорах 80x86 использует прямой порядок байтов схемы. Процессоры, такие как Motorola 68000 (Apple Mac) и RISC, используют big-endian.

При сохранении числа в BCD, младший байт по младшему адресу через к наиболее значимым на самом высоком, например:

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 зависит от того, что вы хотите сделать с Это. Если вы хотите ADD, MUL, DIV, SUB, вы должны представить значения, как требуется в соответствии с этими инструкциями. Также не забудьте добавить нулевые байты для начала и конца ваших цифр, чтобы удерживать носители.

+0

Хорошо, имеет смысл, но теперь я прихожу к проблеме с маленькими концами. Скажем, у меня есть упакованный десятичный знак. Bcd BYTE 12345678h, если я сделаю что-то вроде этого ... mov al, BYTE PTR bcd, я получаю номер 78 для начала, любое предложение, чтобы избежать этого? –

+0

@ Далтон Конли: Я обновил свой ответ, чтобы дать вам больше указателей. – slashmais

+1

Для малоэтажных упакованных BCD 12345678h будет 78563412 при распаковке, если вы будете следовать обычным методам. Если вы просто хотите уменьшить объем памяти на диске, хранящем его как упакованный BCD, ваш подход в порядке, но вы должны помнить, чтобы настроить свои значения, когда вы хотите их использовать. – slashmais

Смежные вопросы