1

MOVF が第 2 オペランドなしで使用されている例をいくつか見つけました。たとえば、次のようになります。

;incorrect context restore
MOVF  STATUS_Temp,w
MOVWF STATUS
MOVF  W_Temp ;this may change the Z bit    <------ !! MOVF with single operand !!
             ;in the Status register

;good context restore
MOVF  STATUS_Temp,w
MOVWF STATUS
SWAPF W_Temp,f ;swap in place
SWAPF W_Temp,w ;swap with Wreg destination

(サンプルは PICKIT2 LPC ボードのユーザー ガイドから抜粋)

MPLAB SIM で簡単に実験すると、2 番目の「デスティネーション」オペランドはオプションであり、デフォルトでワーキング レジスタになることが示唆されています。すなわち

MOVF  W_Temp,w

これは、厳密には可能ですが、コードを読みにくくする別の方法であるコーディングの「機能」の1つですか? それともそれ以上のものがありますか?

4

1 に答える 1

1

これは、割り込みルーチンを離れるときにのみ重要なので、すべての ALU フラグを正しく復元する必要があります。

    ...   
    MOVF  STATUS_Temp,w ;Restore ALU flags
    MOVWF STATUS 
    MOVF  W_Temp,w      ;Restore the w register and also affect to the Zero flag
    RETFIE              ;Exit from interrupt

命令MOVF W_Tempは期待どおり w ファイル レジスタの内容をコピーして戻す必要がありますが、反対側からは、STATUS ファイル レジスタの一部であるゼロ フラグにも影響を与えます。そのため、割り込みを終了するときに privius Zero フラグの状態を正しく復元したい場合は使用できません。

    ...
    MOVF  STATUS_Temp,w ;Restore ALU flags
    MOVWF STATUS 
    SWAPF W_Temp,f
    SWAPF W_Temp,w      ;Restore the w register  
    RETFIE              ;Exit from interrupt

この 2 番目のケースでは、SWAPF (w レジスタの内容が正しく復元されるようにダブル スワップを実行します) 命令はゼロ フラグに影響を与えないため、安全に使用できます。

編集:

マイクロチップ社のデータシートを読んだことがあれば、その命令MOVFには 1 つの (ビット サイズ) オペランドも含まれていることがわかります。

したがって、MPLAB IDE で書き込むことができます。

MOVF  W_Temp, W    ;Copy W_Temp to W and set Zero flag if value is 0, otherwise clear.
MOVF  W_Temp, F    ;Copy W_Temp back to W_Temp  and set Zero flag if value is 0, otherwise clear.
MOVF  W_Temp       ;Is equal MOVF  W_Temp, F beacuse the defailt operant is F (1)

MOVF W_Temp, F(または)を使用すると、ファイル レジスタのゼロの内容をテストし、w レジスタの内容を変更しMOVF W_Tempない場合に便利です 。W_Temp

于 2012-06-27T08:49:20.917 に答える