AVR命令セット

AVRの命令セットは大きく5つの命令群

 「算術・論理演算命令」, 「分岐命令」, 「データ転送命令」, 「シフト・ビット操作命令」, 「MCU命令」

で構成されています。

※ K: 8bit定数, K6: 6bit定数, Rd, Rr: 汎用レジスタ, X,Y,Z: X,Y,Zレジスタ, b: ビット, k: 7, 12, 16bit定数
  q: 符号無し6bit変位, s: ステータスフラグ(CZNVXHTI), P: I/Oレジスタ

1. 算術・論理演算命令
ニーモニック
オペランド
意   味
動  作
フラグ
クロック
ADD
Rd, Rr
汎用レジスタ間の加算
Rd ← Rd + Rr
  HSVNZC
1
ADC Rd, Rr キャリーを含めた汎用レジスタ間の加算 Rd ← Rd + Rr + C   HSVNZC 1
ADIW Rd, K6 即値の語(ワード)長加算 RdH:RdL ← RdH:RdL + K6    SVNZC 2
SUB Rd, Rr 汎用レジスタ間の減算 Rd ← Rd - Rr   HSVNZC 1
SUBI Rd, K 汎用レジスタから即値の減算 Rd ← Rd  - K   HSVNZC 1
SBIW Rd, K6 即値の語(ワード)長減算 RdH:RdL ← RdH:RdL - K6   SVNZC 2
SBC Rd, Rr キャリーを含めた汎用レジスタ間の減算 Rd ← Rd - Rr - C   HSVNZC 1
SBCI Rd, K 汎用レジスタからキャリーと即値の減算 Rd ← Rd - K - C   HSVNZC 1
AND Rd, Rr 汎用レジスタ間の論理積(AND) Rd ← Rd AND Rr   S0NZ 1
ANDI Rd, K 汎用レジスタと即値の論理積(AND) Rd ← Rd AND K   S0NZ
OR Rd, Rr 汎用レジスタ間の論理和(OR) Rd ← Rd OR Rr   S0NZ 1
ORI Rd, K 汎用レジスタと即値の論理和(OR) Rd ← Rd OR K   S0NZ 1
EOR Rd, Rr 汎用レジスタ間の排他的論理和(Ex-OR) Rd ← Rd EOR Rr   S0NZ 1
COM Rd 1の補数(論理反転) Rd ← $FF - Rd   S0NZ 1
NEG Rd 2の補数 Rd ← $00 - Rd   HSVNZC 1
SBR Rd, K 汎用レジスタの(複数)ビット設定(1) Rd ← Rd OR K   S0NZ 1
CBR Rd, K 汎用レジスタの(複数)ビット解除(0) Rd ← Rd AND ($FF - K)   S0NZ 1
INC Rd 汎用レジスタの増加(+1) Rd ← Rd + 1   SVNZC 1
DEC Rd 汎用レジスタの減少(-1) Rd ← Rd - 1   SVNZC 1
TST Rd 汎用レジスタのゼロとマイナス検査 Rd ← Rd AND Rd   S0NZ 1
CLR Rd 汎用レジスタの全0設定(=$00) Rd ← Rd EOR Rd  , , ,0,0,0,1,
1
SER Rd 汎用レジスタの全1設定(=$FF) Rd ← $FF  
1
MUL Rd, Rr 符号なし間の乗算 R1:R0 ← RdxRr (UxU)             ZC 2
MULS Rd, Rr 符号付き間の乗算 R1:R0 ← RdxRr (SxS)             ZC 2
MULSU Rd, Rr 符号付きと符号なしの乗算 R1:R0 ← RdxRr (SxU)             ZC 2
FMUL Rd, Rr 符号なし間の固定小数点乗算 R1:R0 ← (RdxRr)<<1 (UxU)             ZC 2
FMULS Rd, Rr 符号付き間の固定小数点乗算 R1:R0 ← (RdxRr)<<1 (SxS)             ZC 2
FMULSU Rd, Rr 符号付きと符号なしの固定小数点乗算 R1:R0 ← (RdxRr)<<1 (SxU)             ZC 2


2. 分岐命令
ニーモニック
オペランド
意   味
動  作
フラグ
クロック
RJMP
k 相対無条件分岐 PC ← PC + k + 1
2
IJMP
Zレジスタ間接無条件分岐 PC ← Z
2
JMP k 絶対無条件分岐 PC ← k
3
RCALL k 相対サブルーチン呼び出し STACK ← PC, PC ← PC + k + 1
3
ICALL
Zレジスタ間接サブルーチン呼び出し STACK ← PC, PC ← Z
3
CALL k 絶対サブルーチン呼び出し STACK ← PC, PC ← k
4
RET
サブルーチンからの復帰 PC ← STACK
4
RETI
割り込みからの復帰 PC ← STACK
4
CPSE Rd, Rr 汎用レジスタ間比較、一致でスキップ Rd=Rrなら, PC ← PC + 2or3
1/2,3
CP Rd, Rr 汎用レジスタ間の比較 Rd - Rr HSVNZC
1
CPC Rd, Rr キャリーを含めた汎用レジスタ間の比較 Rd - Rr - C HSVNZC 1
CPI Rd, K 汎用レジスタと即値の比較 Rd - K HSVNZC 1
SBRC Rr, b 汎用レジスタのビットが解除(0)でスキップ Rr(b)=0なら, PC ← PC + 2or3
1/2,3
SBRS Rr, b 汎用レジスタのビットが設定(1)でスキップ Rr(b)=1なら, PC ← PC + 2or3
1/2,3
SBIC P, b I/Oレジスタのビットが解除(0)でスキップ P(b)=0なら, PC ← PC + 2or3
1/2,3
SBIS P, b I/Oレジスタのビットが設定(1)でスキップ P(b)=1なら, PC ← PC + 2or3
1/2,3
BRBS s, k ステータス フラグが設定(1)で分岐 SREG(s)=1なら, PC ← PC + K + 1
1/2
BRBC s, k ステータス フラグが解除(0)で分岐
SREG(s)=0なら, PC ← PC + K + 1
1/2
BREQ k 一致で分岐 Z=1なら, PC ← PC + K + 1
1/2
BRNE k 不一致で分岐 Z=0なら, PC ← PC + K + 1
1/2
BRCS k キャリー フラグが設定(1)で分岐 C=1なら, PC ← PC + K + 1
1/2
BRCC k キャリー フラグが解除(0)で分岐 C=0なら, PC ← PC + K + 1
1/2
BRSH k 符号なしの≧で分岐 C=0なら, PC ← PC + K + 1
1/2
BRLO k 符号なしの<で分岐 C=1なら, PC ← PC + K + 1
1/2
BRMI k -(マイナス)で分岐 N=1なら, PC ← PC + K + 1
1/2
BRPL k +(プラス)で分岐 N=0なら, PC ← PC + K + 1
1/2
BRGE k 符号付きの≧で分岐 (N EOR V)=0なら, PC ← PC + K + 1
1/2
BRLT k 符号付きの<で分岐 (N EOR V)=1なら, PC ← PC + K + 1
1/2
BRHS k ハーフキャリー フラグが設定(1)で分岐 H=1なら, PC ← PC + K + 1
1/2
BRHC k ハーフキャリー フラグが解除(0)で分岐 H=0なら, PC ← PC + K + 1
1/2
BRTS k 一時フラグが設定(1)で分岐 T=1なら, PC ← PC + K + 1
1/2
BRTC k 一時フラグが解除(0)で分岐 T=0なら, PC ← PC + K + 1
1/2
BRVS k 2の補数溢れフラグが設定(1)で分岐 V=1なら, PC ← PC + K + 1
1/2
BRVC k 2の補数溢れフラグが解除(0)で分岐 V=0なら, PC ← PC + K + 1
1/2
BRIE k 割り込み許可で分岐 I=1なら, PC ← PC + K + 1
1/2
BRID k 割り込み禁止で分岐 I=0なら, PC ← PC + K + 1
1/2


3. データ移動命令
ニーモニック
オペランド
意   味
動  作
フラグ
クロック
MOV Rd, Rr 汎用レジスタ間の複写 Rd ← Rr
1
MOVW Rd, Rr 汎用レジスタ対間の複写 Rd+1:Rd ← Rr+1:Rr
1
LDI Rd, K 即値の取得 Rd ← K
1
LD Rd, X Xレジスタ間接での取得 Rd ← (X)
2
LD Rd, X+ 事後増加付きXレジスタ間接での取得 Rd ← (X), X ← X + 1
2
LD Rd, -X 事前減少付きXレジスタ間接での取得 X ← X - 1, Rd ← (X)
2
LD Rd, Y Yレジスタ間接での取得 Rd ← (Y)
2
LD Rd, Y+ 事後増加付きYレジスタ間接での取得 Rd ← (Y), Y ← Y + 1
2
LD Rd, -Y 事前減少付きYレジスタ間接での取得 Y ← Y - 1, Rd ← (Y)
2
LDD Rd, Y+q 変位付きYレジスタ間接での取得 Rd ← (Y + q)
2
LD Rd, Z Zレジスタ間接での取得 Rd ← (Z)
2
LD Rd, Z+ 事後増加付きZレジスタ間接での取得 Rd ← (Z), Z ← Z + 1
2
LD Rd, -Z 事前減少付きZレジスタ間接での取得 Z ← Z - 1, Rd ← (Z)
2
LDD Rd, Z+q 変位付きZレジスタ間接での取得 Rd ← (Z + q)
2
LDS Rd, k データ空間(SRAM)から直接取得 Rd ← (k)
2
ST X, Rr Xレジスタ間接での設定 (X) ← Rr
2
ST X+, Rr 事後増加付きXレジスタ間接での設定 (X) ← Rr, X ← X + 1
2
ST -X, Rr 事前減少付きXレジスタ間接での設定 X ← X - 1, (X) ← Rr
2
ST Y, Rr Yレジスタ間接での設定 (Y) ← Rr
2
ST Y+, Rr 事後増加付きYレジスタ間接での設定 (Y) ← Rr, Y ← Y + 1
2
ST -Y, Rr 事前減少付きYレジスタ間接での設定 Y ← Y - 1, (Y) ← Rr
2
STD Y+q, Rr 変位付きYレジスタ間接での設定 (Y + q) ← Rr
2
ST Z, Rr Zレジスタ間接での設定 (Z) ← Rr
2
ST Z+, Rr 事後増加付きZレジスタ間接での設定 (Z) ← Rr, Z ← Z + 1
2
ST -Z, Rr 事前減少付きZレジスタ間接での設定 Z ← Z - 1, (Z) ← Rr
2
STD Z+q, Rr 変位付きZレジスタ間接での設定 (Z + q) ← Rr
2
STS k, Rr データ空間(SRAM)へ直接設定 (k) ← Rr
2
LPM
プログラム領域からZレジスタ間接での取得 R0 ← (Z)
3
LPM Rd, Z 同上 (任意のレジスタへ) Rd ← (Z)
3
LPM Rd, Z+ 同上 (事後増加付き) Rd ← (Z), Z ← Z + 1
3
SPM
プログラム領域へZ レジスタ間接での設定 (Z) ← R1:R0
-
IN Rd, P I/Oレジスタからの入力 Rd ← P
1
OUT P, Rr I/Oレジスタへの出力 P ← Rr
1
PUSH Rr 汎用レジスタをスタックへ保存 STACK ← Rr
2
POP Rd スタックから汎用レジスタへ復帰 Rd ← STACK
2


4. ビット関係命令
ニーモニック
オペランド
意   味
動  作
フラグ
クロック
SBI P, b I/Oレジスタのビット設定(1) I/O(P,b) ← 1
2
CBI P, b I/Oレジスタのビット解除(0) I/O(P,b) ← 0
2
LSL Rd 論理的左シフト
Rd(n+1) ← Rd(n), Rd(0) ← 0
1
LSR Rd 論理的右シフト Rd(n) ← Rd(n+1), Rd(7) ← 0
1
ROL Rd キャリーを含めた左回転 Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7)
1
ROR Rd キャリーを含めた右回転 Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0)
1
ASR Rd 算術的右シフト Rd(n) ← Rd(n+1), n=0〜6
1
SWAP Rd ニブル(4ビット)上位/下位交換 Rd(7〜4) ⇔ Rd(3〜0)
1
BSET s ステータス レジスタのビット設定(1) SREG(s) ← 1
1
BCLR s ステータス レジスタのビット解除(0) SREG(s) ← 0
1
BST Rr, b 汎用レジスタのビットを一時フラグへ移動 T ← Rr(b)
1
BLD Rd, b 一時フラグを汎用レジスタのビットへ移動 Rd(b) ← T
1
SEC
キャリー フラグを設定(1) C ← 1
1
CLC
キャリー フラグを解除(0) C ← 0
1
SEN
負フラグを設定(1) N ← 1
1
CLN
負フラグを解除(0) N ← 0
1
SEZ
ゼロ フラグを設定(1) Z ← 1
1
CLZ
ゼロ フラグを解除(0) Z ← 0
1
SEI
全割り込み許可 I ← 1
1
CLI
全割り込み禁止 I ← 0
1
SES
符号フラグを設定(1) S ← 1
1
CLS
符号フラグを解除(0) S ← 0
1
SEV
2の補数溢れフラグを設定(1) V ← 1
1
CLV
2の補数溢れフラグを解除(0) V ← 0
1
SET
一時フラグを設定(1) T ← 1
1
CLT
一時フラグを解除(0) T ← 0
1
SEH
ハーフキャリー フラグを設定(1) H ← 1
1
CLH
 ハーフキャリー フラグを解除(0) H ← 0
1


5. MCU命令
ニーモニック
オペランド
意   味
動  作
フラグ
クロック
NOP
無操作


SLEEP
休止形態開始


WDR
ウォッチドッグ タイマ リセット


BREAK
一時停止 内蔵デバッグWIRE機能専用