PICを、アセンブリ言語のプログラムで使う。

PICで電子工作をするため、アセンブリ言語プログラムを使い始める。

当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのアセンブリ言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、ご了承願います。

アセンブリ言語の命令、GOTO命令。

GOTO命令の解説。

 

書式;GOTO  k

          kは、定数データ 0~2047(0x00~0x7FF)、または、ラベル。

 

動作;k番地の命令に制御を移す。

 

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

 

 1. GOTO命令のアドレスを0x30、飛び先番地を0xF0とする。

    GOTO 0xF0   //命令実行

    0xF0番地の命令に制御を移す。

 

 2.GOTO命令のアドレスを0x32、飛び先番地を0xF5とする。

f:id:higonohimajin:20210330104954p:plain

 

 

アセンブリ言語の命令、CALL命令。

CALL命令の解説。

 

書式;CALL  k

          kは、定数データ 0~2047(0x00~0x7FF)、または、ラベル。

 

動作;リターンアドレスをスタックに書き込み、k番地のサブルーチンに飛ぶ。

 

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

 

 1. CALL命令のアドレスを0x30、サブルーチンのある番地を0xF0とする。

    CALL 0xF0   //命令実行

    スタックに、0x30+1 すなわち0x31を格納(自分の番地+1、自分の次の命令の番地)。

    サブルーチンの0xF0番地の命令に制御を移す。

 

 2.CALL命令のアドレスを0x32、サブルーチンのある番地を0xF5とする。 

f:id:higonohimajin:20210330103028p:plain

 

アセンブリ言語の命令、BTFSS命令。

BTFSS命令の解説。

 

書式;BTFSS  f,b

           fは、汎用レジスタアドレス 0~127(0x00~0x7F)、または、ラベル。

   bは、汎用レジスタビット指定 0~7。

動作;fのbビットが1? ➡ 1なら次の命令はNOP、0ならそのまま実行。

   汎用レジスタのbビットが1か判定し、1なら、次の命令をNOPに変えて実行する。  

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

例;

 1.   汎用レジスタ番地;0x30とする。

    f  0x96     //命令実行前の値(0x30番地の汎用レジスタの内容)

    b  3      //汎用レジスタのビット指定

    BTFSS    0x30,3   //命令実行

    f  0b10010110     //汎用レジスタの2進数表記。

    fの3ビット目が0なので、次の命令をそのまま実行する。

 

 2.   汎用レジスタ番地;0x30(ラベル;Data)とする。

    f  0xFF     //命令実行前の値(0x30番地の汎用レジスタの内容)

    b  1      //汎用レジスタのビット指定

    BTFSS    data,1   //命令実行

    f  0b11111111     //汎用レジスタの2進数表記。。

    fの1ビット目が1なので、次の命令をNOPに変えて実行する。

 

 3. 汎用レジスタ番地;30とする。

f:id:higonohimajin:20210330094718p:plain

 

アセンブリ言語の命令、BTFSC命令。

BTFSC命令の解説。

 

書式;BTFSC  f,b

           fは、汎用レジスタアドレス 0~127(0x00~0x7F)、または、ラベル。

   bは、汎用レジスタビット指定 0~7。

動作;fのbビットが0? ➡ 0なら次の命令はNOP、1ならそのまま実行。

   汎用レジスタのbビットが0か判定し、0なら、次の命令をNOPに変えて実行する。  

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

例;

 1.   汎用レジスタ番地;0x30とする。

    f  0x96     //命令実行前の値(0x30番地の汎用レジスタの内容)

    b  3      //汎用レジスタのビット指定

    BTFSC    0x30,3   //命令実行

    f  0b10010110     //汎用レジスタの2進数表記。

    fの3ビット目が0なので、次の命令をNOPに変えて実行する。

 

 2.   汎用レジスタ番地;0x30(ラベル;Data)とする。

    f  0xFF     //命令実行前の値(0x30番地の汎用レジスタの内容)

    b  1      //汎用レジスタのビット指定

    BTFSC    data,1   //命令実行

    f  0b11111111     //汎用レジスタの2進数表記。。

    fの1ビット目が0ではないので、次の命令をそのまま実行する。

 

 3.汎用レジスタ番地;0x30(ラベル;Data)とする。

f:id:higonohimajin:20210330094000p:plain

 

アセンブリ言語の命令、INCFSZ命令。

INCFSZ命令の解説。

 

書式;INCFSZ   f,d

           fは、汎用レジスタアドレス 0~127(0x00~0x7F)、または、ラベル。

   dは、結果の上書き先が、ワーキングレジスタか、汎用レジスタの選択。

動作;f + 1 ➡ W or f

   汎用レジスタ内容に1を加算し、結果をdで指定されたレジスタに上書き。

   汎用レジスタ内容に1を加算した結果が0なら、次の命令をNOPに変えて実行する。  

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

例;

 1.   汎用レジスタ番地;0x30とする。

    W  0x65     //命令実行前の値

    f  0x96     //命令実行前の値(0x30番地の汎用レジスタの内容)

    d  0      //書き込み先のレジスタ指定

    INCFSZ     0x30,0   //命令実行

    W  0x97     //命令実行後の値、dが0だから、こちらに上書き。

    f  0x96     //命令実行後の値、こちらは、変化なし。

    結果が0ではないので、次の命令をそのまま実行する。

 

 2.   汎用レジスタ番地;0x30(ラベル;Data)とする。

    W  0x65     //命令実行前の値

    f  0xFF     //命令実行前の値(0x30番地の汎用レジスタの内容)

    d  1      //書き込み先のレジスタ指定

    INCFSZ     data,1   //命令実行

    W  0x95     //命令実行後の値、こちらは、変化なし。

    f  0x00     //命令実行後の値、dが1だから、こちらに上書き。

    結果が0なので、次の命令をNOPに変えて実行する。

アセンブリ言語の命令、DECFSZ命令。

DECFSZ命令の解説。

 

書式;DECFSZ   f,d

           fは、汎用レジスタアドレス 0~127(0x00~0x7F)、または、ラベル。

   dは、結果の上書き先が、ワーキングレジスタか、汎用レジスタの選択。

動作;f - 1 ➡ W or f

   汎用レジスタ内容から1を減算し、結果をdで指定されたレジスタに上書き。

   汎用レジスタ内容から1を減算した結果が0なら、次の命令をNOPに変えて実行する。  

ステータスレジスタへの影響

   C;影響しない

   DC;影響しない

   Z;影響しない

 

例;

 1.   汎用レジスタ番地;0x30とする。

    W  0x65     //命令実行前の値

    f  0x96     //命令実行前の値(0x30番地の汎用レジスタの内容)

    d  0      //書き込み先のレジスタ指定

    DECFSZ     0x30,0   //命令実行

    W  0x95     //命令実行後の値、dが0だから、こちらに上書き。

    f  0x96     //命令実行後の値、こちらは、変化なし。

    結果が0ではないので、次の命令をそのまま実行する。

 

 2.   汎用レジスタ番地;0x30(ラベル;Data)とする。

    W  0x65     //命令実行前の値

    f  0x01     //命令実行前の値(0x30番地の汎用レジスタの内容)

    d  1      //書き込み先のレジスタ指定

    DECFSZ     data,1   //命令実行

    W  0x95     //命令実行後の値、こちらは、変化なし。

    f  0x00     //命令実行後の値、dが1だから、こちらに上書き。

    結果が0なので、次の命令をNOPに変えて実行する。

f:id:higonohimajin:20210329200849p:plain