• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PICの「SWAPF」の意味について)

PIC「SWAPF」の意味と使い方について

このQ&Aのポイント
  • PICのバイト命令「SWAPF」の意味がわかりません。上位4ビットと下位4ビットを入替えると何が起こるのでしょうか?
  • 「SWAPF」命令を利用した割り込み時のレジスタの待避、復帰方法について教えてください。
  • 「SWAPF」を使って「上位4ビットと下位4ビットを入替え」た後でないと、STATUSのHとLを取り出すことができないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>質問1: 動作的には、それで合ってます。 >質問2: 「転送の際に、STATUSレジスタの値が変化しない命令を使わないと、退避と復帰が出来ないから」です。 で「転送しても、STATUSレジスタの値が変化しない命令」は「SWAPF命令しかない」ので、SWAPF命令を使うのです。 SWAPF命令で、上位と下位の4ビットが入れ替わってしまうのは「副作用」であって、本当は、入れ替わって欲しくないのです。 でも、SWAPF命令を使う限りは「勝手に上位と下位が入れ替わっちゃう」ので、戻す時にもSWAPF命令を使って、ツジツマを合わせているだけです。 もし「転送しても、STATUSレジスタが変化しない命令」が他に存在するなら、SWAPF命令なんか使わないで、そっちを使います。でも「そんなのは存在しない」ので、仕方なく「SWAPF命令で代用している」のです。 >質問3: 取り出すだけなら、SWAPF命令なんか要りません。普通の転送命令で取り出せます。 でも、取り出した値をどこかにしまって置いて、後でSTATUSレジスタに戻す時の事を考えてみて下さい。 どこかにしまってあった値をSTATUSレジスタやWレジスタに戻す時に、普通の転送命令を使うと、STATUSレジスタが変化してしまいます。 STATUSレジスタを元に戻す為の転送命令で、転送後にSTATUSレジスタの値が変わってしまったら「元に戻ってない」ですよね? なので「元に戻す為に使う命令は、転送してもSTATUSレジスタの値が変化しない命令」じゃないといけないのです。 んで「転送してもSTATUSレジスタの値が変化しない命令」は「SWAPF命令だけ」で他に方法が無いので「SWAPF命令を使って、元に戻す」のです。 元に戻す時に「SWAPF命令を使うしかないので、上位と下位の4ビットが入れ替わってしまうと言う、余計な副作用が起きてしまう」ので、最初に取り出す時も、副作用が副作用で打ち消し合うように「SWAPF命令を使って取り出す」のです。 肝心なのは「どうやったら、STATUSレジスタの値を変更する事無く、値の復帰が出来るか?」であって、上位と下位の4ビットがどうなるかなんてのは「関係ない」のです。

chy_farm
質問者

お礼

chie65535さま ご教示ありがとうございました。 >「上位と下位の4ビットが入れ替わってしまうと言う、余計な副作用が起きてしまう」 というところが、とても分かり易かったです。 「ナンだ、そうだったのか!」という感じです。初学のものに丁寧にありがとうございました。

その他の回答 (1)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.1

PICに限らず、割り込みに入る時にはステータスレジスタ(その他必要なレジスタ)を退避しておいて、割り込みから抜け出す時に復帰する必要が有ります。 以下はPIC特有の問題です。 PICにはステータスレジスタを直接退避する命令が無く、一旦WREGにステータスレジスタの値を転送してからメモリに退避する必要が有ります。 ところが、MOV命令でステータスレジスタをWREGに転送するとステータスレジスタの値が変化してしまい、退避の役目を果たしません。 そこで、ステータスをWREGに転送する際にステータスが変化しないSWAPF命令を使用します。 復帰する時にもSWAPF命令を使用しないと上下4ビットが元通りになりません。

chy_farm
質問者

お礼

tadysさま 早速にご教示くださいまして感謝です。 PICではstatusが狂ってしまうのですね。zeroとかcarryとかが狂ってしまうと元に戻りませんしね。 この際ですからAVRとかではどうなのかも調べて学んでみます。分かり易いご教示ありがとうございました。またわからないときにはよろしくお願いいたします。

関連するQ&A