[H8-ML(659)] Re: 初歩的な質問なんですが・・・
From: Junsuke Kunugiza <jk@xxxxxxx>
Date: 2000年06月27日(火)18時45分57秒
こんにちは、くぬぎざです。

> 問題は16進数をどうやって10進数にするか?です
> 例えばR1に入っている16ビットのデータを10進5桁にしたい場合
> 皆様ならどのような方法で処理するのでしょうか?

わたしは、昔から以下のようなコードを使っています。ご指定の
レジスタとは違いますが、以下のコードでは、R0 に入っている
符号付き 16bit 整数を BCD に変換し、結果を R2L と R1に分割
して格納します。

|    R2L    |    R1H    |    R1L    |
| 0000 EEEE | DDDD CCCC | BBBB AAAA |
|       万  |  千   百  |  十   一  |

入力が正数の場合には '+' が、負数の場合には '-' が、R3L に
記録されます。符号無しの整数で使用する場合は、最初の5行は
不要です。いきなり、L20 のところから呼んで下さい。

-----------------------------------------------------------
BIN2BCD:
; 符号処理ここから
        MOV.B   #H'2B,R3L       ; '+'
        MOV.W   R0,R0
        BPL     L20             ; 正数の場合は L20 へ
        NEG.W   R0              ; 負数の場合は、NEG する
        MOV.B   #H'2D,R3L       ; '-' 負号を R3L に記録
; 符号処理ここまで
L20:    MOV.B   #16,R2H         ; 変換するビット数(16ビット)
        XOR.W   R1,R1           ; 結果を格納するレジスタは必ずゼロにする
        XOR.B   R2L,R2L
L21:    CMP.B   R2H,R2H         ; CARRY FLAG をクリアする
        ROTXL.W R0              ; 入力の整数をキャリー付き左回転
        ADDX    R1L,R1L         ; キャリー付き加算で2倍する
        DAA     R1L             ; 十進補正
        ADDX    R1H,R1H
        DAA     R1H
        ADDX    R2L,R2L
        DAA     R2L
;;      ADDX    Rxx             ; いくらでも追加できる
;;      DAA     Rxx
        DEC.B   R2H
        BNE     L21             ; 全ビットを処理するまでループ
-----------------------------------------------------------

これだけです。多分、このまま動くと思います(アルゴリズムは
これで良いのですが、掲載した例のテストはしてません(^^;)。

このコードの面白い点は、桁数に理論上の上限(下限)がなく、
桁数の拡張が極めて容易なことです。変換するビット数を変え、
コード中にコメントにして記してあるように、新たな 8bit レジ
スタを追加して addx と daa さえ行えば、メモリが許す限り
桁数を増やすことができます。

が、欠点も少なからずあって、整数のビット数の分だけ L21 で
ループするため、ちょっと遅いことが挙げられます。最後まで
律儀にやらないと、結果が出ませんので。


Junsuke Kunugiza, kunugiza@xxxxxxx
Eccentric Labatory -  http://www.exp.org/
スレッド概略
[654(R)](起点)
 └[657(U)]
   └[表示中]
     └[660(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]