Nitarouです。RL78/G23でアセンブラでプログラム作成し、デバッグを行っています。
REGAのデータをBCD変換してREGBに転送するプログラムをデバッグしています。
HLレジスタでREGBのアドレスを指定してAレジスタの内容を書き込みたいのですが、転送できません。解決方法をご存じでしたらご教示ください。
チョコです。
どうも、935行目の「MOVW HL,」命令のオペランドの記述が「!REGB」となっていますが、これは間違いです。
ここは、「#LOWW REGB」とすべきです。
以上
チョコさん、ご指摘の命令を書き換えましたらHLレジスタで指定したアドレスに書き込めました。
ありがとうございました。
ところで、928行目にも同じ命令がありますが、これは無意味ではないでしょうか。
(今回の935行目の命令で上書きされてしまうので)
折角なので、なぜ「#LOWW」にする必要があるかを解説(?)します。
今回の「REGB」はビルドが完了した時点で、イミディエートなアドレスの値が割り当てられています。
これをHLレジスタに設定するには、イミディエートな値である「#」を付ける必要があります。
さらに「REGB」にアドレスは20ビットの大きさを持つので、そのままではHLに設定できません。
「REGB」はRAMをさすので、上位4ビットが0xFに場合にはその下位16ビットを抽出してnear領域で
アクセスできるので、下位16ビットを抽出するために#LOWWを付けて、「#LOWW REGB」とすればいいのです。
ちなみにオリジナルの「!」はメモリの内容を指すために使うもので、「!REGB」はREGB番地の内容を示します。
「!」は、2ndSFRやsaddr領域以外のメモリ領域の内容をアクセスする場合に使用します。つまり、
「MOVW HL, !REGB」は、REGBに格納されている内容をHLに設定しています。
チョコさん、詳しく解説していただきましてありがとうございます。
大変感謝しています。