ASCIIアセンブリに詰め込まれた小数
質問
パックされた小数点以下をASCII文字列に変換しようとしています。これがこれまでの私の理解です:
以下:
bcd BYTE 34h
「開梱」された後、10進数34に変換する必要があります。今、私はこれを行う最良の方法についてはわかりません。この16進数をバイナリに変換すると、次のとおりです...
0011 0100
さて、私の手順が一度に各4ビットのバイナリ値を印刷している場合、それは数字のASCII文字列を印刷する必要があります、正しいですか?したがって、ループを使用して、最初の4ビットバイナリ番号をつかみ、実際の値を印刷し、3を印刷します。
だから、ここに私の一般的な考えがあります:
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
解決
BCDは、0から9までの数字のみを使用します。
未解決のBCDディジットは、バイト全体の下部ニブルを使用し、それをASCIIに変換するために48を追加します。
数字34Hは52小数点で、00000101および00000010として未梱包のBCDとして表されます
(組み込みの指示を使用するときに混乱を避けるために変更されます)詰め込まれたとき:01010010 == BCDパック52
それを開梱するには、あなたがしたとおりに行うことができますが、あなたはlo-nibbleに価値を置くためにAHを正しくシフトする必要があります。 ASCIIに変換するには、48を追加するだけです。
編集
80x86プロセッサで実行されるMASM(=>すべての命令、Linuxを含む)は、リトルエンディアンスキームを使用します。 Motorola 68000(Apple Mac)やRISCなどのCPUは、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
これらの指示で必要とされる値を提示する必要があります。また、ゼロバイトを追加して、キャリーを保持するために数字を開始して終了することを忘れないでください。