パック 10 進数を ASCII 文字列に変換しようとしています。これまでの私の理解は次のとおりです。
以下:
bcd BYTE 34h
「解凍」した後、10 進数の 34 に変換する必要があります。今、これを行う最善の方法がわかりません。この 16 進数を 2 進数に変換すると、次のようになります...
0011 0100
ここで、手順で一度に各 4 ビットのバイナリ値を出力する場合、数字の ASCII 文字列を出力する必要があります。正しいですか? したがって、ループを通過すると、最初の 4 ビットの 2 進数を取得し、その実際の値を出力して、3 を出力します。次に、同じことを行い、4 を出力します。
だから、ここに私の一般的な考えがあります:
8ビットの値「34h」を取り、AHとALに移動します。AH では、以下を使用してビットの後半をクリアします。
and ah, 11110000b
AL では、以下を使用してビットの前半をクリアします。
and al, 00001111b
したがって、AH = 0110b または 3 および AL = 0100b または 4 であり、それに応じてこれらを出力します。
これは良いアプローチですか?それとも、完全に間違っているか、考えすぎているのでしょうか?
編集:元の値が 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