标题: PIC的35条指令扭曲理解法 [打印本页]

作者: 51黑apple    时间: 2016-6-21 16:15
标题: PIC的35条指令扭曲理解法
以下理解纯属恶搞,例子使用搜狗输入法输入,全角还是半角的懒得理了!


第一条当然是NOP,
NOP 垃圾指令
操作数:垃圾当然不用说最好是没有的就好!
指令编码:00 0000 0xx0 0000   这个全是0啦,还要xx
执行时间:清理垃圾也要一个指令的
执行过程:扫垃圾,除了清理外其他什么都没变
状态标志:垃圾当然无视
说明:这个垃圾除了用来浪费时间外什么也实现不了,一般用来延时
指令例子:   BSF         PORTB,0      ;   PORTB  端口0输出高电平
                       NOP                               ;丢个垃圾浪费下时间让IO输出稳定

第二条应该是MOVWF

MOVWF          拆开 解释一下先,
MOV就是寄存器缩写的意思,
W就是一个叫W的SB老爸给它起的名字,
F==??发(fa的缩写?),发送或者传送的意思,
整个串起来就是把W寄存器里面的数传到数据寄存器。

语法形式:MOVWF     f
操作数:f是数据寄存器的低7位地址(0x00-0x7f)
指令编码:00 0000 1fff ffff  (要反反复复)

执行时间:一个指令周期

执行过程:把W那个SB的数传送到数据寄存器 里面,W那个SB是不会变的
状态标志影响:无
说明:一般是给数据寄存器赋值(给别人做嫁妆啦)
指令例子:     MOVLW    0x55    ;W那个SB在吃饭 

             MOVWF    Data    ;W那个SB给人家添饭
                        ;Data = 0x55  

第三条   MOVF   寄存器发送
把数据寄存器的数传到目的寄存器
语法形式:    MOVF    f,d
操作数:        f是数据寄存器的低7位地址(0x00-0x7f)
            d=w,这d真虚伪,把W添的饭又退回去了!
         d=f,这d真坏,把饭又拿回来,还看看碗里的饭是不是没了!
指令编码:    00 1000 dfff ffff (是人都讨厌的d竟然还要定了得反反复复)
执行时间:    一个指令周期  (还好只用了一个,要不然跑不了非得被人家敲死)
执行过程;     [f] -d  (连数据寄存器都要给d给恶搞了)
状态标志影响:  Z      (搞成这样子要是Z还没被影响的绝对是个SB)
说明:    这个指令通过W寄存器把数据寄存器的数传到别的地方,或者对数据寄存器判0操作,如果发现是0就会把标志Z置位。(这家伙够坏的吧,先把W那个SB当跳板把数据寄存器的饭搞到别的地方去,还要看看碗里是否有饭,没饭的话就大呼小叫的!)
指令例子:   例1                 ;数据传送
            MOVF    Var1,w    ;Var1把饭添给W那个SB
           MOVWF   Var2      ;W那个SB只能当传饭的传送给Var2
                        ;Var2 = Var1 (不用说这碗饭是不变的)
        例2              ;数据判0(看看这个饭碗里面有没有饭)
          MOVF    Var3,f     ;Var3的数被传送给自身(Var3添完饭后给自己)
         BTFSC    STATUS,Z   ;如果Var3不等于0就会跳到下一指令(自己给自己添饭就这样的)
        GOTO    Var3Zero    ;如果Var3等于0就转做相关操作(自己添不到饭肯定要干别的了)


第四条    CLRW  W寄存器的数清0(W这个SB的饭被抢了)
CLR就是清除的缩写,W。。。。。。这个SB又被搞了。。。。。。无语中
语法形式:   CLRW
操作数:    无(饭都被抢了还吃个毛啊)
指令编码:   00 0001 0000 0011 (被抢了还幺幺的叫)
执行时间:   一个指令周期(抢的速度也不慢啊)
执行过程:   0x00 - W  (饭就这样被抢了)
       1 - W  (要是不叫才怪了)
状态标志影响:Z              (W叫得也不小,把Z给惊动了)
说明:该指令对W寄存器清0,同时置位0标志Z,另外有一条指令movlw 0x00也可以使W寄存器清0,
   但不影响任何状态。(看来W的饭被抢也要看看谁抢的,l去抢的话连声都不干吭一声)
指令例子:    CLRW    ;W=0(W的饭没了)

第五条    CLRF     数据寄存器的数清0 (看来连传送过程也会被抢)
语法形式:CLRF    f
操作数:        f是数据寄存器的低7位地址(0x00-0x7f)指令编码:    00 0001 1fff ffff  (叫了两下就拂拂裤子就走了)
执行时间:    一个指令周期 (抢的速度)
执行过程:    0x00 - f        (f被抢,还叫两声)

            1 - Z    (结果还是把Z惊动)
状态标志影响:Z       (还是这个家伙被惊动)
说明:    该指令对数据寄存器清0,同时置位0标志Z(f在传送过程中被抢,同时Z被惊动)
指令例子:    CLRF    TRISB    ;端口B的所有I/O引脚设为输出模式(因为饭在传送中被抢了,结果全部挨饿)

第六条    ADDWF    数据寄存器的数和W寄存器相加
(传送中的饭和W的饭不满要求服务员加饭)
语法形式:    ADDWF    f,d    (这次被搞的是f和d)
操作数:        f是数据寄存器的低7位地址(0x00-0x7f)
            d=f,结果放在数据寄存器内,W的数不变(饭加进f的碗里,W碗里的饭没变)

            d=w,结果放在W寄存器里,数据寄存器的数不变(饭加进W碗里去了,f碗里不变)
指令编码:    00 0111 dfff ffff  (都是叫饭的)
执行时间:    一个指令周期(加饭的效率也够快的)
执行过程:    [f] + [W] -d
状态标志影响:Z  DC  C (加饭要求惊动了睡觉的家伙和服务员还有煮饭的家伙)
说明:数据寄存器的数和W寄存器相加,结果按照d指定的目的地存数
(送饭的和W要求加饭,结果按照d指定放在哪个碗里面)
指令例子:    MOVLW     0x55    ;W=0x55,假定 Sum=0xaa (W碗里有小半碗饭,假定sun碗里有大半碗)  
            ADDWF    Sum,f   ;W不变,Sum=0xff  (W碗里没加成,Sum加满了)  












欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1