プロが教えるわが家の防犯対策術!

PICのアセンブラーを勉強中の初心者です。以前にも何度か質問させていただいております。
Wレジスタの値を2桁のBCDに変換するというDAWコマンドの働き方がよくわかりません。
使用中の教本では「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。」とあるのですが、これは次のように解釈してよいのでしょうか?

例えば10進で「85」という数値がWレジスタにあったとすると、これはバイナリーでは '01010101' ですが、これが’8’と’5’を表す '1000' と '0101' に変換されるということでしょうか?つまり、DAW実行後のWレジスターは '10000101' すなわち、「133」という数値になるということでしょうか?

詳しい方、どうぞよろしくお願いいたします。

それから、前もって申し上げておかないといけないのですが、ご回答をいただいても、こちらからお礼を出来ないということが頻繁にあります。お礼の文章を入力してボタンを押しても、その操作は出来ませんという旨のメッセージが出てきて、何度やり直しても出来ません。それで今まで最初の回答者さんをベストアンサーにして質問を締め切るということをやってきました。今回も、もしお礼を出せなくなっても、全てご回答をいただいた方々には深く感謝いたしますので、悪しからずご了承ください。

A 回答 (2件)

> 「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。


意味不明です。
知らずに適当なことを書いたのでしょう。悪い本に当たってしまいましたね。(参考までになんという本ですか?)

この命令は「Decimal Adjust W Register」と書かれている通り、やっていることは変換というよりadjust(補正)です。
一言で言うと、BCD同士を通常の数値と見て加算した結果を正しいBCDに補正します。
なお、「データシートを見る限り、変換時、下位ビットの桁溢れは上位ビットに影響しない様」なのですが、多分データシートの間違いでしょう。データシート通りなら使い道がありません。
また私の見たデータシートの記述はNo1さんのものと違っていて、上位が
・Wレジスターの上位4ビット「+DC」が9より大きいか、Cビットが1なら、上位4ビット「+DC」に6を足してCを1にセット。そうでなければ「上位4ビットにDCを足す」
となっています。これもおかしいのですが、この「DC」をDCフラグのことでなく下位4bitの計算結果で出た繰り上がりのことだと考えればなんとか正しくなりそうです。

と、処理内容は複雑でデータシートすら信用出来ませんので、例を挙げたほうが分かりやすいですね。

・0x11(17) + 0x11(17) = 0x22(34)
の計算をして「22」がWレジスタに入っているとします。
この計算はBCDとして見ても正しいので、DAWを実行しても何も変えません。

・0x09(9) + 0x19(25) = 0x22(34)
の計算をして同じく「22」がWレジスタに入っているとします。
この計算はBCDとして見た場合正しくありません。ここでDAWを実行すると、
・DCフラグが立っているので、下位4bitは+6されて8。(ここで次で扱うDCを0にする?)
・上位4bit+DC(0)は9以下なので、0を足し2のまま。
結果は0x28となり、9+19=28というBCD演算が完成します。
    • good
    • 0
この回答へのお礼

早速のご回答、有難うございます。
わたしが考えていたような単純なものではなく、少しややこしい命令のようなので、ご説明いただきました内容をよく読んで勉強させていただきます。
ちなみに、使っている本は、後閑哲也著の「改訂版 電子工作のためのPIC18F 本格活用ガイド」です。DAWの説明は126ページにあります。

お礼日時:2013/08/04 13:10

PIC 18ファミリーのデータシートを見る限り、


Wレジスターの値を正しくBCDに変換する、
ということらしいですね。

質問者殿の理解とちょっと違います。

Wレジスタの上位8ビット(とC)、下位8ビット(とDC)の値(BCD)から、正しいBCDに変換する、とことらしいですね。下記の様な処理をします。

Wレジスターの下位4ビットが9より大きいか、DCビットが1なら、下位4ビットに6を足す。そうでなければ何もしない。

Wレジスターの上位4ビットが9より大きいか、Cビットが1なら、上位4ビットに6を足してCを1にセット。そうでなければ何もしない。

(※データシートを見る限り、変換時、下位ビットの桁溢れは上位ビットに影響しない様ですね。

データシートの例では、下記が書いてあります。

A5H なら、 下位バイトは 5なので、そのまま。上位バイトは Aなので、6を足して、10H ⇒ Cが1.結果、C=1、W=05H。(DCは0です)

CEHなら、下位バイトは4、上位バイトは3で、C=1となります。(DCは何故か0)



質問者殿の例で、Wレジスタが55Hだったら、DAW実行後そのまま55Hになるはずです。

実験環境がもしあれば、いくつか数値を入れてみて、試してみると良いでしょう。
ご参考に。
    • good
    • 0
この回答へのお礼

早速ご回答をいただきまして、有難うございます。
自分の理解とは違うようなので、説明いただいたことをよく読んで勉強したいと思います。

お礼日時:2013/08/04 13:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!