命令一覧とその解説

1.命令の概要

命令一覧を表1に示します。

表1 命令一覧
凡例
Rd:データの読み出し元・結果の格納先レジスタ
Rs:データの読み出し元レジスタ
x:不定(何を書いても無視されます)
k:定数
X:Xレジスタ=R13
Y:Yレジスタ=R14
SP:スタックポインタ=R15
PC:プログラムカウンタ
I:割り込み許可フラグ(1:割り込み許可、0:割り込み禁止)
Z:ゼロフラグ(演算後のRdが0の場合1)
C:キャリフラグ(演算結果の16bit目が反映)
N:ネガティブフラグ(演算後のRdの15bit目が反映)
命令ニーモニック命令の概要フラグ変化
15~12bit目11~8bit目7~4bit目3~0bit目


0xxxNOP何もしないなし
10RdRsADD,Rd,Rs加算(Rd+Rs)Z,C,N

1RdRsSUB,Rd,Rs減算(Rd-Rs)Z,C,N

2RdRsAND,Rd,Rs論理積Z,N

3RdRsOR,Rd,Rs論理和Z,N

4RdRsXOR,Rd,Rs排他的論理和Z,N

5RdRsMOV,Rd,Rs移動Z,N

6RdRsNOT,Rd,Rs否定Z,N

7RdRsADC,Rd,Rsキャリ付き加算Z,C,N

8RdRsSBC,Rd,Rsボロー付き減算Z,C,N

9RdRsSHL,Rd,Rs左ローテートシフトZ,C,N

aRdRsSHR,Rd,Rs右ローテートシフトZ,C,N
20RdxLD,Rd,Yメモリからの読み込みなし

8xRsST,Y,Rsメモリへの書き込みなし
30RdxPOP,Rd(SP+1)の内容をRdに格納した後SPに1を加算なし

1xxRET(SP+1)の内容をPCに設定したあとにSPに1を加算なし

2
x
x
RETI
割り込みからの復帰、Iの変化以外はRET同様
I

3
x
x
POPS
ステータスレジスタをPOP
(I),Z,C,N

8xRsPUSH,RsSPの指す場所にRsを格納した後にSPから1を減算なし

9xxSPC(PC+2)をSPの指す場所へ格納した後にSPから1を減算なし

a
x
x
PSHS
ステータスレジスタをPUSH
なし

b
x
x
SEI
Iをセット
I

c
x
x
CLI
Iをクリア
I

d
x
x
(SPCI)
割り込み時の内部処理用命令(使用は非推奨)
I
40xxJMP,XXレジスタの値へ無条件分岐なし

1xxBZ,XZ=1ならばXレジスタの値へ分岐なし

2xxBC,XC=1ならばXレジスタの値へ分岐なし

3xxBN,XN=1ならばXレジスタの値へ分岐なし

4k
k
BZ,-kZ=1ならば(PC-k)へ分岐なし

5kkBC,-kC=1ならば(PC-k)へ分岐なし

6kkBN,-kN=1ならば(PC-k)へ分岐なし

7kkBZ,+kZ=1ならば(PC+k)へ分岐なし

8kkBC,+kC=1ならば(PC+k)へ分岐なし

9kkBN,+kN=1ならば(PC+k)へ分岐なし
5kkkJMP,kkへ無条件分岐なし
6kkkRJMP,-k(PC-k)へ無条件分岐なし
7kkkRJMP,+k(PC+k)へ無条件分岐なし
8RdkkLLI,Rd,kRdの7~0bit目にkを代入なし
9RdkkLHI,Rd,kRdの15~8bit目にkを代入なし


表に示す命令はすべて3クロックで実行されます。

2.命令の解説

2-1.NOP命令(0???h)

何もしません。フラグにも変化を与えませんが、実行には3クロックを要します。

2-2.演算系命令(1???h)

最上位4bitが1hである命令は演算を行う命令です。
基本的にRdとRsを引数とし、演算の結果をRsに格納します。
例えば、ADD,R0,R1(1001h)の場合、R0とR1の算術和がR0に格納されます。

例外として、MOVはRsをRdにコピーするだけで、元のRdの内容に結果が影響されません。
同様にNOTはRsの否定をRdにコピーするだけです。SHL,SHRも同様に、元のRdの内容が結果に影響しません。

ローテートシフトはキャリも含めて回転します。
SHLのとき、CにはRsの15bit目が格納されます。
SHRのとき、CにはRsの0bit目が格納されます。

2-3.メモリアクセス系命令(2???h)

最上位4bitが2hである命令はメモリアクセスを発生する命令です。
2hから始まる命令はメモリのアドレス指定にYレジスタ(R14)を使います。
LD,Rd,Y(20??h)では、Yレジスタの指すアドレスにあるデータをRdに格納します。
ST,Y,Rs(28??h)では、Rsの内容をYレジスタの指すアドレスに格納します。

2-4.スタックポインタ操作系命令(3???h)

最上位4bitが3hである命令は主にスタックポインタを操作する命令です。
PUSHとPOPは単なるスタックのプッシュ操作とポップ操作です。
RETとSPCはサブルーチンの実行に使います。
はじめにSPC命令によって(PC+2)をスタックに保存した後、
何らかの分岐命令を実行することによってサブルーチンへ飛びます。
その後、RET命令を実行することによって、PC+2、すなわち、
分岐命令の直後に復帰することができます。
例:サブルーチンの呼び出しと復帰
SPC //PC+2を保存
RJMP,+2 //2つ先へ飛ぶ
RJMP,+0 //ここで停止
ADD,R0,R1 //ここからサブルーチン
RET //SPCから見て2つ先へ分岐
このような仕様のため、サブルーチンの呼出に2命令、つまり6サイクルを要しますが、
サブルーチンへの分岐にすべての分岐命令を用いることができるという利点があります。

SEIとCLIはそれぞれ割り込み許可フラグのセットとクリアです。
PSHSはステータスレジスタを待避させます。
POPSはステータスレジスタを復帰させます。
RETIは動作はRETとほぼ変わりませんが、RETI命令の実行後はIフラグが有効になります。
なお、SPCI命令は割り込み発生後内部の処理を行う際に実行される命令です。
PCをSPの指す場所に格納した後、SPから1減算します。その後、PCに0001hを代入します。
SPCI命令が実行されると、RETI命令が実行されるまでの間、割り込みが無効となります。
SPCI命令を用いてソフトウェア割り込みを発生させることもできますが、
割り込み先で格納したPCの値に1を足すという操作をする必要があり、割り込みコントローラを用いた
割り込みと大差ない速度になると考えられます。よって、複雑な操作を必要とするSPCI命令を用いたソフトウェア割り込みは
推奨されません。

2-5.分岐系命令その1(4???h)

最上位4bitが4hである命令はすべて分岐系命令です。
JMP,X(4000h)を除いて、すべて条件分岐命令です。
4hから始まる分岐命令に関しては、分岐先の値として、
Xレジスタの値を用いる命令(4000h~4300h)、
PCから命令の7~0bit目の値を引いた値を用いる命令(44??h~46??h)、
PCから命令の7~0bit目の値を足した値を用いる命令(47??h~49??h)、
の3種類が存在します。
Xレジスタは16bitであるので、メモリ空間のすべての範囲をカバーします。
しかし、命令内の定数を用いる命令(44??h~49??h)では、
定数が8bit幅であるため、メモリ空間のすべてをカバーできないことに注意する必要があります。

2-6.分岐系命令その2(5???h~7???h)

最上位4bitが5h,6h,7hの命令は無条件分岐命令です。
これらの命令は最上位4bit以外を分岐先指定のために用います。
JMP,k(5???h)は、分岐先の値を命令の11bit目~0bit目の値とします。
RJMP,-k(6???h)は、分岐先の値をPC-(命令の11bit目~0bit目)の値とします。
RJMP,+k(7???h)は、分岐先の値をPC+(命令の11bit目~0bit目)の値とします。
これらの命令は、分岐先指定のための定数が12bit幅であるので、
メモリ空間のすべてをカバーできないことに注意する必要があります。

2-7.即値の読み込み命令(8???h,9???h)

最上位4bitが8h,9hの命令は即値をレジスタへ格納する命令です。
LLI,Rd,k(8???h)は、Rdの下位8bitにkの値を格納します。
この時、Rdの上位8bitには何ら影響を与えません。
LHI,Rd,k(9???h)は、Rdの上位8bitにkの値を格納します。
この時、Rdの下位8bitには何ら影響を与えません。
例:即値の読み込み
LLI,R1,02h //R1の下位8bitに2を格納
ADD,R0,R1 //R1とR0を足してR0に格納
LHI,R0,ffh //R0の上位8bitにffhを格納
//この時点でR0=ff02hとなる
 


Copyright(C) 2010 R.Suzuki  All rights reserved.