質問

パックされた小数点以下を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 これらの指示で必要とされる値を提示する必要があります。また、ゼロバイトを追加して、キャリーを保持するために数字を開始して終了することを忘れないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top