1

我遇到了几个在没有第二个操作数的情况下使用 MOVF 的示例,例如:

;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 中的一个快速实验表明第二个“目标”操作数是可选的,默认为工作寄存器。IE

MOVF  W_Temp,w

这是那些编码“功能”之一,虽然严格来说是可能的,但只是另一种降低代码可读性的方法吗?或者还有更多的东西吗?

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

在第二种情况下,SWAPF(我们执行双重交换,以便正确恢复 w 寄存器的内容)指令不会影响零标志,因此使用它是安全的。

编辑:

如果您阅读了 Microchip 数据表,那么您会发现该MOVF指令也有一个(位大小)操作数。

因此,您可以在 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)

如果我们不想测试文件寄存器的零内容而不改变 w 寄存器的内容,使用MOVF W_Temp, F(or MOVF W_Temp) 很有 用。W_Temp

于 2012-06-27T08:49:20.917 回答