- ベストアンサー
PICの命令DAWについて
- PICのアセンブラーを勉強中の初心者です。DAW命令についてよくわかりません。
- DAW命令は、8ビットのWレジスタの上位4ビットと下位4ビットをそれぞれ独立にBCDデータに変換します。
- 具体的な例として、10進の数値85がWレジスタにある場合、DAW命令の結果は13と33になります。
- みんなの回答 (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演算が完成します。
その他の回答 (1)
- KEIS050162
- ベストアンサー率47% (890/1879)
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になるはずです。 実験環境がもしあれば、いくつか数値を入れてみて、試してみると良いでしょう。 ご参考に。
お礼
早速ご回答をいただきまして、有難うございます。 自分の理解とは違うようなので、説明いただいたことをよく読んで勉強したいと思います。
お礼
早速のご回答、有難うございます。 わたしが考えていたような単純なものではなく、少しややこしい命令のようなので、ご説明いただきました内容をよく読んで勉強させていただきます。 ちなみに、使っている本は、後閑哲也著の「改訂版 電子工作のためのPIC18F 本格活用ガイド」です。DAWの説明は126ページにあります。