Я пытаюсь преобразовать упакованные десятичные числа в строки 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
Подход выглядит нормально. Существует не так много вариантов, когда речь заходит о коде уровня сборки. –
@Gunner: Нет, это не так. То, что он делает, это манипулировать цифрами, а не упаковывать и распаковывать двоичные кодовые десятичные знаки. – slashmais