PICのアセンブラーを勉強中の初心者です。以前にも何度か質問させていただいております。
Wレジスタの値を2桁のBCDに変換するというDAWコマンドの働き方がよくわかりません。
使用中の教本では「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。」とあるのですが、これは次のように解釈してよいのでしょうか?
例えば10進で「85」という数値がWレジスタにあったとすると、これはバイナリーでは '01010101' ですが、これが’8’と’5’を表す '1000' と '0101' に変換されるということでしょうか?つまり、DAW実行後のWレジスターは '10000101' すなわち、「133」という数値になるということでしょうか?
詳しい方、どうぞよろしくお願いいたします。
それから、前もって申し上げておかないといけないのですが、ご回答をいただいても、こちらからお礼を出来ないということが頻繁にあります。お礼の文章を入力してボタンを押しても、その操作は出来ませんという旨のメッセージが出てきて、何度やり直しても出来ません。それで今まで最初の回答者さんをベストアンサーにして質問を締め切るということをやってきました。今回も、もしお礼を出せなくなっても、全てご回答をいただいた方々には深く感謝いたしますので、悪しからずご了承ください。
No.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演算が完成します。
早速のご回答、有難うございます。
わたしが考えていたような単純なものではなく、少しややこしい命令のようなので、ご説明いただきました内容をよく読んで勉強させていただきます。
ちなみに、使っている本は、後閑哲也著の「改訂版 電子工作のためのPIC18F 本格活用ガイド」です。DAWの説明は126ページにあります。
No.1
- 回答日時:
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になるはずです。
実験環境がもしあれば、いくつか数値を入れてみて、試してみると良いでしょう。
ご参考に。
早速ご回答をいただきまして、有難うございます。
自分の理解とは違うようなので、説明いただいたことをよく読んで勉強したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) PIC16F1シリーズマイコンのNCO機能について 1 2023/04/18 08:41
- 教えて!goo 何かを質問した場合、 (1+1=2で合っていますか? ではなく、答えがない回答。意見を求める場合など 3 2022/11/12 16:44
- その他(ソフトウェア) GarageBandはコレが出来ますか? 1 2023/05/10 01:30
- 教えて!goo この『教えて!goo』を登録を最近しました。問い合わせが直ぐ出ないし質問して回答があっても、もう少し 9 2023/02/26 12:54
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- 教えて!goo 回答者によって解決したのにベストアンサーをつけない意味は? 9 2022/11/02 18:52
- PowerPoint(パワーポイント) ExcelのグラフをPowerPointに貼り付けした際にデータテーブルの小数点以下を削除したいです 2 2023/02/28 19:46
- 作詞・作曲 DAWのモニタリングとオーディオインターフェースのダイレクトモニターについて 質問をご覧いただきあり 1 2023/02/22 05:09
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「彡」って文字はなんという文...
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
フォームのコントロールのバッ...
-
EBCDIC⇒SJIS変換の方法
-
COBOLによる全角・半角混...
-
英数字を含む文字列(0-9,A-Z)...
-
Symfowareでのデータ型変換につ...
-
Excelマクロにて30分単位の計算...
-
相対パスを絶対パスに変換したい
-
VBScript ASC関数:文字エンコ...
-
VBAでbmp画像をASCIIデータとし...
-
RubyでUTF8のコード値を文字に...
-
VBでバイナリデータについて。
-
ビット反転(Not)が機能しない
-
VS 2008(VB.NET)
-
Excel vba で1と10を正確に判断...
-
コード変換について
-
数字5桁文字コード?
-
HP-UXでの文字コード変換方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
ふりがなをアルファベット化す...
-
英数字を含む文字列(0-9,A-Z)...
-
VS 2008(VB.NET)
-
Symfowareでのデータ型変換につ...
-
S-JIS → JIS コード変換するには
-
CString ←→ BSTRの変換について
-
数字5桁文字コード?
-
10進数→2進数への変換
-
2バイト文字をJEFからSJISに変...
-
JIS → S-JIS コード変換するには
-
EBCDICへの変換
-
RubyでUTF8のコード値を文字に...
-
latin-1 (ISO-8859-1)への変換
おすすめ情報