【基本的な命令】
コンピュータの命令にはどんなものがあるのでしょうか。実は、とても
複雑な機能を実行するコンピュータも非常に単純な命令の集まりから出来ています。
命令の種類をおおざっぱに分けると下記の様な種類になります。
(1) 演算命令
いわゆる「計算」をする命令です。この計算には加算、減算などの算術
演算や、AND、ORなどの論理演算、左右シフトなどの命令を含みます。
演算対象は主にレジスタですが、特徴的なのは、入出力ポートやタイマ
も対象に含まれることです。
(2) 分岐命令、条件判断分岐命令
これは命令の実行順序を変更する命令で、プログラムカウンタが変更
されます。
GOTOという無条件分岐と、「もし何々だったら」という条件分岐とがあり
ます。
特徴的なのは、別の場所に記憶されているプログラム群を実行したら
元に戻れ、というCALL命令とRETURN命令があることです。
(3)ビット処理命令
レジスタ、入出力ポートに対して、1ビットだけの書き込み、読み出しをする命令
で、コンピュータに特徴的な命令です。
(4) その他制御命令
特殊な制御を指定する命令で、いずれもコンピュータの内部機能の制御を行います。
これにはSLEEPとCLRWDTがあります。
【PICシリーズの命令一覧】
PICシリーズのマイクロコンピュータで共通に使われる命令が下表で
非常に少ない数の命令で出来ているのが特徴です。
nemonic : 内容 :影響Flag :Cycle :オペコード
---------------------------------------------------------------------
ADDLW k : w + k -> w : C,DC,Z : 1 : 11 111x kkkk kkkk
ADDWF f,d : w + f -> dest : C,DC,Z : 1 : 00 0111 dfff ffff
ANDLW k : w AND k -> w : Z : 1 : 11 1001 kkkk kkkk
ANDWF f,d : w AND f -> dest : Z : 1 : 00 0101 dfff ffff
BCF f,b : 0 -> f<b> : None : 1 : 01 00bb bfff ffff
BSF f,b : 1 -> f<b> : None : 1 : 01 01bb bfff ffff
BTFSC f,b : skip if f<d>=0 : None : 1(2) : 01 10bb bfff ffff
BTFSS f,b : skip if f<d>=1 : None : 1(2) : 01 11bb bfff ffff
CALL adr : Subroutine Call : None : 2 : 10 0kkk kkkk kkkk
PC+1 -> TOS k -> PC<10:0> PCLATH<4:3> -> PC<12:11>
CLRF f : 00h -> f : Z(=1) : 1 : 00 0001 1fff ffff
CLRW : 00h -> w : Z(=1) : 1 : 00 0001 0xxx xxxx
CLRWDT : 00h -> WDT : PD,TO : 1 : 00 0000 0110 0100
0 -> WDT prescaler 1 -> PD(STATUS<3>) 1 -> TO(STATUS<4>)
COMF f,d : f -> dest : Z : 1 : 00 1001 dfff ffff
DECF f,d : f - 1 -> dest : Z : 1 : 00 0011 dfff ffff
DECFSZ f,d : f - 1 -> dest, : None : 1(2) : 00 1011 dfff ffff
skip if result=0
GOTO k : k -> PC<10:0> : None : 2 : 10 1kkk kkkk kkkk
PCLATH<4:3> -> PC<12:11>
INCF f,d : f + 1 -> dest : Z : 1 : 00 1010 dfff ffff
INCFSZ f,d : f + 1 -> dest, : None : 1(2) : 00 1111 dfff ffff
skip if result=0
IORLW k : w OR k -> w : Z : 1 : 11 1000 kkkk kkkk
IORWF f,d : w OR f -> dest : Z : 1 : 00 0100 dfff ffff
MOVLW k : k -> w : None : 1 : 11 00xx kkkk kkkk
MOVF f,d : f -> dest : Z : 1 : 00 1000 dfff ffff
MOVWF f : w -> f : None : 1 : 00 0000 1fff ffff
NOP : No Operation : None : 1 : 00 0000 0xx0 0000
RETFIE : 割り込み処理から : None : 2 : 00 0000 0000 1001
のリターン TOS -> PC, 1 -> GIE(INTCON<7>)
RETLW k : k -> w して : None : 2 : 11 01xx kkkk kkkk
リターン TOS -> PC
RETURN : サブルーチン : None : 2 : 00 0000 0000 1000
からのリターン TOS -> PC
RLF f,d : 左回転 : C : 1 : 00 1101 dfff ffff
f<n> -> d<n+1> f<7> -> C C -> d<0>
RRF f,d : 右回転 : C : 1 : 00 1100 dfff ffff
f<n> -> d<n-1> f<0> -> C C -> d<7>
SLEEP : スリープモード : PD,TO : 1 : 00 0000 0110 0011
00h -> WDT 1 -> PD(STATUS<3>) 0 -> TO(STATUS<4>)
SUBLW k : k - w -> w : C,CD,Z : 1 : 11 110x kkkk kkkk
SUBWF f,d : f - w -> dest : C,CD,Z : 1 : 00 0010 dfff ffff
SWAPF f,d : f<0:3> -> d<4:7>, : None : 1 : 00 1110 dfff ffff
f<4:7> -> d<0:3>
XORLW k : w XOR k -> w : Z : 1 : 11 1010 kkkk kkkk
XORWF f,d : w XOR f -> dest : Z : 1 : 00 0110 dfff ffff