4

パック 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

4

1 に答える 1

3

BCD は 0 ~ 9
の数字のみを使用します。アンパックされた BCD ディジットはバイト全体の下位ニブルを使用し、それを ASCII に変換するには 48 を追加します
。数値 34h は 52 の 10 進数であり、アンパックされた BCD として 00000101 および 00000010 として表されます
(組み込み命令使用時の混乱を避けるため変更) パック時: 01010010 == BCD パック 52

アンパックするには、これまでと同じように実行できますが、値を lo-nibble に配置するには、AH を右にシフトする必要があります。ASCII に変換するには、48 を追加するだけです。

[編集]

80x86 プロセッサで実行される MASM (=> すべての命令、Linux を含む) は、リトル エンディアン方式を使用します。Motorola 68000 (Apple Mac) や RISC などの CPU はビッグエンディアンを使用します。

数値を 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に応じて、これらの指示に従って値を提示する必要があります。また、キャリーを保持するために、数字の最初と最後にゼロバイトを追加することを忘れないでください。

于 2010-11-09T07:41:09.717 に答える