指令集概述
指令操作数说明操作标志# 时钟数
算数和逻辑指令
ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1
ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1
ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2
SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1
SUBI Rd, K 减立即数 Rd ← Rd - K Z,C,N,V,H 1
SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1
SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1
SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2
AND Rd, Rr 逻辑与Rd ← Rd ? Rr Z,N,V 1
ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd ? K Z,N,V 1
OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1
ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1
EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1
COM Rd 1 的补码Rd ← 0xFF ? Rd Z,C,N,V 1
NEG Rd 2 的补码Rd ← 0x00 ? Rd Z,C,N,V,H 1
SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1
CBR Rd,K 寄存器位清零Rd ← Rd ? (0xFF - K) Z,N,V 1
INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1
DEC Rd 减一操作Rd ← Rd ? 1 Z,N,V 1
TST Rd 测试是否为零或负Rd ← Rd ? Rd Z,N,V 1
CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1
SER Rd 寄存器置位Rd ← 0xFF None 1
MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2
MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2
MULSU Rd, Rr 有符号数与无符号数乘法R1:R0 ← Rd x Rr Z,C 2
FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2
FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2
FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2
跳转指令
RJMP k 相对跳转PC ← PC + k + 1 无2
IJMP 间接跳转到 (Z) PC ← Z 无2
RCALL k 相对子程序调用PC ← PC + k + 1 无3
ICALL 间接调用(Z) PC ← Z 无3
RET 子程序返回PC ← STACK 无4
RETI 中断返回PC ← STACK I 4
CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr) PC ← PC + 2 or 3 无1 / 2 / 3
CP Rd,Rr 比较Rd ? Rr Z, N,V,C,H 1
CPC Rd,Rr 带进位比较Rd ? Rr ? C Z, N,V,C,H 1
CPI Rd,K 与立即数比较Rd ? K Z, N,V,C,H 1
SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3
SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3
SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3
SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令if (P(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3
BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s) = 1) then PC←PC+k + 1 无1 / 2
BRBC s, k 状态寄存器位为"0” 则跳过下一条指令if (SREG(s) = 0) then PC←PC+k + 1 无1 / 2
BREQ k 相等则跳转if (Z = 1) then PC ← PC + k + 1 无1 / 2
BRNE k 不相等则跳转if (Z = 0) then PC ← PC + k + 1 无1 / 2
BRCS k 进位位为"1” 则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2
BRCC k 进位位为"0” 则跳转if (C = 0) then PC ← PC + k + 1 无1 / 2
BRSH k 大于或等于则跳转 if (C = 0) then PC ← PC + k + 1 无1 / 2
BRLO k 小于则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2
BRMI k 负则跳转if (N = 1) then PC ← PC + k + 1 无1 / 2
BRPL k 正则跳转if (N = 0) then PC ← PC + k + 1 无1 / 2
BRGE k 有符号数大于或等于则跳转if (N ⊕ V= 0) then PC ← PC + k + 1 无1 / 2
BRLT k 有符号数负则跳转if (N ⊕ V= 1) then PC ← PC + k + 1 无1 / 2
BRHS k 半进位位为"1” 则跳转if (H = 1) then PC ← PC + k + 1 无1 / 2
BRHC k 半进位位为"0” 则跳转if (H = 0) then PC ← PC + k + 1 无1 / 2
BRTS k T 为"1” 则跳转if (T = 1) then PC ← PC + k + 1 无1 / 2
BRTC k T 为"0” 则跳转if (T = 0) then PC ← PC + k + 1 无1 / 2
BRVS k 溢出标志为"1” 则跳转if (V = 1) then PC ← PC + k + 1 无1 / 2
BRVC k 溢出标志为"0” 则跳转if (V = 0) then PC ← PC + k + 1 无1 / 2
274 ATmega8(L)
2486N–AVR–07/04
指令操作数说明操作标志# 时钟数
BRIE k 中断使能再跳转if ( I = 1) then PC ← PC + k + 1 无1 / 2
BRID k 中断禁用再跳转if ( I = 0) then PC ← PC + k + 1 无1 / 2
数据传送指令
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 加载间接寻址数据Rd ← (X) 无2
LD Rd, X+ 加载间接寻址数据,然后地址加一Rd ← (X), X ← X + 1 无2
LD Rd, - X 地址减一后加载间接寻址数据X ← X - 1, Rd ← (X) 无2
LD Rd, Y 加载间接寻址数据Rd ← (Y) 无2
LD Rd, Y+ 加载间接寻址数据,然后地址加一Rd ← (Y), Y ← Y + 1 无2
LD Rd, - Y 地址减一后加载间接寻址数据Y ← Y - 1, Rd ← (Y) 无2
LDD Rd,Y+q 加载带偏移量的间接寻址数据Rd ← (Y + q) 无2
LD Rd, Z 加载间接寻址数据Rd ← (Z) 无2
LD Rd, Z+ 加载间接寻址数据,然后地址加一Rd ← (Z), Z ← Z+1 无2
LD Rd, -Z 地址减一后加载间接寻址数据Z ← Z - 1, Rd ← (Z) 无2
LDD Rd, Z+q 加载带偏移量的间接寻址数据Rd ← (Z + q) 无2
LDS Rd, k 从SRAM 加载数据Rd ← (k) 无2
ST X, Rr 以间接寻址方式存储数据(X) ← Rr 无2
ST X+, Rr 以间接寻址方式存储数据,然后地址加一(X) ← Rr, X ← X + 1 无2
ST - X, Rr 地址减一后以间接寻址方式存储数据X ← X - 1, (X) ← Rr 无2
ST Y, Rr 加载间接寻址数据(Y) ← Rr 无2
ST Y+, Rr 加载间接寻址数据,然后地址加一(Y) ← Rr, Y ← Y + 1 无2
ST - Y, Rr 地址减一后加载间接寻址数据Y ← Y - 1, (Y) ← Rr 无2
STD Y+q,Rr 加载带偏移量的间接寻址数据(Y + q) ← Rr 无2
ST Z, Rr 加载间接寻址数据(Z) ← Rr 无2
ST Z+, Rr 加载间接寻址数据,然后地址加一(Z) ← Rr, Z ← Z + 1 无2
ST -Z, Rr 地址减一后加载间接寻址数据Z ← Z - 1, (Z) ← Rr 无2
STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q) ← Rr 无2
STS k, Rr 从SRAM 加载数据(k) ← Rr 无2
LPM 加载程序空间的数据R0 ← (Z) 无3
LPM Rd, Z 加载程序空间的数据Rd ← (Z) 无3
LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z), Z ← Z+1 无3
SPM 保存程序空间的数据(Z) ← R1:R0 无-
IN Rd, P 从I/O 端口读数据Rd ← P 无1
OUT P, Rr 输出端口P ← Rr 无1
PUSH Rr 将寄存器推入堆栈STACK ← Rr 无2
POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无2
位和位测试指令
SBI P,b I/O 寄存器位置位I/O(P,b) ← 1 无2
CBI P,b I/O 寄存器位清零I/O(P,b) ← 0 无2
LSL Rd 逻辑左移Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V 1
LSR Rd 逻辑右移Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1
ROL Rd 带进位循环左移Rd(0)←C,Rd(n+1)← Rd(n),C←Rd(7) Z,C,N,V 1
ROR Rd 带进位循环右移Rd(7)←C,Rd(n)← Rd(n+1),C←Rd(0) Z,C,N,V 1
ASR Rd 算术右移Rd(n) ← Rd(n+1), n=0..6 Z,C,N,V 1
SWAP Rd 高低半字节交换Rd(3..0)←Rd(7..4),Rd(7..4)←Rd(3..0) 无1
BSET s 标志置位SREG(s) ← 1 SREG(s) 1
BCLR s 标志清零SREG(s) ← 0 SREG(s) 1
BST Rr, b 从寄存器将位赋给T T ← Rr(b) T 1
BLD Rd, b 将T 赋给寄存器位Rd(b) ← T 无1
SEC 进位位置位C ← 1 C 1
CLC 进位位清零C ← 0 C 1
SEN 负标志位置位N ← 1 N 1
CLN 负标志位清零N ← 0 N 1
SEZ 零标志位置位Z ← 1 Z 1
CLZ 零标志位清零Z ← 0 Z 1
SEI 全局中断使能I ← 1 I 1
CLI 全局中断禁用I ← 0 I 1
SES 符号测试标志位置位S ← 1 S 1
CLS 符号测试标志位清零S ← 0 S 1
SEV 2 的补码溢出标志置位V ← 1 V 1
CLV 2 的补码溢出标志清零V ← 0 V 1
SET SREG 的T 置位T ← 1 T 1
指令集概述
275
ATmega8(L)
2486N–AVR–07/04
指令操作数说明操作标志# 时钟数
CLT SREG 的T 清零T ← 0 T 1
SEH SREG 的半进位标志置位H ← 1 H 1
CLH SREG 的半进位标志清零H ← 0 H 1
MCU 控制指令
NOP 空操作无1
SLEEP 休眠( 见对睡眠功能的特殊说明) 无1
WDR 复位看门狗( 见对WDR/timer 的特殊说明) 无1