こんにちは、くぬぎざです。
> 問題は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/