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

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

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

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

XORLW命令の解説。

 

書式;XORLW       K

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

動作;W XOR k ➡ W

   ワーキングレジスタの内容と定数データのXORを計算し、結果をワーキングレジスタに上書き。  

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

   C;影響しない

   DC;影響しない

   Z;計算結果が0の時➡1、それ以外➡0。

例;

 1. 

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

    XORLW       0x96   //命令実行

    W  0b01010101  //0x65の2進数  

    k  0b10010110  //0x96の2進数

    XOR 0b11000011   //WとkのXORを計算、結果が0ではない。

    W  0xC3     //命令実行後の値

    Z➡0。 //ステータスレジスタの値

 2. 

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

    XORLW      0x55   //命令実行

    W  0b01010101  //0x55の2進数

    k  0b01010101  //0x55の2進数

    XOR 0b00000000   //WとkのXORを計算、結果が0。

    W  0x00     //命令実行後の値

    Z➡1。 //ステータスレジスタの値

 

 

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

XORWF命令の解説。

 

書式;XORWF   f,d

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

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

動作;W XOR f ➡ W or f

   ワーキングレジスタの内容と汎用レジスタ内容のXORを計算し、結果をdで指定されたレジスタに上書き。  

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

   C;影響しない

   DC;影響しない

   Z;計算結果が0の時➡1、それ以外➡0。

例;

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

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

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

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

    XORLW      0x30,0   //命令実行

    W  0b01010101  //0x65の2進数  

    f  0b10010110  //0x96の2進数

    XOR 0b11000011   //WとfのXORを計算、結果が0ではない。

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

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

    Z➡0。 //ステータスレジスタの値

 

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

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

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

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

    XORLW     Data,1   //命令実行

    W  0b01010101  //0x55の2進数

    f  0b01010101  //0x55の2進数

    XOR 0b00000000   //WとfのXORを計算、結果が0。

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

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

    Z➡1。 //ステータスレジスタの値

 

 

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

SWAPF命令の解説。

 

書式;SWAPF      f,d

         

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

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

   動作;f上位 ⇆ f下位 ➡  f or  W

f:id:higonohimajin:20210327110912p:plain



   汎用レジスタの内容の上位4ビットと下位4ビットを入れ替えて、dで指定されたレジスタに上書き。

   C;影響しない。

   DC;影響しない。  

   Z;影響しない。

例; 

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

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

    f  0x3A     //命令実行前の値

       SWAPF    0x30,0    //命令実行

    fの内容の上位4ビットと下位4ビットを入れ替えて、dで指定されたレジスタに上書き。

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

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

    C、DC、Z      //ステータスレジスタの値、影響しない。

 

 

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

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

    f  0x0A     //命令実行前の値

       SWAPF    Data,1   //命令実行

    fの内容の上位4ビットと下位4ビットを入れ替えて、dで指定されたレジスタに上書き。

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

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

    C、DC、Z      //ステータスレジスタの値、影響しない。

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

SUBWF命令の解説。

 

書式;SUBWF      f,d

         

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

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

   動作;f - W ➡ f or  W

   汎用レジスタの内容からワーキングレジスタの内容を減算し、dで指定されたレジスタに上書き。

   (0x01~0x0x7F(1~127)が正の数、0xFF~0x81(-1~ー127)が負の数。)

    C;結果が正または0の時 ➡ 1、結果が負の時 ➡ 0。

   DC;結果が正または0の時 ➡ 1、結果が負の時 ➡ 0。  

   Z;結果が0の時 ➡ 1、結果が正または負の時 ➡ 0。

例; 

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

    W  0x1F(31)     //命令実行前の値

    f  0x3A(58)     //命令実行前の値

       SUBWF   0x30,0    //命令実行

    fからWの内容を減算して、ワーキングレジスタに上書き。

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

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

    C➡1。      //ステータスレジスタの値、結果が正の数。

    DC➡1。      //ステータスレジスタの値、結果が正の数。

    Z➡0。      //ステータスレジスタの値、結果が正の数。

 

 

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

    W  0x65(101)     //命令実行前の値

    f  0x65(101)     //命令実行前の値

       SUBWF   0x30,1   //命令実行

    fからWの内容を減算して、汎用レジスタに上書き。

    W  0x65(101)     //命令実行前の値、こちらは、変化なし。

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

    C➡1。      //ステータスレジスタの値、結果が0。

    DC➡1。      //ステータスレジスタの値、結果が0。

    Z➡1。      //ステータスレジスタの値、結果が0。

 

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

    W  0x25(37)     //命令実行前の値

    f  0x0A(10)     //命令実行前の値

       SUBWF    Data,1   //命令実行

    kからWの内容を減算して、ワーキングレジスタに上書き。

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

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

    C➡0。      //ステータスレジスタの値、結果が負の数。

    DC➡0。      //ステータスレジスタの値、結果が負の数。

    Z➡0。      //ステータスレジスタの値、結果が負の数。

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

SUBLW命令の解説。

 

書式;SUBLW       k

           kは、リテラルデータ 0~255(0x00~0xFF)。

動作;   k - W ➡  W

   リテラルデータからワーキングレジスタの内容を減算し、ワーキングレジスタに上書き。

     (0x01~0x0x7F(1~127)が正の数、0xFF~0x81(-1~ー127)が負の数。)  

    C;結果が0または正の数 ➡ 1、結果が負の数 ➡ 0。

   DC;影響しない   

   Z;結果が0 ➡ 1、結果が正または負の数 ➡ 0。

 

例; 

 1.   

    W  0x1F(31)     //命令実行前の値

    k  0x3A(58)     //命令実行前の値(リテラルデータ)

       SUBLW    0x3A    //命令実行

    kからWの内容を減算して、ワーキングレジスタに上書き。

    W  0x1B(27)     //命令実行後の値

    C➡1。      //ステータスレジスタの値、結果が正の数。

    Z➡0。      //ステータスレジスタの値、結果が正の数。

 

 2. 

    W  0x65(101)     //命令実行前の値

    k  0x65(101)     //命令実行前の値(リテラルデータ)

       SUBLW    0x65   //命令実行

    kからWの内容を減算して、ワーキングレジスタに上書き。

    W  0x00(0)     //命令実行後の値

    C➡1。      //ステータスレジスタの値、結果が0。

    Z➡1。      //ステータスレジスタの値、結果が0。

 

 3. 

    W  0x25(37)     //命令実行前の値

    k  0x0A(10)     //命令実行前の値(リテラルデータ)

       SUBLW    0x0A   //命令実行

    kからWの内容を減算して、ワーキングレジスタに上書き。

    W  0xE5(-27)  //命令実行後の値

    C➡0。      //ステータスレジスタの値、結果が負の数。

    Z➡0。      //ステータスレジスタの値、結果が負の数。

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

RRF命令の解説。

 

書式;RRF       f,d

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

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

動作;   C  f     C  f

      0 10010110 ➡  0 01001011

f:id:higonohimajin:20210321094259p:plain

 Cと汎用レジスタの内容のビットを右に1回シフトし、dで指定されたレジスタに上書き。          

    C;影響する、例を参照。

   DC;影響しない   

   Z;影響しない

例;

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

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

       0b01100101 //2進数表記

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

       0b10010110 //2進数表記

    C  0      //ステータスレジスタの値

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

    RRF    0x30,0   //命令実行

    0 10010110 ➡ 0 01001011 //Cの内容がfの7ビットにはいり、fの各ビットが右にずれて、fの一番右のビットの内容がCにはいる。

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

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

    Z➡0。      //ステータスレジスタの値

 

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

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

       0b01101010 //2進数表記

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

       0b00010101 //2進数表記

    C  1      //ステータスレジスタの値

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

    RRF   Data,1   //命令実行

    1 00010101 ➡ 1 10001010 //Cの内容がfの7ビットにはいり、fの各ビットが右にずれて、fの一番右のビットの内容がCにはいる。

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

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

    Z➡1。      //ステータスレジスタの値 

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

RLF命令の解説。

 

書式;RLF       f,d

         

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

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

動作;   C  f     C  f

      0 10010110 ➡  1 00101100

f:id:higonohimajin:20210321091725p:plain

Cと汎用レジスタの内容のビットを左に1回シフトし、dで指定されたレジスタに上書き。          

    C;影響する、例を参照。

   DC;影響しない   

   Z;影響しない

例;

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

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

       0b01100101 //2進数表記

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

       0b10010110 //2進数表記

    C  0      //ステータスレジスタの値

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

    RLF     0x30,0   //命令実行

    0 10010110 ➡ 1 00101100 //Cの内容がfの0ビットにはいり、fの各ビットが左にずれて、fの一番左のビットの内容がCにはいる。

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

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

    Z➡1。      //ステータスレジスタの値

 

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

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

       0b01101010 //2進数表記

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

       0b00010110 //2進数表記

    C  1      //ステータスレジスタの値

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

    RLF    Data,1   //命令実行

    1 00010110 ➡ 0 00101101 //Cの内容がfの0ビットにはいり、fの各ビットが左にずれて、fの一番左のビットの内容がCにはいる。

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

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

    Z➡0。      //ステータスレジスタの値