Atmel AVR Assembler

AVR 汇编器帮助

欢迎使用 ATMEL AVR 汇编器。

  • 新增功能

  • 疑难解答与处理

请选择下列的帮助项目：

  • 常用信息
  • 汇编器源文件
  • 指令总述
    • 算术和逻辑运算指令
    • 比较和转移指令
    • 数据传送指令
    • 位操作和位测试指令
  • 汇编器伪指令
  • 表达式
    • 操作数
    • 运算符
    • 函数
  • AVR汇编器2的特性

汇编器是一个可以独立运行也可以在AVR Studio中被自动调用的WIN32程序。本帮助中还包含了关于如何使用命令行汇编器的详细说明。

各芯片的指令集摘要：

各芯片的指令集摘要：

各种不同的芯片有不同的指令集。用下面的链接可以找到您需要的芯片的指令集。

  • AT90S1200
  • AT90S2313
  • AT90S2323 和 AT90S2343
  • AT90S2333 和 AT90S4433
  • AT90S4414 和 AT90S8515
  • AT90S4434 和 AT90S8535
  • AT90C8534
  • ATtiny10, ATtiny11 和 ATtiny12
  • ATtiny13/ATtiny2313
  • ATtiny25/ATtiny45/ATtiny85
  • ATtiny15
  • ATtiny22
  • ATtiny26
  • ATtiny28
  • ATmega8 / ATmega48/88/168 / ATmega8515 / ATmega8535
  • ATmega16
  • ATmega161
  • ATmega162
  • ATmega163
  • ATmega169/165/329/325/3250/649/645
  • ATmega32
  • ATmega323
  • ATmega103
  • ATmega64/128, ATCAN128
  • ATmega406
  • ATmega2560/2561
  • AT90PWM2/3


新增功能

新版本的新增功能

AVR 汇编器2.0 2005年1月发布

  • AVRASM2 是目前AVR Studio的默认汇编器。按照用户对测试版的反馈，修正了很多漏洞，并添加了很多功能。

新的包含文件和XML转换器

  • 一整套与AVRASM2相关的新包含文件。这将解决大多数的AVRASM2测试版中存在的不足。

  • XML 转换器 产生了这个版本中新的包含文件。这个工具除了可以产生汇编包含文件外，还可以用来产生AVR-GCC的头文件和IAR C的头文件和连接文件。

AVR 汇编器v1.77.2 2005年1月发布

  • 旧的汇编器和包含文件仍然包含在这个AVR Studio版本中。对于已经存在的工程也许可以选择使用它，但是它将不再支持新添加的芯片。这是最后的AVRASM1版本。

新AVR芯片的支持

  • ATmega2561 / ATmega2560

  • AT90PWM2 / AT90PWM3

  • ATtiny25/45/85

  • ATmega406

以前版本

AVR 汇编器v1.77.1 2004年10月发布

  • 添加了ATtiny25/45/85, AT90PWM2/3, ATmega325/645 芯片伪指令

AVR 汇编器2 测试版 2004年6月

  • 一种拥有很多新功能的新版AVR汇编器： AVR 汇编器2

AVR 汇编器v1.76 2004年5月发布

  • 包含了ATmega165芯片的伪指令。

  • 检测并报告向前引用标签的错误用法，这种错误导致了相对转移中不正确的偏移量的计算。

  • 修正了某些芯片指令集的缺陷。

  • 汇编器认可'#'作为注释符(与'；'相同)，使它忽视AVRASM2预处理伪指令。

AVR 汇编器v1.75 2004年3月发布

  • 包含了 ATmega88, ATmega168, ATmega329 和 AT90CAN128等芯片的伪指令。

  • DSEG 伪指令对有扩展IO的芯片做了校正。

  • 隐藏相对转移。对于拥有大于4K字程序存储器的芯片来说，使用这个选项将产生不可预料的结果，它应该被关掉。如果它被打开，汇编器会产生警告。

  • 现在汇编器将会对产生不明确行为的操作数组合提出警告，例如 'ld r30,z+' 。

  • 现在汇编器支持在字符常量和字符串中使用扩展ASCII字符。

  • 修正了.db伪指令中不能检测语法错误的问题。

AVR 汇编器v1.74 2003年10月发布

  • 新的条件汇编伪指令。请注意从这个测试版开始汇编伪指令由#改成了点(.)。

    .ifdef <symbol>
    .ifndef <symbol>
    .if <expression>
    .elif <expression>
    .else
    .endif

    更详细的描述请参考这里

  • 输出伪指令
    .message "str"
    .error "str"

  • 修正了生成.hex文件时的一个bug。如：当试图用.org将代码写到0x07FFF处时，生成的.hex文件确将代码放在了0XFFFE处。这个缺陷现在已经修正了。

  • 添加了对于 ATtiny2313 和 ATmega48芯片的伪指令。

AVR 汇编器v1.60 2003年6月24日发布

  • 添加了ATtiny13芯片的伪指令。

AVR 汇编器v1.56 2002年4月30日发布

  • 添加了ATmega162, ATmega169, ATmega8515, ATmega8535, ATtiny26, AT86RF401等芯片的伪指令。

  • 为上述芯片添加了*.def *.inc文件。


Atmel AVR Assembler - Source

汇编器源文件

汇编器是基于源文件工作的，源文件包含指令，标号和伪指令。指令和伪指令通常都带有操作数。

代码行的长度限定在120字符以内。

每一行代码前面都可以加上一个标号（以冒号结尾的字符串）。标号可以作为跳转和分支指令的目标，或者程序存储区、RAM中的变量名字。

输入的代码行可以有以下四种格式：

[标号:] 伪指令 [操作数] [注释]
[标号1:] 指令[操作数] [注释]
注释
空行
注释有下面的格式：
;[文本]
括号中的内容是可选的，汇编器将忽略注释符（；）到行尾（EOL）的文本。标号、指令和助记指令将在后面的内容中详细介绍。

如果你使用 AVR 汇编器2 (AVRASM2)请参考相关的 AVR 汇编器2的语法。

例子:

label:   .EQU var1=100 ; 将var1定义成100 (伪指令)
         .EQU var2=200 ; 将var2定义成200

test:    rjmp test     ; 无限循环(指令)
                       ; 纯注释行

                       ; 另一个注释行

注意对标号、伪指令、注释和指令的列位置没有限制。


Atmel AVR Assembler - General

常用信息

编译器将源代码编译成目标代码（Object code）。生成的这种目标代码可以应用到仿真器中，例如ATMEL AVR Simulator，或者如ATMEL AVR In-Circuit Emulator的仿真器。汇编器同时也生成了PROMable代码（PROMable code），可以直接下载到AVR单片机的程序存储器中运行。

编译器生成的代码具有固定的地址分配，因此不用链接（Link）。

这里仅粗略的描述了AVR系列单片机的主要指令，对于其他的或更详细的指令描述请参考AVR单片机各芯片的数据手册（Data sheet）。


Atmel AVR Assembler - Instructions

指令助记符

汇编器支持指令系统中的助记指令。下面的表格总结了这些指令助记符及它们的参数。对于这些指令的详细描述，请参考AVR数据手册。

算术和逻辑运算指令

指令 | 操作数 | 描述 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位加 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位加 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位减 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位减 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 减带进位的立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 逻辑与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 逻辑或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 二进制反码 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 二进制补码 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 置位寄存器中的指定位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器中的指定位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 寄存器内容加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 寄存器内容减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测结果是否为零或负数 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器中所有位清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 置位寄存器中所有位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号数乘有符号数 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号定点小数车乘法 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号定点小数乘法 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 有符号定点小数和无符号定点小数乘法 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 描述 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转 (到Z指定的地址) | PC = Z | 无 | 2
EIJMP | 无 | 扩展的间接跳转(到Z指定的地址) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接调用(到Z指定的地址) | STACK = PC+1, PC = Z | 无 | 3/4*
EICALL | 无 | 扩展的间接调用(到Z指定的地址) | STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND | 无 | 4*
CALL | k | 直接调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较指令,如果相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | t如果I/O寄存器中的指定位为0跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | 如果状态寄存器指定位为0转移 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | 如果状态寄存器指定位为1转移 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 如果相等则转移 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 如果不相等则转移 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | 如果进位标志为1则转移 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | 如果进位标志为0则转移 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 如果大于等于则转移 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 如果小于则转移 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 负值转移 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 正值转移 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于则转移 (有符号数) | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于则转移 (有符号数) | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 如果半进位标志为1则转移 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 如果半进位标志为0则转移 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 如果T标志为1则转移 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 如果T标志为0则转移 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 如果溢出标志为1则转移 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 如果溢出标志为0则转移 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 如果中断允许则转移 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 如果中断不允许则转移 | if(I==0) PC = PC + k + 1 | 无 | 1/2

* 上述数据存储器存取的指令周期数是指对于内部存储器的访问，不适用于外部RAM存储器接口。当有外扩存储器，且堆栈设置在外部存储器中时，对于16位 (128KB的程序存储器)及其以下芯片的指令CALL、 ICALL、 EICALL、 RCALL、 RET 和 RETI，在内部存储器加3个指令周期的基础上，外扩存储器的每一个等待状态再加2个指令周期；而大于128KB的程序存储器芯片，在内部存储器加5个指令周期的基础上，每个等待状态再加3个指令周期。

数据传送指令

指令 | 操作数 | 描述 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 复制寄存器值 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 复制寄存器对的值 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | SRAM数据直接送寄存器 | Rd = (k) | 无 | 2*
LD | Rd,X | SRAM数据间接送寄存器 | Rd = (X) | 无 | 2*
LD | Rd,X+ | 带后增量的SRAM数据间接送寄存器 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | 带预减量的SRAM数据间接送寄存器 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | SRAM数据间接送寄存器 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | 带后增量的SRAM数据间接送寄存器 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | 带预减量的SRAM数据间接送寄存器 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | 带偏移量的间接取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | SRAM数据间接送寄存器 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | 带后增量的SRAM数据间接送寄存器 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | 带预减量的SRAM数据间接送寄存器 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | 带偏移量的间接取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 直接存数（寄存器数据到RAM） | (k) = Rr | 无 | 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
ST | 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
ST | Z+q,Rr | 带偏移量的间接存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 装入程序存储器数据 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 装入程序存储器数据 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 装入程序存储器数据（带后增量） | Rd = (Z), Z=Z+1 | 无 | 3
ELPM | 无 | 扩展装入程序存储器数据 | R0 = (RAMPZ:Z) | 无 | 3
ELPM | Rd,Z | 扩展装入程序存储器数据 | Rd = (RAMPZ:Z) | 无 | 3
ELPM | Rd,Z+ | 扩展装入程序存储器数据（带后增量） | Rd = (RAMPZ:Z), Z = Z+1 | 无 | 3
SPM | 无 | 存入程序存储器 | (Z) = R1:R0 | 无 | -
ESPM | 无 | 扩展存入程序存储器 | (RAMPZ:Z) = R1:R0 | 无 | -
IN | Rd,P | 端口输入 | Rd = P | 无 | 1
OUT | P,Rr | 端口输出 | P = Rr | 无 | 1
PUSH | Rr | 寄存器压栈 | STACK = Rr | 无 | 2
POP | Rd | 寄存器出栈 | Rd = STACK | 无 | 2

* 上述的数据存储器存取的指令周期数是指对于内部存储器的访问，不适用于外部RAM存储器接口。当外扩存储器，且堆栈设置在外部存储器中时，对于 LD、 ST、 LDD、 STD、 LDS、 STS、 PUSH 和 POP 指令，在内部存储器加1个指令周期的基础上，每个等待状态再加1个指令周期。

位操作和位测试指令

指令 | 操作数 | 描述 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 逻辑左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 逻辑右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位的循环左移 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位的循环右移 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 寄存器高四位与低四位交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 标志寄存器指定位置1 | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 标志寄存器指定位清0 | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | I/O寄存器指定位置1 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | I/O寄存器指定位清0 | I/O(P,b) = 0 | 无 | 2
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
CLN | 无 | 清除符号标志位 | S = 0 | S | 1
SEV | 无 | 置位溢出标志位 | V = 1 | V | 1
CLV | 无 | 清除溢出标志位 | V = 0 | V | 1
SET | 无 | 置位T标志位 | T = 1 | T | 1
CLT | 无 | 清除T标志位 | T = 0 | T | 1
SEH | 无 | 置位半进位标志 | H = 1 | H | 1
CLH | 无 | 清除半进位标志 | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 休眠 | 参考指令手册 | 无 | 1
WDR | 无 | 看门狗复位 | 参考指令手册 | 无 | 1
BREAK | 无 | 中断执行 | 参考指令手册 | 无 | 1

汇编指令不区分大小写。

操作数有如下几种格式：

Rd: 寄存器堆中的目的（和源）寄存器
Rr: 寄存器堆中的源寄存器
b: 常量 (0-7),可以是常量表达式
s: 常量 (0-7),可以是常量表达式
P: 常量 (0-31/63),可以是常量表达式
K6; 常量 (0-63),可以是常量表达式
K8: 常量(0-255),可以是常量表达式
k: 常量,因指令不同有不同的范围。可以是常量表达式
q: 常量 (0-63),可以是常量表达式
Rdl: R24, R26, R28, R30。对于ADIW 和 SBIW 指令
X,Y,Z: 间接地址寄存器 (X=R27:R26, Y=R29:R28, Z=R31:R30)


Atmel AVR Assembler - Directives

汇编器伪指令

汇编器提供了一些伪指令。伪指令并不直接转换生成操作代码，而是用于调整存储器中程序的位置、定义宏、初始化存储器等。汇编器的伪指令见下表。
伪指令 | 说明
BYTE | 定义预留存储单元
CSEG | 代码段
CSEGSIZE | 设置程序存储区大小
DB | 定义字节常量
DEF | 定义寄存器符号名
DEVICE | 指定何器件生成汇编代码
DSEG | 数据段
DW | 定义字常数
ENDM, ENDMACRO | 宏结束
EQU | 定义标识符常量
ESEG | EEPROM段
EXIT | 退出文件
INCLUDE | 包含指定文件
LIST | 列表文件生成允许器
LISTMAC | 列表宏表达式
MACRO | 宏定义开始
NOLIST | 关闭列表文件生成
ORG | 设置程序起始位置
SET | 赋值给标识符

在 AVRASM v1.74中介绍了下列伪指令：

新的伪指令 | 说明
ELSE,ELIF | 条件汇编
ENDIF | 条件汇编
ERROR | 输出出错消息
IF,IFDEF,IFNDEF | 条件汇编
MESSAGE | 输出消息字符串

下面的伪指令仅在AVRASM2中使用：

AVRASM2的伪指令 | 说明
DD | 定义双字常量
DQ | 定义四字常量
UNDEF | 取消寄存器符号的定义
WARNING | 输出警告消息

注意：所有的伪指令必须以一个“.”作为前缀。

BYTE - 定义预留存储单元

BYTE伪指令是指从指定的地址开始，在SRAM中保留若干字节的存储空间备用。备用存储空间以字节计算，个数由BYTE伪指令的参数，即表达式的值确定。BYTE无伪指令前应使用一个标号，以标记备用存储空间在SRAM中的起始位置。该伪指令有一个参数，表示保留存储空间的字节数。BYTE伪指令仅能用在数据段内（见伪指令CSEG，DSEG和ESEG）。注意：BYTE伪指令必须带一个参数，字节数的位置不需要初始化。

语法：
LABEL: .BYTE 表达式

例如：
.DSEG
var1:    .BYTE 1            ; 保留1字节的存储单元，用var1标识
table:   .BYTE tab_size     ; 保留tab_size个字节的存储空间

.CSEG
         ldi r30,low(var1)  ; 将保留存储单元var1起始地址的 低8位装入Z
         ldi r31,high(var1) ; 将保留存储单元var1起始地址的高8位装入Z
         ld r1,Z            ; 将保留存储单元的内容读到寄存器R1

CSEG - 代码段

CSEG伪指令定义代码段的起始（在Flash中）。一个汇编程序可包含几个代码段，这些代码段在编译过程中被连接成一个代码段。在代码段中不能使用BYTE伪指令。程序中缺省的段为代码段。每个代码段内部都有自己的字定位计数器。可使用ORG伪指令定义该字定位计数器的初始指，作为代码段在程序中的起始位置。CSEG伪指令不带参数。

语法：
.CSEG

例如：
.DSEG                       ； 数据段（SRAM）
vartab: .BYTE 4             ；在SRAM中保留4个字节

.CSEG                       ; 代码段开始（Flash）
const:  .DW 2               ；在prog.mem中写0x0002
        mov r1,r0           ；

CSEGSIZE - 设置程序存储区大小

AT94K 芯片有一个用户自定义“程序－数据”存储区。程序和数据SRAM被分成3各区块：10K x 16 程序专用SRAM,4K x 8数据专用SRAM,和6K x 16（或12K x 8）用户自定义SRAM。你可以将自定义SRAM按你设定的比例分配成程序区和数据区，例如你可以将自定义区再分成2K x 16的程序区和4K x 8数据去。
这条指令就是指定自定义区中程序块的大小。

语法：
.CSEGSIZE = 10 | 12 | 14 | 16

例如：
.CSEGSIZE = 12              ; 规定程序存储区大小为： 12K x 16

DB - 在程序存储器或EEPROM存储器中定义字节数

伪指令是从程序存储器或E2PROM存储器的某个地址单元开始，存入一组规定的8位二进制常数（字节常数）。DB伪指令只能出现在代码段或E2PROM段。DB伪指令前应使用一个标号，以标记所定义的字节常数区域的起始位置。DB伪指令为一个表达式列表，表达式列表由多个表达式组成，但至少要含有一个表达式，表达式之间用逗号分隔。

每个表达式值的范围必须在-128～255之间。如果表达式的值是负数，则用8位补码表示，存入程序存储器或E2PROM存储器中。如果DB伪指令用在代码段，并且表达式表中多于一个表达式，则以两个字节组合成一个字放在程序存储器中。

如果表达式的个数是奇数，不管下一行汇编代码是否仍是DB伪指令，最后一个表达式的值将单独以字的格式放在程序存储器中

语法：
LABEL:  .DB 表达式

例如：
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa

.ESEG
const2: .DB 1,2,3

DEF - 定义寄存器符号名

DEF伪指令给寄存器定义一个替代的符号名。在后序程序中可以使用定义的符号名来表示被定义的寄存器。可以给一个寄存器定义多个符号名。符号名在后面程序中可以重新定义指定。

语法：
.DEF Symbol=Register

例如：
.DEF temp=R16
.DEF ior=R0

.CSEG
 ldi temp,0xf0  ; 送0xf0到寄存器R16中
 in ior,0x3f    ; 将SREG中的数据传送到寄存器R0中
 eor temp,ior   ; 将R16和R0异或

UNDEF - 取消寄存器符号的定义

这两个指令仅在 AVRASM2中使用。

UNDEF伪指令用来取消被DEF 伪指令定义过的符号。这是一个可以避免重新使用寄存器时的警告的方法。

语法：
.UNDEF 符号

例如:
.DEF var1 = R16
ldi var1, 0x20
... ; 进行对var1的操作
.UNDEF var1

.DEF var2 = R16 ; R16现在可以重新使用了

DEVICE - 指定为何器件生成汇编代码（不再支持）

注意： 这个指令在AVRASM2中已经不再使用了。它已经被一些 #pragma伪指令取代了，并可以描述器件的特性。在AVRASM2中，device伪指令大致相当于#PRAGMA AVRPART PART_NAME，但是其中的器件名称可以是任意的，而不仅限于下表所示。并且，只有这些器件名是被device指定的，其它的器件特性必须再单独设置。

DEVICE伪指令允许用户告知汇编器为何器件编译产生执行代码。如果在程序中使用该伪指令指定了器件型号，那么在编译过程中，若存在指定器件所不支持的指令，编译器则给出一个警告。如果代码段或E2PROM段所使用的存储器空间大于指定器件本身所能提供的存储器容量，编译器也会给出警告。如果不使用DEVICE伪指令，则假定器件支持所有的指令，也不限制存储器容量的大小。

语法：
.DEVICE <device code>

图表（该命令支持的芯片）：

Classic系列 | Tiny系列 | Mega系列 | 其它
AT90S120 | ATtiny11 | ATmega8 | AT94K
AT90S4433 | ATtiny2313 | ATmega48 | AT86RF401
AT90S2313 | ATtiny12 | ATmega16 | AT90CAN128
AT90S2323 | ATtiny13 | ATmega161 |
AT90S2333 | ATtiny22 | ATmega162 |
AT90S4414 | ATtiny26 | ATmega163 |
AT90S4434 | ATtiny25 | ATmega169 |
AT90S8515 | ATtiny45 | ATmega32 |
AT90S8534 | ATtiny85 | ATmega323 |
AT90S8535 |  | ATmega103 |
AT90S2343 |  | ATmega104 |
 |  | ATmega8515 |
 |  | ATmega8535 |
 |  | ATmega64 |
 |  | ATmega128 |
 |  | ATmega165 |
 |  | ATmega2560 |
 |  | ATmega2561 |

例如：
.DEVICE AT90S1200  ; 使用 AT90S1200

.CSEG
        push r30   ; 当指定的器件不支持该指令时这条语句将被警告

注意： 下列芯片从2001.6.14起更名

以前的名称         更新后的名称

ATmega104           ATmega128

ATmega32            ATmega323

ATmega164           ATmega16

为了不破坏以前的工程文件，新、旧d伪指令都可以在与它们相关的器件上使用。

DSEG - 数据段

DSEG伪指令定义数据段的起始。一个汇编程序文件可以包含几个数据段，这些数据段在汇编过程中被连接成一个数据段。在数据段中，通常是仅由BYTE伪指令（和标号）组成。每个数据段内部都有自己的字节定位计数器。可使用ORG伪指令定义该字节定位计数器的初始值，作为数据段在SRAM中的起始位置。DSEG伪指令不带参数。

语法：
.DSEG

例如：
.DSEG                        ; 数据段（SRAM）
var1:  .BYTE 1               ; 保留1字节的存储单元，用var1标识
table:  .BYTE tab_size       ; 保留tab_size个字节的存储空间

.CSEG
        ldi r30,low(var1)    ; 将保留存储单元var1起始地址的低8位装入Z
        ldi r31,high(var1)   ; 将保留存储单元var1起始地址的高8位装入Z
        ld r1,Z              ; 将存储单元的内容读到寄存器R1

DW - 在程序存储器或EPROM存储器中定义字常量

DW伪指令是从程序存储器或E2PROM存储器的某个地址单元开始，存入一组规定的16位二进制常数（字常数）。DW伪指令只能出现在代码段或E2PROM段。DW伪指令前应使用一个标号，以标记所定义的字常数区域的起始位置。DW伪指令为一个表达式列表，表达式列表由多个表达式组成，但至少要含有一个表达式，表达式之间用逗号分隔。每个表达式值的范围必须在-32768～65535之间。如果表达式的值是负数，则用16位补码表示。

语法：
LABEL: .DW 表达式

例如：
.CSEG
varlist:  .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

.ESEG
eevarlst: .DW 0,0xffff,10

DD - 在程序存储器或EEPROM中定义双字常量

DQ - 在程序存储器或EEPROM中定义四字常量

这两个指令仅在 AVRASM2中使用。

这两个指令与伪指令 .DW 非常接近，唯一不同的是它们分别是用来定义32位（双字）和64位（四字）常数的。数据将严格按照小端法(little-endian)存放。

语法：
LABEL: .DD 表达式
LABEL: .DQ 表达式

例如：
.CSEG
varlist:  .DD 0, 0xfadebabe, -2147483648, 1 << 30

.ESEG
eevarlst: .DQ 0,0xfadebabedeadbeef, 1 << 62

ELIF,ELSE - 条件汇编

ELIF伪指令的有效作用范围到下一个同级别的ELIF相对应的ENDIF伪指令处截止（前提是表达式为真，且开始的IF子句和后面的ELIF子句都为假）。

ELSE伪指令得有效作用范围到相应的ENDIF截止（前提是前面的IF子句和所有的ELIF子句均为假）。

语法：
.ELIF<表达式>
.ELSE

.IFDEF <符号> |.IFNDEF <符号>
...
.ELSE | .ELIF<表达式>
...
.ENDIF

例如：
.IFDEF DEBUG
.MESSAGE "Debugging.."
.ELSE
.MESSAGE "Release.."
.ENDIF

ENDIF - 条件汇编

在汇编时条件汇编包括了一系列的指令。 ENDIF伪指令定义了条件汇编伪指令IF 、IFDEF 和I FNDEF 的结束处。

条件汇编伪指令块(.IF...ELIF...ELSE...ENDIF )都可以嵌套，但是所有条件汇编伪指令必须在当前文件中结束（条件汇编伪指令不能跨越多个文件 ）。

语法：
.ENDIF

.IFDEF <符号> |.IFNDEF <符号>
...
.ELSE | .ELIF<表达式>
...
.ENDIF

例如：
.IFNDEF DEBUG
.MESSAGE "Release.."
.ELSE
.MESSAGE "Debugging.."
.ENDIF

ENDM, ENDMACRO - 宏结束

ENDMACRO伪指令定义宏定义的结束。该伪指令并不带参数，参见MACRO宏定义伪指令。要了解宏定义的更多内容请参见MACRO伪指令。ENDM是ENDMACRO的简写，它们是完全等同的。

语法：
.ENDMACRO
.ENDM

例如：
.MACRO SUBI16      ; 宏定义开始
subi r16,low(@0)   ; 减低字节
sbci r17,high(@0)  ; 减高字节
.ENDMACRO

EQU - 定义标识符常量

EQU伪指令将表达式的值赋给一个标识符，该标识符为一个常量标识符，可以用于后面的表达式中，但该标识符的值不能改变或重新定义。

语法：
.EQU label = 表达式

例如：
.EQU io_offset = 0x23
.EQU porta    = io_offset + 2

.CSEG        ; 代码段开始
clr r2       ; R2清零
out porta,r2 ; 写入PortA

ERROR - 输出一条出错消息字符串

ERROR伪指令输出一个字符串并停止汇编。可以使用在条件汇编中。

语法：
.ERROR "<字符串>"

例如：
.IFDEF TOBEDONE
.ERROR "Still stuff to be done.."
.ENDIF

WARNING - 输出一条警告消息字符串

WARNING伪指令输出一个警告字符串，但和.ERROR不同的是，它不会使当前汇编停止。可以使用在条件汇编中。

语法：
.WARNING"<string>"

例如：
.IFDEF EXPERIMENTAL_FEATURE
.WARNING "This is not properly tested, use at own risk."
.ENDIF

ESEG - EEPROM段

ESEG伪指令定义E2PROM段的开始。一个汇编文件可以包含几个E2PROM段，这些E2PROM段在汇编编译过程中被连接成一个E2PROM段。在E2PROM段中不能使用BYTE伪指令。每个E2PROM段内部都有自己的字节定位计数器。可使用ORG伪指令定义该字节定位计数器的初始值，作为数据段在E2PROM中的起始位置。ESEG伪指令不带参数。

语法：
.ESEG

例如：
.DSEG                  ; 代码段开始
var1:  .BYTE 1         ; 保留1字节的存储单元，用var1标识
table: .BYTE tab_size  ; 保留tab_size个字节的存储空间

.ESEG
eevar1: .DW 0xffff     ; 在EEPROM中定义一个字

EXIT - 退出文件

EXIT伪指令告诉汇编编译器停止汇编该文件。在正常情况下，汇编编译器的编译过程一直到文件的结束。如果EXIT出现在包含文件中，则汇编编译器将结束对包含文件的编译，然后从本文件当前INCLUDE伪指令的下一行语句处开始继续编译。

语法：
.EXIT

例如：
.EXIT ; 退出文件

INCLUDE - 包含指定的文件

INCLUDE伪指令告诉汇编编译器开始从一个指定的文件中读入程序语句，并对读入的语句进行编译，直到该包含文件结束或遇到该文件中的EXIT伪指令，然后再从本文件当前INCLUDE伪指令的下一行语句处继续开始编译。在一个包含文件中，也可以使用INCLUDE伪指令来包含另外一个指定的文件。

语法：
.INCLUDE "filename"

例如：
; iodefs.asm:
.EQU sreg  = 0x3f    ; 状态寄存器
.EQU sphigh = 0x3e   ; 堆栈指针高位
.EQU splow = 0x3d    ; 堆栈指针低位

; incdemo.asm
.INCLUDE iodefs.asm  ; 包含了I/O的定义
in r0,sreg          ; 读入状态寄存器

IF,IFDEF,IFNDEF - 条件汇编

在汇编时条件汇编包括一系列命令。如果<符号>被定义过，则汇编IFDEF伪指令后面包含的代码（到相应的ELSE伪指令前截止）。该符号应该用伪指令EQU或SET定义。 (不能用DEF伪指令) 如果<表达式>的值非零，则汇编IF伪指令后面包含的代码。直到与它们相对应的ELSE或ENDIF伪指令为止。

最多可以嵌套5层。

语法：
.IFDEF <符号>
.IFNDEF <符号>
.IF <表达式>

.IFDEF <符号> |.IFNDEF <符号>
...
.ELSE | .ELIF<表达式>
...
.ENDIF

例如：
.MACRO SET_BAT
.IF @0>0x3F
.MESSAGE "Address larger than 0x3f"
lds @2, @0
sbr @2, (1<<@1)
sts @0, @2
.ELSE
.MESSAGE "Address less or equal 0x3f"
.ENDIF
.ENDMACRO

LIST - 打开列表文件生成器

LIST伪指令告诉汇编编译器打开列表文件生成器。正常情况下，汇编编译器在编译过程中将生成一个由汇编源代码、地址和操作码组成的列表文件。默认时为允许生成列表文件。该伪指令可以与NOLIST伪指令配合使用，以选择某一部分的汇编源文件产生列表 文件。

语法：
.LIST

例如：
.NOLIST               ; 关闭列表文件生成器
.INCLUDE "macro.inc"  ; 被包含的文件不能显示在列表文件中
.INCLUDE "const.def"  ;
.LIST                 ; 再次打开列表文件生成器

LISTMAC - 列表宏表达式

LISTMAC伪指令告诉汇编编译器，在生成的列表文件中，显示所调用宏的表达式。默认情况下，仅在列表文件中显示所调用的宏名和参数。

语法：
.LISTMAC

例如：
.MACRO MACX        ; 定义宏
add r0,@0          ; 一些操作
eor r1,@1          ; 一些操作
.ENDMACRO          ; 结束宏定义

.LISTMAC           ; 使能宏定义的扩展
MACX r2,r1         ; 调用宏， 并显示宏扩展的内容

MACRO - 宏开始

MACRO伪指令告诉汇编器一个宏程序的开始。MACRO伪指令将宏程序名作为参数。当后面的程序中使用宏程序名，则表示在该处调用宏程序。一个宏程序中可带10个参数。这些参数在宏定义中用＠0～＠9代表。当调用一个宏程序时，参数用逗号分隔。

伪指令ENDMACRO定义宏程序的结束。默认情况下，在汇编编译器生成的列表文件中仅给出宏的调用。如要在列表文件中给出宏的表达式，则必须使用LISTMAC伪指令。在列表文件的操作码域中，宏带有a+ 的记号。

语法：
.MACRO 宏名

例如：
.MACRO SUBI16          ; 宏定义开始
subi @1,low(@0)        ; 减低字节
sbci @2,high(@0)       ; 减高字节
.ENDMACRO              ; 宏定义结束

.CSEG                  ; 代码段开始
SUBI16 0x1234,r16,r17  ; r17:r16=r17:r16-0x1234

MESSAGE - 输出一条消息字符串

MESSAGE伪指令用来输出一个字符串。用在条件汇编中。

语法：
.MESSAGE "<string>"

例如：
.IFDEF DEBUG
.MESSAGE "Debug mode"
.ENDIF

NOLIST -关闭列表文件生成器

NOLIST伪指令告诉汇编编译器关闭列表文件生成器。正常情况下，汇编编译器在编译过程中将生成一个由汇编源代码、地址和操作码组成的列表文件，默认情况下为允许生成列表文件。可以使用该伪指令禁止文件列表的产生。该伪指令可以与LIST伪指令配合使用，以选择某一部分的汇编源文件产生列表文件。

语法：
.NOLIST

例如：
.NOLIST                ; 关闭列表文件生成器
.INCLUDE "macro.inc"   ; 被包含的文件不能显示在列表文件中
.INCLUDE "const.def"   ;
.LIST                  ; 再次打开列表文件生成器

ORG - 定义代码起始位置

ORG伪指令设置定位计数器为一个绝对数值，该数值为表达式的值，作为代码的起始位置。如果ORG伪指令出现数据段中，则设定SRAM定位计数器；如果该伪指令出现在代码段中，则设定程序存储器计数器；如果该伪指令出现在E2PROM段中，则设定E2PROM定位计数器。如果该伪指令前带标号（在相同的语句行），则标号的定位由ORG 的参数值定义。

代码段和E2PROM段定位计数器的默认值是零；而当汇编器启动时，SRAM定位计数器的默认值是32（因为寄存器占有地址为 0～31）。注意，E2PROM和SRAM定位计数器按字节计数，而程序存储器定位计数器按字计数。

语法：
.ORG 表达式

例如：
.DSEG               ; 代码段开始

.ORG 0x120           ; 设置SRAM中的变量从0x120开始
variable: .BYTE 1   ; 在SRAM的地址0x120处保留一个字节的存储单元

.CSEG
.ORG 0x10           ; 设置程序从0x10开始执行
mov r0,r1            ; 一些操作

SET - 设置标识符与一个表达式值相等

SET伪指令将表达式的值赋值给一个标识符。这个标识符能用在后面的表达式中。用SET伪指令赋值的标识符能在后面的程序中重新设置改变。

语法：
.SET label = 表达式

例如：
.SET io_offset = 0x23
.SET porta    = io_offset + 2

.CSEG        ; 代码段开始
clr r2       ; R2清零
out porta,r2 ; 写入PortA


Atmel AVR Assembler - Expressions

表达式

本汇编器中包含了常量表达式。表达式是由操作数, 运算符 和函数组成的。 所有表达式在AVRASM中为内部32位，在AVRASM2中为64位。

操作数

可以使用以下操作数：

  • 由用户定义的标号，这些标号给出了放置标号位置的定位计数器的值
  • 用户用SET伪指令定义的变量
  • 用户用EQU伪指令定义的常量
  • 整数常量：可以有如下几种形式
    • 十进制（Decimal）(默认): 10, 255
    • 十六进制（Hexadecimal）(两个符号): 0x0a, $0a, 0xff, $ff
    • 二进制（Binary）: 0b00001010, 0b11111111
    • 八进制（Octal）(以0开头): 010, 077
  • PC - 程序寄存器定位计数器的当前值
  • 浮点数 -只存在于AVRASM2

运算符

汇编程序支持以下介绍的运算符。优先级越高，优先权越高。表达式可以置于括号中，这类表达式通常先于括号外面的表达式进行运算。

运算符定义如下：

运算符 | 说明
! | 逻辑非
~ | 逐位非
- | 负号
* | 乘法
/ | 除法
% | 取余数 (只适用于AVRASM2 )
+ | 相加
- | 相减
<< | 左移
>> | 右移
< | 小于
<= | 小于等于
> | 大于
>= | 大于等于
== | 等于
!= | 不等于
& | 逐位与
^ | 逐位异或
| | 逐位或
&& | 逻辑与
|| | 逻辑或

逻辑非（Logical Not）

符号:   !
说明:   一元运算符，如果表达式为0则返回1，否则返回0。
优先级: 14
例如:   ldi r16,!0xf0  ; 将0x00取非并将结果载入r16

逐位非（Bitwise Not）

符号:   ~
说明:   一元运算符，返回各个位取反的表达式
优先级: 14
例如:   ldi r16,~0xf0  ;将0x0f按位取反并将结果载入r16

负号（Unary Minus）

符号:   -
说明:   一元运算符，返回表达式减法运算的结果
优先级: 14
例如:   ldi r16,-2  ; 将0xfe减2并将结果载入r16

乘法（Multiplication）

符号:   *
说明:   二元运算符，返回两个表达式相乘的结果。
优先级: 13
例如:   ldi r30,label*2 ; 将label乘2并将结果载入r30

除法（Division）

符号:   /
说明:   二元运算符，返回被右方表达式相除的左方表达式的整数商
优先级: 13
例如:   ldi r30,label/2 ; 运算label/2并将结果载入r30

取余数（Modulo） (只适用于AVRASM2)

符号:   %
说明:   二元运算符， 返回被右方表达式相除的左方表达式的整数余数
优先级: 13
例如:   ldi r30,label%2 ;运算label%2并将结果载入r30

加法（Addition）

符号:   +
说明:   二元运算符， 返回两个表达式的和
优先级: 12
例如:   ldi r30,c1+c2  ;运算c1加c2并将结果载入r30

减法（Subtraction）

符号:   -
说明:   二元运算符， 返回左方表达式与右方表达式的差
优先级: 12
例如:   ldi r17,c1-c2  ;运算c1减c2并将结果载入r17

左移（Shift left）

符号:   <<
说明:   二元运算符，返回左方表达式向左移动右方表达式给出位数后的结果
优先级: 11
例如:   ldi r17,1<<bitmask  ;将1左移bitmask位数后将结果载入r17

右移（Shift right）

符号:   >>
说明:   二元运算符， 返回左方表达式向右移动右方表达式给出位数后的结果
优先级: 11
例如:   ldi r17,c1>>c2  ;将c1左移c2位数后将结果载入r17

小于（Less than）

符号:   <
说明:   二元运算符， 如果左侧带符号表达式值小于右侧带符号表达式值则返回1，反之返回0
优先级: 10
例如:   ori r18,bitmask*(c1<c2)+1  ;将r18与一个表达式取或

小于等于（Less or equal）

符号:   <=
说明:   二元运算符， 如果左侧带符号表达式值小于等于右侧带符号表达式值则返回1，反之返回
优先级: 10
例如:   ori r18,bitmask*(c1<=c2)+1 ;将r18与一个表达式取或

大于（Greater than）

符号:   >
说明:   二元运算符， 如果左侧带符号表达式值大于右侧带符号表达式值则返回1，反之返回0
优先级: 10
例如:   ori r18,bitmask*(c1>c2)+1  ;将r18与一个表达式取或

大于等于（Greater or equal）

符号:    >=
说明:   二元运算符， 如果左侧带符号表达式值大于等于右侧带符号表达式值则返回1，反之返回
优先级: 10
例如:   ori r18,bitmask*(c1>=c2)+1 ;将r18与一个表达式取或

等于（Equal）

符号:   ==
说明:   二元运算符， 如果左侧带符号表达式值等于右侧带符号表达式值则返回1，反之返回
优先级: 9
例如:   andi r19,bitmask*(c1==c2)+1 ;将r19与一个表达式进行逻辑与运算

不等于（Not equal）

符号:   !=
说明:   二元运算符， 如果左侧带符号表达式值不等于右侧带符号表达式值则返回1，反之返回
优先级: 9
例如:   .SETflag=(c1!=c2)  ;将flag设为0或1

逐位与（Bitwise And）

符号:   &
说明:   二元运算符， 返回两个表达式逐位与操作的结果
优先级: 8
例如:   ldi r18,High(c1&c2) ;将一个表达式值载入r18

逐位异或（Bitwise Xor）

符号:   ^
说明:   二元运算符， 返回两个表达式逐位异或操作的结果
优先级: 7
例如:   ldi r18,Low(c1^c2) ;将一个表达式值载入r18

逐位或（Bitwise Or）

符号:   |
说明:   二元运算符，返回两个表达式逐位或操作的结果
优先级: 6
例如:   ldi r18,Low(c1|c2) ;将一个表达式值载入r18

逻辑与

符号:   &&
说明:   二元运算符， 如果两个表达式均非0则返回1，否则返回0
优先级: 5
例如:   ldi r18,Low(c1&&c2)  ;将一个表达式值载入r18

逻辑或

符号:   ||
说明:   二元运算符，如果两个表达式中至少一个非0则返回1，否则返回0
优先级: 4
例如:   ldi r18,Low(c1||c2)  ;将一个表达式值载入r18

函数

  定义了以下函数：

  • LOW(表达式)  返回一个表达式值的最低字节
  • HIGH(表达式) 返回一个表达式值的第二个字节
  • BYTE2(表达式)与HIGH函数相同
  • BYTE3(表达式)返回一个表达式值的第三个字节
  • BYTE4(表达式)返回一个表达式值的第四个字节
  • LWRD(表达式) 返回一个表达式值的0-15位
  • HWRD(表达式) 返回一个表达式值的16-31位
  • PAGE(表达式) 返回一个表达式值的16-21位
  • EXP2(表达式) 返回（表达式值）2次幂的值
  • LOG2(表达式) 返回log2(表达式值)的整数部分

  以下函数只在AVRASM2中定义:

  • INT(表达式) 将一个浮点表达式值转换为整数（舍去小数部分）
  • FRAC(表达式)提取一个浮点表达式值的小数部分（舍去整数部分）
  • Q7(表达式)  将一个浮点表达式值转换为适应FMUL/FMULS/FMULSU结构的适当方式。（符号位加上7位小数位）
  • Q15(表达式) 将一个浮点表达式值转换为适应FMUL/FMULS/FMULSU结构的适当方式。（符号位加上15位小数位）
  • ABS() 返回一个常数表达式值的绝对值。


AT90S1200 Instruction Set

AT90S1200 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
IN | Rd,P | 从I/O口读数 | Rd = P | 无 | 1
OUT | P,Rr | 数据送I/O口 | P = Rr | 无 | 1

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


AT90S2323 and AT90S2343 Instruction Set

AT90S2323 和 AT90S2343 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ( $FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/FONT> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 from Data Space | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


AT90S2323 and AT90S2343 Instruction Set

AT90S2323 和 AT90S2343 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 from Data Space | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


AT90S4414 and AT90S8515 Instruction Set

AT90S4414 和 AT90S8515 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


AT90S4434 and AT90S8535 Instruction Set

AT90S4434 和 AT90S8535 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega8 / ATmega48/88/168 / ATmega8515 / ATmega8535 Instruction Set

ATmega8 / ATmega48/88/168 / ATmega8515 /ATmega8535 / AT90PWM2/3 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP (Note 1) | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL (Note 1) | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
STD | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
STD | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLS | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

注意：这些指令只能在 ATmega168中使用。

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega103 Instruction Set

ATmega103 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
ELPM (Note 1) | 无 | 从程序区取数（扩展） | R0 = (RAMPZ:Z) | 无 | 3
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

注意：在ATmega603中不支持

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega16/32 Instruction Set

ATmega16/ATmega32/ATmega406 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega161 Instruction Set

ATmega161 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega162 Instruction Set

ATmega162 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
EIJMP | 无 | 间接跳转（扩展） (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1
BREAK | 无 | 终断执行 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega163 Instruction Set

ATmega163 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega169/ATmega165 Instruction Set

ATmega169/165/329/325/3250/649/645 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
EIJMP | 无 | 间接跳转（扩展） (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega128 Instruction Set

ATmega64/128, AT90CAN128 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1
BREAK | 无 | 终断执行 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega128 Instruction Set

ATmega64/128 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
EIJMP | 无 | 间接跳转（扩展） (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1
BREAK | 无 | 终断执行 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATmega256 Instruction Set

ATmega2560/2561 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2
MUL | Rd,Rr | 无符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULS | Rd,Rr | 有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
MULSU | Rd,Rr | 无符号与有符号数相乘 | R1:R0 = Rd * Rr | Z,C | 2
FMUL | Rd,Rr | 无符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2
FMULS | Rd,Rr | 有符号小数相乘 | R1:R0 = (Rd *Rr) << 1 | Z,C | 2
FMULSU | Rd,Rr | 无符号与有符号小数相乘 | R1:R0 = (Rd * Rr) << 1 | Z,C | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
EIJMP | 无 | 间接跳转（扩展） (Z) | PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
JMP | k | 直接跳转 | PC = k | 无 | 3
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
EICALL | 无 | 间接子程序调用（扩展） (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND < /p > < /p > < /p > < /p > < /p > | 无 | 4
CALL | k | 直接子程序调用 | STACK = PC+2, PC = k | 无 | 4/5*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1
BREAK | 无 | 终断执行 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny10/11/12 Instruction Set

ATtiny10/11/12 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
IN | Rd,P | 从I/O口读数 | Rd = P | 无 | 1
OUT | P,Rr | 数据送I/O口 | P = Rr | 无 | 1

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny13/ATtiny2313 Instruction Set

ATtiny13/ATtiny2313/ATtiny25/ATtiny45/ATtiny85 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
MOVW | Rd,Rr | 寄存器字传送 | Rd+1:Rd = Rr+1:Rr, r,d even | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
LPM | Rd,Z+ | 从程序区取数后Z加1 | Rd = (Z), Z=Z+1 | 无 | 3
SPM | 无 | 写数据到程序区 | (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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1
BREAK | 无 | 终断执行 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny15 Instruction Set

ATtiny15 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2*
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
IN | Rd,P | 从I/O口读数 | Rd = P | 无 | 1
OUT | P,Rr | 数据送I/O口 | P = Rr | 无 | 1

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny22 Instruction Set

ATtiny22 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny26 Instruction Set

ATtiny26 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1
SBIW | Rdl,K6 | 字减立即数 | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | 2

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
IJMP | 无 | 间接跳转到 (Z) | PC = Z | 无 | 2
EIJMP | 无 | 间接跳转（扩展） (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
ICALL | 无 | 间接子程序调用 (Z) | STACK = PC+1, PC = Z | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转 | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LDS | Rd,k | 从SRAM中取数 | Rd = (k) | 无 | 2*
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
LD | Rd,X+ | X间址取数后加1 | Rd = (X), X=X+1 | 无 | 2*
LD | Rd,-X | X减1后间址取数 | X=X-1, Rd = (X) | 无 | 2*
LD | Rd,Y | Y间址取数 | Rd = (Y) | 无 | 2*
LD | Rd,Y+ | Y间址取数后加1 | Rd = (Y), Y=Y+1 | 无 | 2*
LD | Rd,-Y | Y减1后间址取数 | Y=Y-1, Rd = (Y) | 无 | 2*
LDD | Rd,Y+q | Y+q变址取数 | Rd = (Y+q) | 无 | 2*
LD | Rd,Z | Z间址取数 | Rd = (Z) | 无 | 2*
LD | Rd,Z+ | Z间址取数后加1 | Rd = (Z), Z=Z+1 | 无 | 2*
LD | Rd,-Z | Z减1后间址取数 | Z=Z-1, Rd = (Z) | 无 | 2*
LDD | Rd,Z+q | Z+q变址取数 | Rd = (Z+q) | 无 | 2*
STS | k,Rr | 数据送SRAM | (k) = Rr | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
ST | X+,Rr | X间址存数后加1 | (X) = Rr, X=X+1 | 无 | 2*
ST | -X,Rr | X减1后间址接存数 | X=X-1, (X)=Rr | 无 | 2*
ST | Y,Rr | Y间址存数 | (Y) = Rr | 无 | 2*
ST | Y+,Rr | Y间址存数后加1 | (Y) = Rr, Y=Y+1 | 无 | 2
ST | -Y,Rr | Y减1后间址接存数 | Y=Y-1, (Y) = Rr | 无 | 2
ST | Y+q,Rr | Y+q变址存数 | (Y+q) = Rr | 无 | 2
ST | Z,Rr | Z间址存数 | (Z) = Rr | 无 | 2
ST | Z+,Rr | Z间址存数后加1 | (Z) = Rr, Z=Z+1 | 无 | 2
ST | -Z,Rr | Z减1后间址接存数 | Z=Z-1, (Z) = Rr | 无 | 2
ST | Z+q,Rr | Z+q变址存数 | (Z+q) = Rr | 无 | 2
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
LPM | Rd,Z | 从程序区取数 | Rd = (Z) | 无 | 3
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

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


ATtiny28 Instruction Set

ATtiny28 指令集

此汇编器支持RISC结构中的精简指令集。下面给出了精简指令集及其参数。要了解与指令集相关的细节问题，请参照 AVR 数据手册。

算术和逻辑运算指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
ADD | Rd,Rr | 不带进位的加法 | Rd = Rd + Rr | Z,C,N,V,H,S | 1
ADC | Rd,Rr | 带进位的加法 | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1
ADIW | Rd, K | 字加立即数 | Rd+1:Rd,K | Z,C,N,V,S | 2
SUB | Rd,Rr | 不带进位的减法 | Rd = Rd - Rr | Z,C,N,V,H,S | 1
SUBI | Rd,K8 | 字减立即数 | Rd = Rd - K8 | Z,C,N,V,H,S | 1
SBC | Rd,Rr | 带进位的减法 | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1
SBCI | Rd,K8 | 带进位减立即数 | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1
AND | Rd,Rr | 逻辑与 | Rd = Rd · Rr | Z,N,V,S | 1
ANDI | Rd,K8 | 与立即数 | Rd = Rd · K8 | Z,N,V,S | 1
OR | Rd,Rr | 逻辑或 | Rd = Rd V Rr | Z,N,V,S | 1
ORI | Rd,K8 | 或立即数 | Rd = Rd V K8 | Z,N,V,S | 1
EOR | Rd,Rr | 逻辑异或 | Rd = Rd EOR Rr | Z,N,V,S | 1
COM | Rd | 取反 | Rd = $FF - Rd | Z,C,N,V,S | 1
NEG | Rd | 取补 | Rd = $00 - Rd | Z,C,N,V,H,S | 1
SBR | Rd,K8 | 寄存器位置位 | Rd = Rd V K8 | Z,C,N,V,S | 1
CBR | Rd,K8 | 寄存器位清零 | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1
INC | Rd | 加1 | Rd = Rd + 1 | Z,N,V,S | 1
DEC | Rd | 减1 | Rd = Rd -1 | Z,N,V,S | 1
TST | Rd | 检测寄存器为零或负 | Rd = Rd · Rd | Z,C,N,V,S | 1
CLR | Rd | 寄存器清零 | Rd = 0 | Z,C,N,V,S | 1
SER | Rd | 寄存器置位 | Rd = $FF | 无 | 1

比较和转移指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
RJMP | k | 相对跳转 | PC = PC + k +1 | 无 | 2
RCALL | k | 相对子程序调用 | STACK = PC+1, PC = PC + k + 1 | 无 | 3/4*
RET | 无 | 子程序返回 | PC = STACK | 无 | 4/5*
RETI | 无 | 中断返回 | PC = STACK | I | 4/5*
CPSE | Rd,Rr | 比较相等跳行 | if (Rd ==Rr) PC = PC 2 or 3 | 无 | 1/2/3
CP | Rd,Rr | 比较 | Rd -Rr | Z,C,N,V,H,S | 1
CPC | Rd,Rr | 带进位比较 | Rd - Rr - C | Z,C,N,V,H,S | 1
CPI | Rd,K8 | 与立即数比较 | Rd - K | Z,C,N,V,H,S | 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(I/O(P,b)==0) PC = PC + 2 or 3 | 无 | 1/2/3
SBIS | P,b | I/O位为1跳行 | if(I/O(P,b)==1) PC = PC + 2 or 3 | 无 | 1/2/3
BRBC | s,k | SREG(s)位为0跳转 | if(SREG(s)==0) PC = PC + k + 1 | 无 | 1/2
BRBS | s,k | SREG(s)位为1跳转 | if(SREG(s)==1) PC = PC + k + 1 | 无 | 1/2
BREQ | k | 相等跳转 | if(Z==1) PC = PC + k + 1 | 无 | 1/2
BRNE | k | 不相等跳转 | if(Z==0) PC = PC + k + 1 | 无 | 1/2
BRCS | k | C=1跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRCC | k | C=0跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRSH | k | 大于等于跳转 | if(C==0) PC = PC + k + 1 | 无 | 1/2
BRLO | k | 小于跳转 | if(C==1) PC = PC + k + 1 | 无 | 1/2
BRMI | k | 为负跳转 | if(N==1) PC = PC + k + 1 | 无 | 1/2
BRPL | k | 为正跳转 | if(N==0) PC = PC + k + 1 | 无 | 1/2
BRGE | k | 大于等于跳转（有符号） | if(S==0) PC = PC + k + 1 | 无 | 1/2
BRLT | k | 小于跳转（有符号） | if(S==1) PC = PC + k + 1 | 无 | 1/2
BRHS | k | 半进位标志H=1跳转 | if(H==1) PC = PC + k + 1 | 无 | 1/2
BRHC | k | 半进位标志H=0跳转 | if(H==0) PC = PC + k + 1 | 无 | 1/2
BRTS | k | 标志位T=1跳转 | if(T==1) PC = PC + k + 1 | 无 | 1/2
BRTC | k | 标志位T=0跳转/font> | if(T==0) PC = PC + k + 1 | 无 | 1/2
BRVS | k | 溢出标志V=1跳转 | if(V==1) PC = PC + k + 1 | 无 | 1/2
BRVC | k | 溢出标志V=0跳转 | if(V==0) PC = PC + k + 1 | 无 | 1/2
BRIE | k | 中断允许位I=1跳转 | if(I==1) PC = PC + k + 1 | 无 | 1/2
BRID | k | 中断允许位I=0跳转 | if(I==0) PC = PC + k + 1 | 无 | 1/2

数据传送指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
MOV | Rd,Rr | 寄存器传送 | Rd = Rr | 无 | 1
LDI | Rd,K8 | 装入立即数 | Rd = K | 无 | 1
LD | Rd,X | X间址取数 | Rd = (X) | 无 | 2*
ST | X,Rr | X间址存数 | (X) = Rr | 无 | 2*
LPM | 无 | 从程序区取数 | R0 = (Z) | 无 | 3
IN | Rd,P | 从I/O口读数 | Rd = P | 无 | 1
OUT | P,Rr | 数据送I/O口 | P = Rr | 无 | 1

位操作和位测试指令

指令 | 操作数 | 说明 | 操作 | 影响的标志位 | 指令周期
LSL | Rd | 左移 | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | 1
LSR | Rd | 右移 | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | 1
ROL | Rd | 带进位左循环 | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | 1
ROR | Rd | 带进位右循环 | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | 1
ASR | Rd | 算术右移 | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | 1
SWAP | Rd | 半字节交换 | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | 无 | 1
BSET | s | 置位SREG | SREG(s) = 1 | SREG(s) | 1
BCLR | s | 清零SREG | SREG(s) = 0 | SREG(s) | 1
SBI | P,b | 置位I/O位 | I/O(P,b) = 1 | 无 | 2
CBI | P,b | 清零I/O位 | I/O(P,b) = 0 | 无 | 2
BST | Rr,b | Rr的b位送T | T = Rr(b) | T | 1
BLD | Rd,b | T送Rr的b位 | Rd(b) = T | 无 | 1
S EC | 无 | 置位C | C =1 | C | 1
CLC | 无 | 清零C | C = 0 | C | 1
SEN | 无 | 置位N | N = 1 | N | 1
CLN | 无 | 清零N | N = 0 | N | 1
SEZ | 无 | 置位Z | Z = 1 | Z | 1
CLZ | 无 | 清零Z | Z = 0 | Z | 1
SEI | 无 | 置位I | I = 1 | I | 1
CLI | 无 | 清零I | I = 0 | I | 1
SES | 无 | 置位S | S = 1 | S | 1
CLN | 无 | 清零S | S = 0 | S | 1
SEV | 无 | 置位V | V = 1 | V | 1
CLV | 无 | 清零V | V = 0 | V | 1
SET | 无 | 置位T | T = 1 | T | 1
CLT | 无 | 清零T | T = 0 | T | 1
SEH | 无 | 置位H | H = 1 | H | 1
CLH | 无 | 清零H | H = 0 | H | 1
NOP | 无 | 空操作 | 无 | 无 | 1
SLEEP | 无 | 进入休眠 | 见相关说明 | 无 | 1
WDR | 无 | 看门狗复位 | 见相关说明 | 无 | 1

此汇编器对大小写不敏感。

操作数的构成：

Rd: 目的(源)寄存器，R0-R31或R16-R31（取决于指令）
Rr: 源寄存器，R0-R31
b: 寄存器的指定位，常数（0-7）
s: 状态寄存器SREG的指定位，常数（0-7）
P: I/O寄存器，常数（0-31/63）
K6:立即数，常数（0-63）
K8: 立即数，常数（0-255）
k: 立即数，其取值范围取决于指令。
q:地址偏移量，常数（(0-63）
Rdl: R24, R26, R28, R30，用于指令ADIW 和 SBIW中
X,Y,Z:地址指针寄存器（X=R27:R26, Y=R29:R28, Z=R31:R30）


Instruction Set Nomenclature:

指令术语集：

状态寄存器 (SREG)

SREG : 状态寄存器

C : 进位标志位

Z : 零标志位

N : 负数标志位

V : 补码溢出标志位

S : N 异或 V, 用于符号测试标志位

H : 半进位标志位

T : 用于BLD指令和BST指令传送位

I : 全局中断触发/禁止标志位

寄存器与操作数

Rd : 目的（或源）寄存器

Rr : 源寄存器

R : 指令执行后的结果

K : 立即数

k : 地址常数

b : 寄存器的指定位或 I/O 寄存器 (3 bit)

s : 状态寄存器的指定位 (3 bit)

X,Y,Z : 地址指针寄存器 (X= R27:R26, Y= R29:R28 , Z=R31:R30)

A : I/O 地址

q : 地址偏移量 (6 bit)


I/O Registers

I/O 寄存器

RAMPX, RAMPY, RAMPZ

RAMPX, RAMPY, RAMPZ与X，Y，Z寄存器结合起来使用，可以对超过64k字节的整个数据空间进行间接寻址，还可以从超过64k字节的程序空间中读取常量数据。

RAMPD

RAMPD与Z寄存器结合起来使用，能够对超过64K的整个数据空间进行直接寻址。

EIND

该寄存器与指令字结合起来使用，可以在超过128K的整个程序空间进行间接跳转和调用。

Stack

STACK:存储寄存器值或返回地址的叠式存储器（堆栈）

SP:堆栈指针

Flags

<>  :被指令影响的标志位

0   :被指令清零的标志位

1   :被指令置位的标志位

-   :不受指令影响的标志位


ADC - 带进位的加法

说明：

两个寄存器和C标志位的内容相加，结果送目的寄存器Rd。

操作：

(i)Rd ← Rd + Rr + C

语法：                     操作数：                           程序计数器：

(i)ADC Rd, Rr           0 ≤ d ≤ 31, 0 ≤ r ≤ 31            PC <-  PC + 1

机器码：

0001

11rd

dddd

rrrr

状态寄存器 (SREG)标志位:
I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H:Rd3 · Rr3+Rr3 · R3 + R3 · Rd3 如果第3位有进位置1，否则清零

S: N [+] V 符号测试

V:Rd7 · Rr7 · R7 + Rd7 · Rr7 · R7 如果结果的补码溢出则置1，否则清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C:Rd7 · Rr7 + Rr7 · R7 + R7 · Rd7 如果结果的最高有效位有进位则置1，否则清零

R (结果) 在操作之后等于Rd

例如：

R1:R0 与 R3:R2 相加

add r2,r0 ; 加低字节

adc r3,r1 ; 带进位加高字节

字长: 1 (2 字节)

指令周期： 1


ADD - 不带进位的加法

说明：

两个寄存器不带进位C标志位相加，结果送目的寄存器Rd。

操作：

Rd <- Rd + Rr

语法：                  操作数：                                   程序计数器：

ADD Rd,Rr             0 ≤ d ≤ 31, 0 ≤ r ≤ 31                   PC <- PC + 1

机器码：

0000

11rd

dddd

rrrr

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H:Rd3 · Rr3+Rr3 · R3 + R3 · Rd3 如果第3位有进位置1，否则清零

S: N [+] V 符号测试

V:Rd7 · Rr7 · R7 + Rd7 · Rr7 · R7 如果结果的补码溢出则置1，否则清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C:Rd7 · Rr7 +Rr7 · R7 + R7 · Rd7 如果结果为$00置1，否则清零

R (结果) 在操作之后等于Rd

例如：

add r1,r2               ; r1与r2相加(r1=r1+r2)

add r28, r28            ; r28自加 (r28=r28+r28)

字长: 1 (2 字节)

指令周期： 1


ADIW - 字加立即数

说明：

寄存器对与立即数 (0-63) 相加，结果放到寄存器对。此指令只用于最后4个寄存器对和指针寄存器。

此指令并不是在所有的芯片上都适用。详情请参照设备专用指令集。

操作：

(i)Rd+1:Rd <- Rd+1:Rd + K

语法：                         操作数：                                   程序计数器：

(i)ADIW Rd+1:Rd,K      d E {24,26,28,30}, 0 <= K <= 63             PC <- PC + 1

机器码：

1001

0110

KKdd

KKKK

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | <> | <> | <> | <>

S: N [+] V , 符号测试

V:Rdh7 · R15 如果操作结果的补码溢出则置1，否则清零

N:R15 如果结果的最高有效位为1则置1，否则清零

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$0000置1，否则清零

C: R15 · Rdh7 如果结果的最高有效位有进位则置1，否则清零

R (结果) 在操作之后等于Rdh:Rdl (Rdh7-Rdh0 = R15-R8, Rdl7-Rdl0=R7-R0)

例如：

adiw r25:24,1                             ; 将 r25:r24 加1

adiw ZH:ZL,63                             ; 将Z指针(r31:r30)加上63

字长: 1 (2 字节)

指令周期： 2


AND - Logical AND

AND - 逻辑与

说明：

寄存器Rd和寄存器Rr的内容逻辑与，结果送目的寄存器Rd。

操作：

(i)Rd ← Rd · Rr

语法：               操作数：                     程序计数器：

(i)AND Rd,Rr     0 ≤ d ≤ 31, 0 ≤ r ≤ 31        PC ← PC + 1

机器码：

0010

00rd

dddd

rrrr

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V, 符号测试

V:0 清零

N: R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

R (结果) 在操作之后等于Rd

例如：

and r2,r3 ; r2和r3按位与，结果放在r2

ldi r16,1 ; 把立即数0000 0001装入r16

and r2, r16 ; 只取r2的第0位

字长: 1 (2 字节)

指令周期： 1


ANDI - 与立即数

说明：

寄存器Rd的内容与常数逻辑与，结果送目的寄存器Rd

操作：

 (i)Rd ← Rd · K

     语法：           操作数：                            程序计数器：

 (i)ANDI Rd,K     16 ≤ d ≤ 31, 0 ≤ K ≤ 255          PC ← PC + 1

机器码：

0111

KKKK

dddd

KKKK

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V, 符号测试

V:0 清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

R (结果) 在操作之后等于Rd

例如：

andi r17,$0F          ; 将r17的高半字节清零

andi r18,$10          ; 取r18的第4位

andi r19,$AA          ; 将r19的奇数位清零

字长: 1 (2 字节)

指令周期： 1


ASR - 算术右移

说明：

寄存器Rd中的所有位右移1位，而第7位保持原逻辑值，第0位被装入SREG的C 标志位。这个操作实现补码值除以2，而不改变符号。进位标志用于结果的舍入。

操作：

(i)

    语法：                操作数：                    程序计数器：

(i)ASR R               d0 ≤ d ≤ 31                  PC ← PC + 1

机器码：

1001

010d

dddd

0101

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | <> | <> | <> | <>

S: N [+] V, 符号测试

V:N [+] C (用来标志右移后的N和C)

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C:Rd0 如果在右移之前Rd的LSB为1则置1，否则清零

R (结果) 在操作之后等于Rd

例如：

dir 16,$10              ; 将十进制数16装入r16

asr r16                 ; r16=r16 / 2

ldi r17,$FC             ; 将-4装入r17

asr r17                 ; r17=r17/2

字长: 1 (2 字节)

指令周期： 1


BCLR - Bit Clear in SREG

BCLR - SREG指定位清零

说明：

状态寄存器SREG的指定位清零

操作：

(i)SREG(s) ← 0

    语法：                     操作数：                      程序计数器：

(i)BCLR s                   0 ≤ s ≤ 7                      PC <- PC + 1

机器码：

1001

0100

1sss

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
<> | <> | <> | <> | <> | <> | <> | <>

I:0 如果s = 7为0，否则不变

T:0 如果s = 6为0，否则不变

H:0 如果s = 5为0，否则不变

S:0 如果s = 4为0，否则不变

V:0 如果s = 3为0，否则不变

N:0 如果s = 2为0，否则不变

Z:0 如果s = 1为0，否则不变

C:0 如果s = 0为0，否则不变

例如：

bclr 0; 清零C

bclr 7; 禁止全局中断

字长: 1 (2 字节)

指令周期： 1


BLD - Bit Load from the T Flag in SREG to a Bit in Register.

BLD - 装入SREG 的T标志位到寄存器中的某一位

说明：

复制SREG (状态寄存器)的T标志位到寄存器Rd中的第b位。

操作：

Rd(b) <- T

语法：                          操作数：                      程序计数器：

BLD Rd,b                   0 ≤ d ≤ 31, 0 ≤ b ≤ 7          PC <- PC + 1

机器码:

1111

100d

dddd

0bbb

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

; 复制位

bst r1,2         ; 存储r1的第2位到T标志位中

bld r0, 4        ; 将T标志位装入到r0的第4位

字长: 1 (2 字节)

指令周期： 1


BRBC - Branch if Bit in SREG is Cleared

BRBC - SREG（s）为0跳转

说明：

条件相对跳转。执行该指令时，PC先加1，再测试SREG 的第s位，如果该位被清零，则跳转k个字，k为7位带符号数，最多可向前跳63个字，向后跳64个字；否则顺序执行。在汇编程序中，用目的地址的标号替代相对跳转字k。

操作：

If SREG(s) = 0 then PC <- PC + k + 1, else PC <- PC + 1

语法：                 操作数：                     程序计数器：

BRBC s, k         0 ≤ s ≤ 7, -64 ≤ k ≤ +63      PC <- PC + k + 1

PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

ksss

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cpi r20,5        ; 比较r20与数字5

brbc 1,noteq     ; 若SREG的z标志位（第1位）为0跳转

...

noteq:nop        ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRBS - Branch if Bit in SREG is Set

BRBS - SREG（s）为1跳转

说明：

条件相对跳转。执行该指令时，PC先加1，再测试SREG 的s位，如果该位被置位，则跳转k个字，k为7位带符号数，最多可向前跳63个字，向后跳64个字；否则顺序执行。在汇编程序中，用目的地址的标号替代相对跳转字k。

操作：

If SREG(s) = 1 then PC ← PC + k + 1, else PC ← PC + 1

语法：                  操作数：                          程序计数器：

BRBS s,k           0 ≤ s ≤ 7, -64 ≤ k ≤ +63           PC <- PC + k + 1

                                                      PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

ksss

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

Example:

bstr 0,3             ; 装入r0的第3位到T标志位

brbs 6, bitset       ; 若T标志位（第6位）为1跳转

...

bitset:    nop                  ; 跳转到目标语句执行(空操作)

字长： 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRCC - C=0跳转

BRCC - 进位位为0跳转

说明：

条件相对跳转。测试进位标志C，如果C位被清除，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。这条指令相当于指令 BRBC 0，k。

操作：

If C = 0 then PC <- PC + k + 1, else PC <- PC + 1

语法：               操作数：                     程序计数器：

BRCC k             -64 ≤ k ≤ +63              PC <- PC + k + 1

                                              PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

add  r22,r23               ; r23加上r22

brcc nocarry               ; C=0跳转

...

nocarry:   nop                   ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRCS - C=1跳转

BRCS - 进位位为1跳转

说明：

条件相对跳转，测试进位标志C，如果C位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。这条指令相当于指令 BRBS 0，k。

操作：

If C = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：                操作数：                        程序计数器：

BRCS k              -64 ≤ k ≤ +63                  PC <- PC + k + 1

                                                   PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cpi r26, $56                ; 比较r26与$56

brcs carry                  ; C=1跳转

...

carry:      nop                        ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BREAK - Break

BREAK - 终断执行

说明：

BREAK指令用于在线调试系统，它通常不在应用程序中使用。一旦BREAK指令执行，AVR CPU 将被置于停止模式，此时可以使用在线调试器获取CPU内部资源数据和变化。

如果任何的锁定位置位，或者JTAGEN和OCDEN镕丝位都处于未编程状态，CPU会把BREAK指令当作一个空操作来对待，此时不会进入停止模式。

此指令不是任何芯片都支持。详情请参照芯片特殊指令集。

操作：

在线调试终断执行

语法：               操作数：                程序计数器：

BREAK                 无                  PC <- PC + 1

机器码：

1001

0101

1001

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

字长: 1 (2 字节)

指令周期： 1


BREQ - 相等跳转

说明：

条件相对跳转，测试零标志位Z，如果Z位被置位，则相对PC值跳转k个字。如果在执行CP、CPI、SUB 或SUBI 指令后，立即执行该指令，且当寄存器Rd中数与寄存器 Rr中数相等时，将发生跳转。可跳转k个字，k为7位带符号数，最多可向前跳63个字，向后跳64个字。这条指令相当于指令BRBS 1，k。

操作：

If Rd = Rr (Z = 1) then PC <- PC + k + 1, else PC <- PC + 1

语法：                操作数：                    程序计数器：

BREQ k              -64 ≤ k ≤ +63             PC <- PC + k + 1

                                              PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k001

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cp        r1, r0           ; 比较r1和r0

breq     equal             ; 寄存器相等则跳转

...

equal:     nop                        ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRGE - Branch if Greater or Equal (Signed)

BRGE - 大于或等于跳转（带符号数）

说明：

条件相对跳转。测试符号标志S，如果S位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。如果在执行CP、CPI、SUB 或SUBI 指令后立即执行该指令，且当在寄存器Rd中带符号二进制数大于或等于寄存器Rr中带符号二进制数时，将发生跳转。该指令相当于指令 BRBC 4，k。

操作：

If Rd ≥ Rr (N ⊕ V = 0) then PC ← PC + k + 1, else PC ← PC + 1

语法：              操作数：                       程序计数器：

BRGE k            k-64 ≤ k ≤ +63                PC <- PC + k + 1

                                                PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k100

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cp     r11,r12             ; 比较r11和r12

brge   greateq             ; 如果r11 ≥ r12则跳转 (有符号)

...

greateq:   nop                        ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRHC - Branch if Half Carry Flag is Cleared

BRHC - 半进位标志H= 0跳转

说明：

条件相对跳转，测试半进位标志H，如果H位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令 BRBC 5，k。

操作：

If H = 0 then PC ← PC + k + 1, else PC ← PC + 1

语法：              操作数：                       程序计数器：

BRHC k               -64 ≤ k ≤ +63                   PC <- PC + k + 1

                                                      PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k101

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

brhc hclear            ; 半进位标志H=0跳转

...

hclear:    nop               ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

         2 （如果条件为真）


BRHS - Branch if Half Carry Flag is Set

BRHS - 半进位标志H= 1跳转

说明：

条件相对跳转，测试半进位标志H，如果H位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBS 5，k。

操作：

If H = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：            操作数：                      程序计数器：

BRHS k             -64 ≤ k ≤ +63                PC <- PC + k + 1

                                                  PC <- PC + 1, if 如果条件为假

机器码：

1111

00kk

kkkk

k101

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

brhs hset        ; 半进位标志H=1跳转

...

hset:      nop              ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRID - Branch if Global Interrupt is Disabled

BRID - 中断允许位I= 0跳转

说明：

条件相对跳转，测试全局中断允许标志I，如果I位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令 BRBC 7，k。

操作：

If I = 0 then PC <- PC + k + 1, else PC <- PC + 1

语法：         操作数：                    程序计数器：

BRID k          -64 ≤ k ≤ +63              PC <- PC + k + 1

                                             PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k111

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

brid intdis ; 中断允许位I=0跳转

...

intdis:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRIE - Branch if Global Interrupt is Enabled

BRIE - 中断允许位I= 1跳转

说明：

条件相对跳转，测试全局中断允许标志I，如果I位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令 BRBS 7，k。

操作：

If I = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：          操作数：                程序计数器：

BRIE k           -64 ≤ k ≤ +63           PC ← PC + k + 1

                                          PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k111

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

brie inten ; 中断允许位I=1跳转

...

inten:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRLO - 小于跳转（无符号）

说明：

条件相对跳转，测试进位标志C，如果C位被置位，则相对PC值跳转k个字。如果在执行CP、 CPI、SUB 或 SUBI指令后立即执行该指令，且当在寄存器Rd中无符号二进制数小于在寄存器Rr中无符号二进制数时，将发生跳转。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令 BRBS 0，k。

操作：

If Rd < Rr (C = 1) then PC <- PC + k + 1, else PC <- PC + 1

语法：           操作数：                    程序计数器：

BRLO k            -64 ≤ k ≤ +63              PC <- PC + k + 1

                                               PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

eor r19,r19 ; r19清零

loop:incr19 ; r19加1

...

cpi r19,$10 ; 比较r19和$10

brlo loop ; 如果r19 < $10 (无符号)则跳转

nop ; 退出loop(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRLT - 小于跳转（有符号）

说明：

条件相对跳转，测试符号标志S，如果S位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。如果在执行CP、 CPI、 SUB 或 SUBI指令后立即执行该指令，且当在寄存器Rd中带符号二进制数小于在寄存器Rr中带符号二进制数时，将发生跳转。该指令相当于指令BRBS 4，k。

操作：

If Rd < Rr (N [+] V = 1) then PC <- PC + k + 1, else PC <- PC + 1

语法：           操作数：                      程序计数器：

BRLT k            -64 ≤ k ≤ +63              PC <- PC + k + 1

                                              PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k100

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cp r16,r1 ; 比较r16和r1

brlt less ; 如果r16 < r1 (带符号)则跳转

...

less:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRMI - 为负跳转

说明：

条件相对跳转，测试负号标志N，如果N位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBS 2，k。

操作：

If N = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：              操作数：                       程序计数器：

BRMI k               -64 ≤ k ≤ +63                 PC <- PC + k + 1

                                                    PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k010

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

subi r18,4           ; r18减4

brmi negative        ; 如果结果为负则跳转

...

negative:  nop                  ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）


BRNE - 不相等跳转

说明：

条件相对跳转，测试零标志位Z，如果Z位被清零，则相对PC值跳转k个字。如果在执行CP、 CPI、 SUB 或 SUBI 指令后，立即执行该指令，且当寄存器Rd中数与寄存器 Rr中数不相等时，将发生跳转。可跳转k个字，k为7位带符号数，最多可向前跳63个字，向后跳64个字。这条指令相当于指令BRBC 1，k

操作：

If Rd ≠ Rr (Z = 0) then PC ← PC + k + 1, else PC ← PC + 1

语法：            操作数：                     程序计数器：

BRNE k             -64 ≤ k ≤ +63               PC <- PC + k + 1

                                                 PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k001

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

eor r27,r27 ; r27清零

loop:inc r27 ; r27加1

...

cpir27,5 ; 比较r27和 5

brneloop ; 如果r27<或>5则跳转

nop ; 退出Loop (空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRPL - 为正跳转

说明：

条件相对跳转，测试负号标志N，如果N位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBC 2，k

操作：

If N = 0 then PC ← PC + k + 1, else PC ← PC + 1

语法：            操作数：                     程序计数器：

BRPL k             -64 ≤ k ≤ +63               PC <- PC + k + 1

                                                 PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k010

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

subi r26,$50 ; r26减$50

brpl positive ; 如果r26为正则跳转

...

positive:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRSH - 大于等于跳转（无符号）

说明：

条件相对跳转，测试进位标志C，如果C位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。如果在执行CP、 CPI、 SUB 或 SUBI指令后，立即执行该指令，且当在寄存器Rd中无符号二进制数大于或等于寄存器Rr中无符号二进制数时，将发生跳转。该指令相当于指令 BRBS 0，k。

操作：

If Rd ≥Rr (C = 0) then PC ← PC + k + 1, else PC ← PC + 1

语法：             操作数：                  程序计数器：

BRSH k              -64 ≤ k ≤ +63            PC <- PC + k + 1

                                               PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

subi r19,4 ; r19减4

brsh highsm ; 如果r19 >= 4 (无符号)则跳转

...

highsm:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRTC - Branch if the T Flag is Cleared

BRTC - 标志位T= 0跳转

说明：

条件相对跳转，测试T标志位，如果标志位T被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBC 6，k。

操作：

If T = 0 then PC <- PC + k + 1, else PC <- PC + 1

语法：            操作数：                      程序计数器：

BRTC k             -64 ≤ k ≤ +63                PC <- PC + k + 1

                                                  PC <- PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k110

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

bst r3,5 ; 将r3的第5位存储到T标志位

brtc tclear ; 如果这一位为0则跳转

...

tclear:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRTS - Branch if the T Flag is Set

BRTS - 标志位T= 1跳转

说明：

条件相对跳转，测试标志位T，如果标志位T被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBS 6，k。

操作：

If T = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：          操作数：                   程序计数器：

BRTS k           -64 ≤ k ≤ +63             PC <- PC + k + 1

                                             PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k110

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

bst r3,5 ; 将r3的第5位存储到T标志位

brts tset ; 如果这一位为1则跳转

...

tset:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRVC - Branch if Overflow Cleared

BRVC - 溢出位V= 0跳转

说明：

条件相对跳转，测试溢出标志V，如果V位被清零，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字。该指令相当于指令BRBC 3，k。

操作：

If V = 0 then PC <- PC + k + 1, else PC <- PC + 1

语法：       操作数：                  程序计数器：

BRVC k        -64 ≤ k ≤ +63            PC <- PC + k + 1

                                         PC ← PC + 1, 如果条件为假

机器码：

1111

01kk

kkkk

k011

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

add r3,r4 ; r4加r3

brvc noover ; 如果没有溢出则跳转

...

noover:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BRVS - Branch if Overflow Set

BRVS - 溢出位V= 1跳转

说明：

条件相对跳转，测试溢出标志V，如果V位被置位，则相对PC值跳转k个字。k为7位带符号数，最多可向前跳63个字，向后跳64个字该指令相当于指令BRBS 3，k。

操作：

If V = 1 then PC <- PC + k + 1, else PC <- PC + 1

语法：               操作数：                   程序计数器：

BRVS k                -64 ≤ k ≤ +63               PC <- PC + k + 1

                                              PC <- PC + 1, 如果条件为假

机器码：

1111

00kk

kkkk

k011

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

add r3,r4 ; r4加r3

brvs overfl ; 如果溢出则跳转

...

overfl:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1 （如果条件为假）

2 （如果条件为真）


BSET - Bit Set in SREG

BSET - 置位SREG

说明：

将状态寄存器SREG的某一标志位置1。

操作：

SREG(s) ← 1

语法：      操作数：              程序计数器：

BSET s       0 ≤ s ≤ 7              PC ← PC + 1

机器码：

1001

0100

0sss

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
<> | <> | <> | <> | <> | <> | <> | <>

I: 1 如果 s = 7; 否则不改变。

T: 1 如果 s = 6;否则不改变。

H: 1 如果 s = 5; 否则不改变。

S: 1 如果 s = 4; 否则不改变。

V: 1 如果 s = 3; 否则不改变。

N: 1 如果 s = 2; 否则不改变。

Z: 1 如果 s = 1; 否则不改变。

C: 1 如果 s = 0; 否则不改变。

例如：

bset 6 ; T标志位置1

bset 7 ; 全局中断允许

字长: 1 (2 字节)

指令周期： 1


BST - Bit Store from Bit in Register to T Flag in SREG

BST - Rr的b位送T

说明：

把寄存器Rr中的位b存储到SREG状态寄存器中的T标志位中。

操作：

T <- Rd(b)

语法：          操作数：                          程序计数器：

BST Rd,b         0 ≤ d ≤ 31, 0 ≤ b ≤ 7              PC <- PC + 1

机器码：

1111

101d

dddd

0bbb

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | <> | - | - | - | - | - | -

T:0 如果Rd的第b位为0。否则置1。

例如：

; 复制一位

bst r1,2 ; 将r1的第2位存储到T标志位

bld r0,4 ; 把T标志位装入r0的第4位

字长: 1 (2 字节)

指令周期： 1


CALL - Long Call to a Subroutine

CALL - 直接调用

说明：

将PC+2后的值（CALL指令后的下一条指令地址）压入堆栈，然后直接调用k处地址的子程序。

T本指令对有些芯片不适用。详情请参照设备指令集。

操作：

PC <- k 16位PC, 128K字节的程序存储器

PC <- k 22位PC, 8M字节的程序存储器

语法：         操作数：              程序计数器：          堆栈：

CALL k          0 ≤ k < 64K            PC <- k          STACK <- PC+2

                                                        SP <- SP-2, (2 bytes, 16 bits)

CALL k          0 ≤ k < 4M             PC <- k          STACK <- PC+2

                                                         SP <- SP-3 (3 bytes, 22 bits)

机器码：

1001 | 010k | kkkk | 111k
kkkk | kkkk | kkkk | kkkk

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

mov r16,r0 ; 送r0到r16

call check ; 直接子程序调用

nop ; 继续 (空操作)

...

check: cpi r16, $42 ; 检测是否r16有一个特殊值

breq error ; 相等跳转

ret ; 从子程序返回

...

error: rjmp error ; 无限循环

字长: 2 (4 字节)

指令周期： 4, 16位PC

5, 22位PC


CBI - 清零I/O位

说明：

清零指定I/O寄存器中的指定位。该指令只用在低32个I/O寄存器上操作，I/O寄存器地址为0～31。

操作：

I/O(A,b) <- 0

语法：            操作数：                         程序计数器：

CBI A, b           0 ≤ A ≤ 31, 0 ≤ b ≤ 7             PC ← PC + 1

机器码：

1001

1000

AAAA

Abbb

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cbi $12, 7 ; 清零Port D的第7位

字长: 1 (2 字节)

指令周期： 2


CBR - Clear Bits in Register

CBR - 寄存器位清零

说明：

清除寄存器Rd中的指定位，利用寄存器Rd的内容与常数表征码K的补码相与，其结果放在寄存器Rd中。

操作：

Rd <- Rd · ($FF - K)

语法：         操作数：                           程序计数器：

CBR Rd,K        16 ≤ d ≤ 31, 0 ≤ K ≤ 255            PC <- PC + 1

机器码： (参看ANDI，将K用其补码取代)

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N ⊕ V, 符号测试

V:0 清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

R (结果) 在操作之后等于Rd

例如：

cbr r16, $F0 ; 清零r16的高半字节

cbr r18, 1 ; 清零r18的第0位

字长: 1 (2 字节)

指令周期： 1


CLC - 清零C

说明：

清零SREG状态寄存器中的进位标志C

操作：

C <- 0

语法：       操作数：         程序计数器：

CLC           无              PC <- PC + 1

机器码：

1001

0100

1000

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | 0

C: 0 C标志位清零

例如：

add r0, r0 ; r0+r0

clc ; 清零C

字长: 1 (2 字节)

指令周期： 1


CLH - 清零H

说明：

CLH清零SREG状态寄存器中的半进位标志H。

操作：

(i) H ← 0

语法：         操作数：               程序计数器：

(i) CLH         无                    PC ← PC + 1

机器码：

1001

0100

1101

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | 0 | - | - | - | - | -

H: 0

H标志位清零

例如：

clh; 清零H标志位

字长： 1 (2 字节)

指令周期： 1


CLI - Clear Global Interrupt Flag

CLI - 清零I

说明：

清除SREG状态寄存器中的全局中断标志位I。中断将立即被禁止。在CLI指令执行后，没有中断可以执行。

操作：

I <- 0

语法：        操作数：            程序计数器：

CLI            无                 PC <- PC + 1

机器码：

1001

0100

1111

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
0 | - | - | - | - | - | - | -

I: 0

全局中断标志位清零

例如：

in temp, SREG ; 装入SREG的值 (temp是用户自己定义的)

cli ; 禁止中断

sbi EECR, EEMWE ; 写EEPROM

sbi EECR, EEWE

out SREG, temp ; 重新装入SREG的值(I标志位)

字长: 1 (2 字节)

指令周期： 1


CLN - 清零N

说明：

清零SREG状态寄存器中的负数标志位N

操作：

N <- 0

语法：      操作数：          程序计数器：

CLN          无               PC <- PC + 1

机器码：

1001

0100

1010

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | 0 | - | -

N: 0 负数标志位清零

例如：

add r2,r3 ; r3+r2

cln ; 清零N

字长: 1 (2 字节)

指令周期： 1


CLR - 寄存器清零

说明：

寄存器清零。该指令采用寄存器Rd与自己的内容相异或实现的寄存器的所有位都被清零。

操作：

Rd <- Rd [+] Rd

语法：      操作数：           程序计数器：

CLR Rd       0 ≤ d ≤ 31          PC <- PC + 1

机器码： (参见EOR Rd,Rd)

0010

01dd

dddd

dddd

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | 0 | 0 | 0 | 1 | -

S: 0 清零

V:0 清零

N:0 清零

Z:1 置位

R (结果) 在操作之后等于Rd

例如：

clr r18 ; 清零r18

loop: inc r18 ; r18加1

...

cpi r18, $50 ; 比较r18与$50

brne loop

字长: 1 (2 字节)

指令周期： 1


CLS - 清零S

说明：

清零SREG状态寄存器中的符号标志位S

操作：

S <- 0

语法：      操作数：          程序计数器：

CLS          无               PC <- PC + 1

机器码：

1001

0100

1100

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | 0 | - | - | - | -

S: 0 符号标志位清零

例如：

add r2,r3 ; r3+r2

cls ; 清零S

字长: 1 (2 字节)

指令周期：


CLT - Clear T Flag

CLT - 清零T

说明：

清零SREG状态寄存器中的T标志位

操作：

T <- 0

语法：      操作数：          程序计数器：

CLT          无               PC <- PC + 1

机器码：

1001

0100

1110

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | 0 | - | - | - | - | - | -

T: 0 T标志位清零

例如：

clt ; 清零T标志位

字长: 1 (2 字节)

指令周期： 1


CLV - 清零V

说明：

清零SREG状态寄存器中的溢出标志位V

操作：

V <- 0

语法：        操作数：            程序计数器：

CLV            无                 PC <- PC + 1

机器码：

1001

0100

1011

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | 0 | - | - | -

V: 0 溢出标志位清零

例如：

add r2,r3 ; r3+r2

clv ; 清零V

字长: 1 (2 字节)

指令周期： 1


CLZ - 清零Z

说明：

清零SREG状态寄存器中的零标志Z。

操作：

Z <- 0

语法：          操作数：          程序计数器：

CLZ              无               PC <- PC + 1

机器码：

1001

0100

1001

1000

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | 0 | -

Z: 0 零标志位清零

例如：

add r2,r3 ; r3+r2

clz ; 清零零标志位

字长: 1 (2 字节)

指令周期： 1


COM - 取反

说明：

该指令完成对寄存器Rd的二进制反码操作。

操作：

Rd <- $FF - Rd

语法：         操作数：            程序计数器：

COM Rd          0 ≤ d ≤ 31           PC <- PC + 1

机器码：

1001
010d
dddd
0000
状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | 1

S:N [+] V 符号测试

V:0 清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C:1 置位

R (结果) 在操作之后等于Rd

例如：

com r4 ; r4取反

breq zero ; 为零跳转

...

zero: nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1


CP - 比较

说明：

该指令完成两个寄存器Rd 和Rr相比较操作，而寄存器的内容不改变，该指令后能使用所有条件跳转指令。

操作：

Rd - Rr

语法：         操作数：                         程序计数器：

CP Rd,Rr        0 ≤ d ≤ 31, 0 ≤ r ≤ 31            PC <- PC + 1

机器码：

0001

01rd

dddd

rrrr

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · Rr3+ Rr3 · R3 +R3 · Rd3 如果第3位有借位则置位，否则清零

S: N [+] V, 符号测试

V:Rd7 · Rd7 · R7 + Rd7 · Rr7 · R7 如果结果的补码溢出则置位，否则清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C: Rd7 · Rr7+ Rr7 · R7 +R7 · Rd7 如果Rr的绝对值大于Rd的绝对值则置位，否则清零

R (结果) 在操作之后等于Rd

例如：

cp r4,r19 ; 比较r4与r19

brne noteq ; 如果r4 <或> r19则跳转

...

noteq: nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1


CPC - 带进位比较

说明：

该指令完成寄存器Rd的值和寄存器Rr加C相比较操作，而寄存器的内容不改变，该指令后能使用所有条件跳转指令。

操作：

Rd - Rr - C

语法：          操作数：                          程序计数器：

CPC Rd,Rr        0 ≤ d ≤ 31, 0 ≤ r ≤ 31             PC <- PC + 1

机器码：

0000

01rd

dddd

rrrr

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · Rr3+ Rr3 · R3 +R3 · Rd3 如果第3位有借位则置位，否则清零

S: N ⊕ V, 符号测试

V:Rd7 · Rr7 · R7 + Rd7 · Rr7 · R7 如果结果的补码溢出则置位，否则清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 · Z 当结果为零时保留以前的值不变，否则清零

C: Rd7 · Rr7+ Rr7 · R7 +R7 · Rd7 如果Rr的绝对值加上前面的进位大于Rd的绝对值则置位，否则清零

R (结果) 在操作之后等于Rd

例如：

; 比较r3:r2和r1:r0

cp r2,r0 ; 比较低字节

cpc r3,r1 ; 比较高字节

brne noteq ; 不相等跳转

...

noteq:nop ; 跳转到目标语句执行(空操作)

字长: 1 (2 字节)

指令周期： 1


CPI - 与立即数比较

说明：

该指令完成寄存器Rd和常数的比较操作，寄存器的内容不改变，该指令后能使用所有条件跳转指令。

操作：

Rd - K

语法：        操作数：                               程序计数器：

CPI Rd,K       16 ≤ d ≤ 31, 0≤ K ≤ 255                 PC <- PC + 1

机器码：

0011

KKKK

dddd

KKKK

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · K3+ K3 · R3+ R3 · Rd3 如果第3位有借位则置位，否则清零

S: N [+] V, 符号测试

V:Rd7 · K7 · R7 + Rd7 · K7 · R7 如果结果的补码溢出则置位，否则清零

N:R7 如果结果的最高有效位为1则置1，否则清零

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 如果结果为$00置1，否则清零

C: Rd7 · K7 +K7 · R7+ R7 · Rd7 如果K的绝对值大于Rd的绝对值则置位，否则清零

R (结果) 在操作之后等于Rd

例如：

cpi r19,3 ; 比较r19和3

brne error ; 如果r19<或>3则跳转

...

error: nop ; 跳转到目标语句执行(空操作)

字长： 1 (2 字节)

指令周期： 1


CPSE - Compare Skip if Equal

CPSE - 比较相等跳行

说明：

该指令完成两个寄存器Rd和Rr的比较，若Rd=Rr，则跳一行执行指令。

操作：

If Rd = Rr then PC <- PC + 2 (or 3) else PC <- PC + 1

语法：          操作数：                         程序计数器：

CPSE Rd,Rr       0 ≤ d ≤ 31, 0 ≤ r ≤ 31        PC <- PC + 1, 条件为假 - 无跳行

                                                  PC <- PC + 2, 跳过一个一字长的指令

                                                  PC ← PC + 3, 跳过一个两字长的指令

机器码：

0001

00rd

dddd

rrrr

状态寄存器 (SREG) 标志位:
I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

inc r4 ; r4加1

cpse r4,r0 ; 比较r4和r0

neg r4 ; 仅当r4<或>r0时执行

nop ; 继续(空操作)

字长: 1 (2 字节)

指令周期： 1 如果条件为假 (无跳行)

2 如果条件为真 (执行跳行) ，跳过一个字的指令执行

3 如果条件为假 (执行跳行) ，跳过两个字的指令执行


DEC - Decrement

DEC - 减1

说明：

寄存器Rd内容减1，并将结果置于目标寄存器Rd中。

该操作不改变SREG中的C标志，所以INC指令允许在多倍字长计算中用作循环计数。

当对无符号数操作时，仅有BREQ（相等跳转）和BRNE（不相等跳转）指令有效。当对2进制补码值进行操作时，所有的带符号跳转指令都有效。

操作：

Rd <- Rd - 1

语法：                 操作数：                  程序计数器：

DEC Rd               0 ≤ d ≤ 31             PC <- PC + 1

操作码：

1001

010d

dddd

1010

状态寄存器 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | <> | <> | <> | -

S:N [+] V

检验正负

V: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果的2进制补码溢出则置1；否则为0 。本指令中当且仅当运算前Rd中的数值是$80F时有补码溢出。

N:R7

如果结果的最高有效位是1则置1；否则清0

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置位；否则清0。

运算结束后结果保存在目标寄存器Rd中。

例如：

ldi r17, $10 ;寄存器r17装入常量

loop: add r1, r2 ;将r2装入r1

dec r17 ;r17值减1

brne loop ;如果r17不等于零则跳转

nop ; 继续（空操作）

字长: 1 (2 字节)

指令周期： 1


EICALL - 间接子程序调用（扩展）

说明：

由位于寄存器组和I/O空间的寄存器EIND中的指针Z（16位）指定的间接子程序调用。此指令允许间接调用至整个程序存储器空间。在间接子程序调用（EICALL）时，堆栈指针运算后减小。

此指令不能在PC指针为16位的芯片上使用，参见ICALL。请具体参考各芯片指令总汇。

操作：

PC(15:0) <- Z(15:0)

PC(21:16) <- EIND

语法：        操作数：             程序计数器：              堆栈:

EICALL      无              要看具体的操作               STACK <- PC + 1

                                                       SP -< SP - 3 (3 字节, 22 位)

操作码：

1001

0101

0001

1001

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

ldi r16,$05 ;设置EIND和指针Z

out EIND,r16

ldi 30, $00

ldi r31, $10

eicall ;调用至$051000

字长: 1 (2 字节)

指令周期： 4 (只可在22位PC机上实现)


EIJMP - 间接跳转（扩展）

说明：

间接跳转到由位于寄存器组和I/O空间的寄存器EIND中的指针Z（16位）指定的地址。此指令允许间接跳转至整个程序存储器空间。

此指令不是在所有的机器上都有效。请参考机器特殊指令设置总汇。

操作：

PC(15:0) <- Z(15:0)

PC(21:16) <- EIND

语法：     操作数：          程序计数器：             堆栈:

EIJMP    无               要看具体的操作          无影响

操作码：

1001

0100

0001

1001

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

ldi r16, $05 ;设置EIND和指针Z

out EIND, r16

ldi r30, $00

ldi r31, $10

eijmp ;跳转至$051000

字长: 1 (2 字节)

指令周期： 2


ELPM - 从程序区取数（扩展）

说明：

从针寄存器Z和位于I/O空间的指针RAMPZ指定的地址读取一个字节数据，并将此字节数据置于目标寄存器Rd中。此指令特点是拥有有效常量初始化和常量数据提取的100%空间。程序寄存器由16位字长组成而指针Z是一个字节地址。因此，指针Z的最低有效位是低位(ZLSB = 0)或高位(ZLSB = 1)。此指令可在整个程序存储器空间定位。指针存储器Z可以由操作设置为不变，或者带后增量。带后增量适用于RAMPZ和指针寄存器Z的完整24位串联。

拥有自带程序能力的机器能使用指令ELPM读取保险数并锁定位值。详细说明请参考使用手册。

此指令不是在所有的机器上都有效。请参考机器特殊指令设置总汇。

下面所列的组合就没有被定义：

ELPM r30, Z+

ELPM r31, Z+

操作：                                                     注释:

(1)R0 <- (RAMPZ:Z)                                         RAMPZ:Z: 未改变, R0 隐含定义指针

(2)Rd <- (RAMPZ:Z)                                         RAMPZ:Z: 未改变

(3)Rd <- (RAMPZ:Z) (RAMPZ:Z) <- (RAMPZ:Z) + 1              RAMPZ:Z: 运算后加1

语法：            操作数：                                   程序计数器：

(1) ELPM           无, R0 implied                           PC <- PC + 1

(2) ELPM Rd, Z     0 ≤ d ≤ 31                              PC <- PC + 1

(3) ELPM Rd, Z+    0 ≤ d ≤ 31                              PC <- PC + 1

16位操作码：

(1) | 1001 | 0101 | 1101 | 1000
(2) | 1001 | 000d | dddd | 0110
(3) | 1001 | 000d | dddd | 0111

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

ldi ZL, byte3(Table_1<<1) ; 初始化指针Z

out RAMP Z, ZL

ldi ZH, byte2(Table_1<<1)

ldiZL, byte1(Table_1<<1)

elpm r16, Z+ ; 从程序中加载常量

; 由RAMPZ:Z(Z 是 r31:r30)指向存储器

...

Table_1:

.dw 0x3738 ; 当ZLSB = 0时0x38被访问

; 当ZLSB = 1时0x37被访问

...

字长: 1 (2 字节)

指令周期： 3


EOR - Exclusive OR

EOR - 异或

说明：

在寄存器Rd和Rr内容之间实现逻辑异或（EOR），并将结果置于目标寄存器Rd中。

操作：

Rd <- Rd [+] Rr

语法：           操作数：                            程序计数器：

EOR Rd,Rr      0 ≤ d ≤ 31, 0 ≤ r ≤ 31           PC <- PC + 1

操作码：

0010

01rd

dddd

rrrr

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V, 表明运算结果的正负。

V:0

为0

N:R7

如果结果的最高有效位是1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置位；否则清0。

运算结束后结果保存在目标寄存器Rd中。

例如：

eor r4,r4 ; r4清0

eor r0,r22 ; r0与r22之间逐位异或

字长: 1 (2 字节)

指令周期： 1


FMUL - 无符号小数相乘

FMUL - 无符号定点小数乘法

说明：

该指令完成寄存器Rd（8位无符号数）和寄存器Rr（8位无符号数）的内容相乘操作，结果为16位的带符号数，并将结果左移一位后保存在R1:R0中。R1为高8位，R0为低8位。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | -> | 积的高字节 | 积的低字节
8 |  | 8 |  | 16

(N.Q)表示一个小数点左边有N个二进制数位、右边有Q个二进制数位的小数。以(N1.Q1)和(N2.Q2)为格式的两个小数相乘，产生格式为((N1+N2).(Q1+Q2))的结果。对于要有效保留小数位的处理应用，输入的数据通常采用(1.7)的格式，产生的结果为(2.14)的格式。因此将结果左移一位，以使高字节的格式与输入的一致。FMUL指令的执行周期与MUL指令相同，但比MUL增加了左移操作。

(1.7)格式最常用于带符号的数字，然而FMUL执行的是无符号的乘法。因此，当执行带有16位输入(1.15)格式的有符号的乘法运算时，此指令最常用于计算部分结果之一，产生一个(1.31)格式的结果。注意：FMUL操作的结果如果被当作(1.15)格式中的数值，可能会引起补码溢出。乘法的最高有效位在左移前必须要考虑，并实行进位。请参看下述实例。

被乘数Rd和乘数Rr是两个包含无符号定点小数的寄存器，小数点定位在第7位和第6位之间。结果为16位无符号定点小数，置于R1（高位）和R0（低位）之间，其小数点固定在第14位和第15位之间。

此指令并不对所有的芯片有效。请参照芯片特殊指令设置概要。

操作：

R1:R0 ← Rd × Rr(unsigned (1.15) ← unsigned (1.7) × unsigned (1.7))

语法：            操作数：                       程序计数器：

FMUL Rd,Rr      16 ≤ d ≤ 23, 16≤ r ≤ 23      PC ← PC + 1

操作码：

0000

0011

0ddd

1rrr

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <> | <>

C: R16

如果结果的第15位在左移前为1则为1；否则为0

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$0000则置位；否则为0

操作后R (结果)等于R1,R0

例如：

;******************************************************************************

;* 说明

;* 两个16位的带符号小数相乘，得到32位结果。

;* 应用

;*r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1

;******************************************************************************

fmuls16x16_32:

clr r2

fmuls r23, r21 ;((signed)ah * (signed)bh) << 1

movw r19:r18, r1:r0

fmul r22, r20 ;(al * bl) << 1

adc r18, r2

movw r17:r16, r1:r0

fmulsu r23, r20 ;((signed)ah * bl) << 1

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

fmulsu r21, r22 ;((signed)bh * al) << 1

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

字长: 1 (2 字节)

指令周期： 2


FMULS - 有符号小数相乘

FMULS - 有符号定点小数乘法

说明：

该指令完成寄存器Rd（8位带符号数）和寄存器Rr（8位带符号数）的内容相乘操作，结果为16位的带符号数，并将结果左移一位后保存在R1:R0中。R1为高8位，R0为低8位。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | -> | 积的高字节 | 积的低字节
8 |  | 8 |  | 16 |

(N.Q)表示一个小数点左边有N个二进制数位、右边有Q个二进制数位的小数。以(N1.Q1)和(N2.Q2)为格式的两个小数相乘，产生格式为((N1+N2).(Q1+Q2))的结果。对于要有效保留小数位的处理应用，输入的数据通常采用(1.7)的格式，产生的结果为(2.14)的格式。因此将结果左移一位，以使高字节的格式与输入的一致。FMUL指令的执行周期与MUL指令相同，但比MUL增加了左移操作。

被乘数Rd和乘数Rr是两个包含有符号定点小数的寄存器，小数点定位在第6位和第7位之间。结果为16位有符号定点小数，置于R1（高位）和R0（低位）之间，其小数点固定在第14位和第15位之间。

注意当0x80 (-1)与0x80 (-1)相乘时，移位运算的结果是0x8000 (-1)。因此移位运算使二者补码溢出。必须使用软件检查并解决这个问题。

此指令并不对所有的芯片有效。请参照芯片特殊指令设置概要。

操作：

(i)R1:R0 ← Rd × Rr(signed (1.15) <- signed (1.7) × signed (1.7))

语法：             操作数：                     程序计数器：

FMULS Rd,Rr         16 ≤ d ≤ 23, 16≤ r ≤ 23       PC <- PC + 1

操作码：

0000

0011

1ddd

0rrr

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <=> | <=>

C: R16

如果结果的第15位在左移前为1则为1；否则为0

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$0000则置位；否则为0

操作后R (结果)等于R1,R0

例如：

fmuls r23,r22 ; 将（1.7）格式的带符号数r23和r22相乘，结果为（1.15）格式

movw r23:r22,r1:r0 ; 将结果复制到r23:r22

字长： 1 (2 字节)

指令周期： 2


FMULSU - 无符号与有符号小数相乘

FMULSU - 无符号定点小数与有符号定点小数相乘

说明：

该指令完成寄存器Rd（8位带符号数）和寄存器Rr（8位无符号数）的内容相乘操作，结果为16位的带符号数，并将结果左移一位后保存在R1:R0中。R1为高8位，R0为低8位。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | -> | 积的高位 | 积的低位
8 |  | 8 |  | 16 |

(N.Q)表示一个小数点左边有N个二进制数位、右边有Q个二进制数位的小数。以(N1.Q1)和(N2.Q2)为格式的两个小数相乘，产生格式为((N1+N2).(Q1+Q2))的结果。对于要有效保留小数位的处理应用，输入的数据通常采用(1.7)的格式，产生的结果为(2.14)的格式。因此将结果左移一位，以使高字节的格式与输入的一致。FMUL指令的执行周期与MUL指令相同，但比MUL增加了左移操作。

(1.7)格式最常用于带符号的数字，然而FMUL执行的是一个无符号定点小数和一个有符号定点小数的乘法。因此，当执行带有16位输入(1.15)格式的有符号的乘法运算时，此指令最常用于计算部分结果的两个部分，产生一个(1.31)格式的结果。注意：FMUL操作的结果如果被当作(1.15)格式中的数值，可能会引起补码溢出。乘法的最高有效位在左移前必须要考虑，并实行进位。请参看下述实例。

被乘数Rd和乘数Rr是两个包含定点小数的寄存器，小数点定位在第7位和第6位之间。被乘数Rd是一个带符号的定点小数，乘数Rr是一个无符号的定点小数。结果为16位无符号定点小数，置于R1（高位）和R0（低位）之间，其小数点固定在第14位和第15位之间。

此指令并不对所有的芯片有效。请参照芯片特殊指令设置概要。

操作：

R1:R0 <- Rd × Rr(signed (1.15) ← signed (1.7) × unsigned (1.7))

语法：               操作数：                           程序计数器：

FMULSU Rd,Rr          16 ≤ d ≤ 23, 16≤ r ≤ 23             PC <- PC + 1

机器码：

0000

0011

1ddd

1rrr

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <=> | <=>

C: R16

如果结果的第15位在左移前为1则为1；否则为0

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$0000则置位；否则为0

操作后R (结果)等于R1,R0

例如：

;******************************************************************************

;* 说明

;* 两个16位的带符号小数相乘，得到32位结果。

;* 应用

;*r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1

;******************************************************************************

fmuls16x16_32:

clr r2

fmuls r23, r21 ;((signed)ah * (signed)bh) << 1

movw r19:r18, r1:r0

fmul r22, r20 ;(al * bl) << 1

adc r18, r2

movw r17:r16, r1:r0

fmulsu r23, r20 ;((signed)ah * bl) << 1

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

fmulsu r21, r22 　　　　　　　　　 ;((signed)bh * al) << 1

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

字长： 1 (2 字节)

指令周期： 2


ICALL - 间接子程序调用

说明：

间接调用由Z寄存器（16位指针寄存器）指向的子程序。地址指针寄存器为16位，允许调用在当前程序存储空间64K字（128K字节）内的子程序。调用ICALL后堆栈指针减小。

这条指令不是对所有的芯片有效。请具体参考各芯片指令总汇。

操作：

(i) PC(15:0) <- Z(15:0) 具有16位PC，最大128K 字节程序寄存器的芯片。

(ii) PC(15:0) <- Z(15:0)具有22位PC，最大8M字节程序寄存器的芯片。

PC(21:16) <- 0

语法：              操作数：             程序计数器：                 堆栈:

(i) ICALL            无                 要看具体的操作                    STACK <- PC + 1

                                                                            SP <- SP - 2 (2 字节, 16 位)

(ii)ICALL            无                 要看具体的操作                    STACK <- PC + 1

                                                                            SP <- SP - 3 (3 字节, 22 位)

操作码：

1001

0101

0000

1001

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

mov r30,r0 ; 设置所要调用的子程序的偏移地址

icall ; 调用r31:r30指向的子程序

字长: 1 (2 字节)

指令周期： 3个周期（PC指针为16位）

4个周期（PC指针为22位）


IJMP - 间接跳转

说明：

间接跳转到Z指针寄存器指向的16位地址。Z指针寄存器是16位宽，允许在当前程序存储器空间64K字（128K字节）内跳转。

这条指令不是对所有的芯片有效。请具体参考各芯片指令总汇。

操作：

(i) PC <- Z(15:0) 具有16位PC，最大128K 字节程序寄存器的芯片。

(ii) PC(15:0) <- Z(15:0) 具有22位PC，最大8M字节程序寄存器的芯片。

PC(21:16) <- 0

语法：              操作数：        程序计数器：          堆栈:

(i), (ii) IJMP        无           要看具体的操作            无影响

操作码：

1001

0100

0000

1001

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

mov r30,r0 ; 设置跳转的偏移量

ijmp ; 跳转到r31:r30指定的分支

字长: 1 (2 字节)

指令周期： 2


IN - Load an I/O Location to Register

IN - 从I/O口读数

说明：

将I/O空间（IO端口，计数器，配置寄存器等）的数据传送到寄存器区中的Rd寄存器中。

操作：

(i)Rd <- I/O(A)

语法：        操作数：                          程序计数器：

IN Rd,A        0 ≤ d ≤ 31, 0 ≤ A ≤ 63             PC <- PC + 1

操作码：

1011

0AAd

dddd

AAAA

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

in r25,$16 ; 读取端口B的值

cpi r25,4 ; 将读进来的值和常数4比较

breqexit ; 如果r25=4则跳转

...

exit: nop ; 分支标号

字数: 1 (2 字节)

指令周期： 1


INC - Increment

INC - 加1

说明：

寄存器Rd的内容加1，结果送目的寄存器Rd中。

该操作不改变SREG中的C标志，所以INC指令允许在多倍字长计算中用作循环计数。

当对无符号数操作时，仅有BREQ（相等跳转）和BRNE（不相等跳转）指令有效。当对2进制补码值进行操作时，所有的带符号跳转指令都有效。

操作：

(i) Rd <- Rd + 1

语法：                 操作数：                  程序计数器：

(i) INC Rd              0 ≤ d ≤ 31                 PC <- PC + 1

操作码：

1001

010d

dddd

0011

状态寄存器 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | <> | <> | <> | -

S:N [+] V

表明运算结果的正负。

V:R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果的2进制补码溢出则置1；否则为0 。本指令中当且仅当运算前Rd中的数值是$7F时有补码溢出。

N:R7

如果结果的最高有效位是1则置1；否则清0

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果是$00就置1；否则为0

运算结束后结果保存在目标寄存器Rd中。

例如：

clr r22 ; 将r22寄存器清0

loop: inc r22 ; 使r22寄存器的值加1

...

cpi r22,$4F ; 把寄存器r22的值和立即数$4f比较

brne loop ; 不相等跳转

nop ; 空操作

字数: 1 (2 字节)

指令周期： 1


JMP - Jump

JMP - 直接跳转

说明:

直接跳转到指定的地址（可达整个的4M字的程序存储器）处。与RJMP有所不同。

这条指令不一定支持所有的芯片，具体请参考相应芯片的特殊指令集。

操作:

(i)PC <- k

语法:             操作数:               程序计数器:            堆栈:

(i)JMP k         0 ≤ k < 4M              PC <- k              不改变

32位的操作码：

1001 | 010k | kkkk | 110k
kkkk | kkkk | kkkk | kkkk

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如:

mov r1,r0 ; r0的值复制到r1

jmp farplc ; 无条件转移

...

farplc:nop ; 跳转的目的地

字长: 2 (4 字节)

指令周期: 3


LD - Load Indirect from data space to Register using Index X

LD - 使用X指针寄存器间接从SRAM中取数

说明:

从X寄存器指定的数据空间中装入一个字节的数据到寄存器。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

X寄存器指定要读入的数据在SRAM中的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPX 的校准。

在操作中X寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到X寄存器的高字节，这时X寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPX积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。具体要参考器件的特殊指令集。

象下面的这种使用组合就没有定义：

LD r26, X+

LD r27, X+

LD r26, -X

LD r27, -X

使用X寄存器:

说明：                                                         注释:

(i)Rd <- (X)                                                       X: 不变

(ii)Rd <- (X)             X <- X + 1                               X: 执行后加1

(iii)X <- X - 1           Rd <- (X)                                X: 执行前减1

语法：                   操作数：                                程序计数器：

(i) LD Rd, X              0 ≤ d ≤ 31                               PC <- PC + 1

(ii)LD Rd, X+             0 ≤ d ≤ 31                               PC <- PC + 1

(iii)LD Rd, -X            0 ≤ d ≤ 31                               PC <- PC + 1

16位的操作码：

(i) | 1001 | 000d | dddd | 1100
(ii) | 1001 | 000d | dddd | 1101
(iii) | 1001 | 000d | dddd | 1110

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r27 ; 清除X寄存器高字节

ldi r26,$60 ; 将X寄存器低字节设置成$60

ld r0,X+ ; 将数据区中位于$60地址的数据装载到寄存器r0中（X值加1）

ld r1,X ; 将数据区中位于$60地址的数据装载到寄存器r1中

ldi r26,$63 ; 将X寄存器低字节设置成$63

ld r2,X ; 将数据区中位于$63地址的数据装载到寄存器r2中

ld r3,-X ; 将数据区中位于$62地址的数据装载到寄存器r3中（X 事先减1）

字长： 1 (2 字节)

指令周期： 2


LD (LDD) - Load Indirect from data space to Register using Index Y

LD (LDD) - 使用Y指针寄存器间接从SRAM中取数

说明:

使用带偏移或不带偏移的间接方式，从数据空间指定的地方装入一个字节的数据到寄存器。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

Y寄存器指定要读入的数据在SRAM中的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPY 的校准。

在操作中X寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到X寄存器的高字节，这时X寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPX积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。具体要参考器件的特殊指令集。

象下面的这种使用组合就没有定义：

LD r28, Y+

LD r29, Y+

LD r28, -Y

LD r29, -Y

使用Y指针寄存器:

说明：                                                  注释:

(i) Rd <- (Y)                                               Y: 不变

(ii) Rd <- (Y)             Y <- Y + 1                       Y: 执行后加1

(iii) Y <- Y - 1           Rd <- (Y)                        Y: 执行前减1

(iiii) Rd <- (Y+q)                                          Y: 不变, q: 偏移量

语法：                    操作数：                        程序计数器：

(i) LD Rd, Y               0 ≤ d ≤ 31                       PC <- PC + 1

(ii) LD Rd, Y+             0 ≤ d ≤ 31                       PC <- PC + 1

(iii) LD Rd, -Y            0 ≤ d ≤ 31                       PC <- PC + 1

(iiii)LDD Rd, Y+q          0 ≤ d ≤ 31, 0 ≤ q ≤ 63           PC <- PC + 1

16位的操作码：

(i) | 1000 | 000d | dddd | 1000
(ii) | 1001 | 000d | dddd | 1001
(iii) | 1001 | 000d | dddd | 1010
(iiii) | 10q0 | qq0d | dddd | 1qqq

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r29 ; 清除Y寄存器高字节

ldi r28,$60 ; 将Y寄存器低字节设置成$60

ld r0,Y+ ; 将数据区中位于$地址的数据装载到寄存器r0中（Y值加1）

ld r1,Y ; 将数据区中位于$60地址的数据装载到寄存器r1中

ldi r28,$63 ;设置Y寄存器低字节为$63

ld r2,Y ; 将数据区中位于$63地址的数据装载到寄存器r2中

ld r3,-Y ; 将数据区中位于$62地址的数据装载到寄存器r3中(Y pre dec)

ldd r4,Y+2 ; 将数据存储器中位于$64处的数据装入r4寄存器

字长： 1 (2 字节)

指令周期： 2


LD (LDD) - Load Indirect From data space to Register using Index Z

LD (LDD) - 使用Z指针寄存器间接从SRAM中取数

说明:

使用带偏移或不带偏移的间接方式，从数据空间指定的地方装入一个字节的数据到寄存器。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

Z寄存器指定要读入的数据在SRAM中的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPZ的校准。

在操作中X寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。然而，Z寄存器可以被用作间接子程序调用，间接跳转和查表，所以最好还是使用X或Y指针寄存器作为一个专门的堆栈指针。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到X寄存器的高字节，这时X寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPX积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。具体要参考器件的特殊指令集。

对于如何使用Z指针在程序存储器中进行查表，请参考LPM 和 ELPM 指令。

象下面的这种使用组合就没有定义：

LD r30, Z+

LD r31, Z+

LD r30, -Z

LD r31, -Z

使用Z指针寄存器：

说明：                                              注释:

(i)Rd <- (Z)                                            Z: 不变

(ii)Rd <- (Z)                                           Z <- Z + 1Z: 执行后加1

(iii)Z <- Z -1 Rd <- (Z)                                Z: 执行前减1

(iiii) Rd <- (Z+q)                                      Z: 不变, q: 偏移量

语法：                     操作数：                   程序计数器：

(i) LD Rd, Z                0 ≤ d ≤ 31                  PC <- PC + 1

(ii) LD Rd, Z+              0 ≤ d ≤ 31                  PC <- PC + 1

(iii) LD Rd, -Z             0 ≤ d ≤ 31                  PC <- PC + 1

(iiii)LDD Rd, Z+q           0 ≤ d ≤ 31, 0 ≤ q ≤ 63      PC <- PC + 1

16位的操作码：

(i) | 1000 | 000d | dddd | 0000
(ii) | 1001 | 000d | dddd | 0001
(iii) | 1001 | 000d | dddd | 0010
(iiii) | 10q0 | qq0d | dddd | 0qqq

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r31 ; 清除Z寄存器高字节

ldi r30,$60 ; 设置Z的低字节为$60

ld r0,Z+ ; 将数据区中位于$地址的数据装载到寄存器r0中(Z值加1)

ld r1,Z ; 将数据区中位于$60地址的数据装载到寄存器r1中

ldi r30,$63 ; 设置Z的低字节为$63

ld r2,Z ; 将数据区中位于$63地址的数据装载到寄存器r2中

ld r3,-Z ; 将数据区中位于$62地址的数据装载到寄存器r3中(Z pre dec)

ldd r4,Z+2 ; 从数据区中位于$64处装入数据到4

字长： 1 (2 字节)

指令周期： 2


LDI - Load Immediate

LDI - 立即数送寄存器

说明:

装入一个8位的立即数到寄存器16～31。

操作:

(i)Rd <- K

语法:            操作数:                            程序计数器:

(i) LDI Rd,K       16 ≤ d ≤ 31, 0 ≤ K ≤ 255             PC <- PC + 1

16位的操作码:

1110

KKKK

dddd

KKKK

状态寄存器和布尔表达式：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例子:

clr r31 ; 清除Z寄存器高位

ldi r30, $F0 ; 设置Z寄存器低字节为$F0

lpm ; 从程序存储区中Z寄存器指定的

; 位置装入立即数

字长: 1 (2 字节)

周期数: 1


LDS - Load Direct from data space

LDS - SRAM直接取数

说明:

从数据区中指定的位置装入一个字节的数据到寄存器。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

支持16位的地址。内存访问被限定在当前数据段小于64K字节的空间。LDS指令和RAMPD 一起使用可以访问大于64K字节的空间。要访问另一个数据段的大于64K字节的空间，RAMPD在I/O区的校准就要改变。

不是所有的芯片都支持这条指令，具体请参考相应芯片的特殊指令集。

操作：

(i)Rd <- (k)

语法：               操作数：                            程序计数器：

(i)LDS Rd,k           0 ≤ d ≤ 31, 0 ≤ k ≤ 65535            PC <- PC + 2

32位的操作码：

1001 | 000d | dddd | 0000
kkkk | kkkk | kkkk | kkkk

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

lds r2,$FF00 ; 数据区中位于 $FF00的数据装入r2

add r2,r1 ; 将r1的值累加到r2

sts $FF00,r2 ; 写回

字长： 2 (4 字节)

指令周期： 2


LPM - Load Program Memory

LPM - 读程序存储器指令

说明:

从Z寄存器指定的程序空间中装入一个字节的数据到目的寄存器Rd。这个指令可以获得100%数据空间中的有效常量初值，或常量数据。程序存储器是按16位的字来组织的，而Z指针指向字节地址，所以Z指针的最低有效位要么选定程序区的低字节（ZLSB=0）要么选定高字节（ZLSB=1）.这条指令可以寻址程序存储器的前64K字节（32K字）空间。在操作中，Z指针寄存器可以不变、带预减量、或者带后增量。但是，增量不应用于RAMPZ寄存器。

有自编程能力的芯片支持LPM指令读熔丝位和锁定位。具体描述请参考芯片的使用文档。

不是所有芯片都支持这条指令的各种变形。具体要参考器件的特殊指令集。LPM指令在AT90S1200 系列单片上完全不能执行。

象下面的这种使用组合就没有定义：

LPM r30, Z+

LPM r31, Z+

说明：                                               注释:

(i) R0 <- (Z)                                            Z: 不变, R0 暗指目的寄存器

(ii) Rd <- (Z)                                           Z: 不变

(iii) Rd <- (Z)                                          Z <- Z + 1Z: 执行后加1

语法：                     操作数：                    程序计数器：

(i) LPM                     无, 暗指R0                     PC <- PC + 1

(ii)LPM Rd, Z               0 ≤ d ≤ 31                   PC <- PC + 1

(iii)LPM Rd, Z+             0 ≤ d ≤ 31                   PC <- PC + 1

16位的操作码：

(i) | 1001 | 0101 | 1100 | 1000
(ii) | 1001 | 000d | dddd | 0100
(iii) | 1001 | 000d | dddd | 0101

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

ldi ZH, high(Table_1<<1) ; 初始化Z指针

ldi ZL, low(Table_1<<1)

lpm r16, Z ; 从程序存储器中装入Z指针（r31：r30）指向的常量

...

Table_1:

.dw 0x5876 ; ZLSB = 0时，将访问到0x76

; ZLSB = 1时，将访问到0x58

...

字长： 1 (2 字节)

指令周期： 3


LSL - Logical Shift Left

LSL - 逻辑左移

说明:

寄存器Rd中所有位左移1位，第0位被清0，第7位移到SREG中的C标志。这项操作有效的实现了有符号/无符号数的乘2操作。

操作：

C

<-

b7 - - - - - - - - - - - - - - - - - - b0

<-

0

语法：           操作数：                 程序计数器：

(i) LSL Rd        0 ≤ d ≤ 31                PC <- PC + 1

16位的操作码： (参考 ADD Rd,Rd)

0000

11dd

dddd

dddd

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3

S: N [+] V, 检验符号的正负

V: N [+] C (是指移位以后的N和C)

N: R7

如果结果的最高有效位为1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

C: Rd7

移位前目的寄存器的最高有效位为1则置1；否则清0。 移位前目的寄存器的最高有效位为1则置1；否则清0。

结果保存在目的寄存器Rd中。

例如：

add r0, r4 ; r4 加 r0

lsl r0 ; r0 乘 2

字长： 1 (2 字节)

指令周期： 1


LSR - Logical Shift Right

LSR - 逻辑右移

说明:

寄存器Rd中所有位右移1位，第7位被清0，第0位移到SREG中的C标志。这个运算实现了无符号数更有效率的除2操作。C标志用于结果的舍入。

操作：

0

->

b7 - - - - - - - - - - - - - - - - - - b0

->

C

语法：           操作数：            程序计数器：

(i) LSR Rd        0 ≤ d ≤ 31           PC <- PC + 1

16位的操作码：

1001

010d

dddd

0110

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | <> | <> | 0 | <> | <>

S: N [+] V, 检验符号的正负

V: N [+] C (是指移位以后的N和C)

N: 0

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

C: Rd0

移位前目的寄存器的最高有效位为1则置1；否则清0。

结果保存在目的寄存器Rd中。

例如：

add r0,r4 ; r4 加 r0

lsr r0 ; r0 乘 2

字长： 1 (2 字节)

指令周期： 1


MOV - Copy Register

MOV - 寄存器间数据传送指令

说明:

这个指令将一个寄存器中的数据传送至另一个寄存器中，源寄存器中的数据不变，目的寄存器中则复制了源寄存器中的数据。

操作：

(i) Rd <- Rr

语法：                操作数：                          程序计数器：

(i) MOV Rd,Rr          0 ≤ d ≤ 31, 0 ≤ r ≤ 31             PC <- PC + 1

16位的操作码：

0010

11rd

dddd

rrrr

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

mov r16,r0 ; 将r0内容复制到r16

call check ; 调用子程序

...

check: cpi r16,$11 ; 将r16和$11比较

...

ret ; 子程序返回

字长： 1 (2 字节)

指令周期： 1


MOVW - Copy Register Word

MOVW - 寄存器对之间字数据传送指令

说明:

这个指令将一个寄存器对中的字数据传送到另一个寄存器对中，源寄存器对中的数据不变，目的寄存器对中则装入了源寄存器对的内容。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i) Rd+1:Rd <- Rr+1:Rr

语法：                        操作数：                                  程序计数器：

(i) MOVW Rd+1:Rd,Rr+1Rr        d E {0,2,...,30}, r E {0,2,...,30}         PC <- PC + 1

16位的操作码：

0000

0001

dddd

rrrr

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

movw r17:16,r1:r0 ; 复制 r1:r0 到 r17:r16

call check ; 调用子程序

...

check: cpi r16,$11 ; 将寄存r16的值和$11相比较

...

cpi r17,$32 ; 将寄存r17的值和$32相比较

...

ret ; 子程序返回

字长： 1 (2 字节)

指令周期： 1


MUL - Multiply Unsigned

MUL - 无符号数相乘

说明:

这条指令完成了8位X8位－>16位的无符号数乘法。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | -> | 积的高字节 | 积的低字节
8 |  | 8 |  | 16 |

寄存器Rd中的被乘数和寄存器Rr中的乘数是两个无符号数。16位的积被放在R1（高字节）和R0（低字节）中。注意，如果选定R0或R1中的数据作为被乘数或乘数，运算后的结果将会覆盖掉他们。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i) R1:R0 <- Rd XRr(无符号数<-无符号数X无符号数)

语法：          操作数：                        程序计数器：

(i) MUL Rd,Rr    0 ≤ d ≤ 31, 0 ≤ r ≤ 31           PC ← PC + 1

16位的操作码：

1001

11rd

dddd

rrrr

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <> | <>

C: R15

如果结果的第15位为1则置1；否则清0

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果是$0000则置位；否则清0

运算完成后结果放在R1:R0中。

例如：

mul r5,r4                 ; r5和r4中的无符号数相乘

movw r4,r0                ; 将结果复制到寄存器对r5:r4中

字长： 1 (2 字节)

指令周期： 2


MULS - Multiply Signed

MULS - 有符号数相乘

说明:

这个指令实现了8位X8位－>16位的有符号数乘法。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | → | 积的高字节 | 积的低字节
8 |  | 8 |  | 16 |

寄存器Rd中的被乘数和寄存器Rr中的乘数是两个有符号数。16位的积被放在R1（高字节）和R0（低字节）中。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i)R1:R0 ← RdXRr(有符号数← 有符号数X有符号数)

语法：             操作数：                      程序计数器：

(i)MULS Rd,Rr       16 ≤ d ≤ 31, 16 ≤ r ≤ 31       PC ← PC + 1

16位的操作码：

0000

0010

dddd

rrrr

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <=> | <=>

C: R15

如果结果的第15位为1则置1；否则清零

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$0000则置1;否则清0

运算的结果放在R1：R0寄存器对中。

例如：

muls r21,r20         ; r21 和 r20中的有符号数相乘

movw r20,r0          ; 将结果复制到r21:r20寄存器对中

字长： 1 (2 字节)

指令周期： 2


MULSU - Multiply Signed with Unsigned

MULSU - 有符号数和无符号数相乘

说明:

这条指令实现了8位X8位－>16位的有符号数和无符号数相乘。

Rd |  | Rr |  | R1 | R0
被乘数 | X | 乘数 | → | 积的高字节 | 积的低字节
8 |  | 8 |  | 16 |

寄存器Rd中的被乘数是有符号数，寄存器Rr中的乘数是无符号数。16位的结果保存在R1（高字节）和R0（低字节）中。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i) R1:R0 ← Rd X Rr(有符号数← 有符号数 X 无符号数)

语法：            操作数：                        程序计数器：

(i) MULSU Rd,R     r16 ≤ d ≤ 23, 16 ≤ r ≤ 23        PC ← PC + 1

16位的操作码：

0000

0011

0ddd

0rrr

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | <=> | <=>

C: R15

如果结果的第15位为1则置1；否则清0

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$0000则置1;否则清0

运算的结果放在R1：R0寄存器对中

例如：

;******************************************************************************

;* 说明：

;*两个16位的有符号数相乘得到32位的结果

;* 用法：

;*r19:r18:r17:r16 = r23:r22 * r21:r20

;******************************************************************************

muls16x16_32:

clr r2

muls r23, r21                 ; (有符号)ah * (有符号)bh

movw r19:r18, r1:r0

mul r22, r20; al * bl

movw r17:r16, r1:r0

mulsu r23, r20                ; (有符号)ah * bl

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

mulsu r21, r22                ; (有符号)bh * al

sbc r19, r2

add r17, r0

adc r18, r1

adc r19, r2

ret

字长： 1 (2 字节)

指令周期： 2


NEG - Two's Complement

NEG - 取二进制补码

说明:

将寄存器Rd中的内容用它的二进制补码取代；$80值不变。

操作：

(i)Rd ← $00 - Rd

语法：         操作数：                          程序计数器：

(i) NEG Rd      0 ≤ d ≤ 31                         PC ← PC + 1

16位的操作码：

1001

010d

dddd

0001

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H:R3 + Rd3

如果低四位向高四位有借位/进位/进位/进位/进位/进位/进位则值1；否则清0

S:N [+] V

检验符号的正负

V:R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果有二进制补码的溢出则置位；否则清0。当且仅当运算后的结果是$80时会产生二进制补码的溢出。

N:R7

移位前目的寄存器的最高有效位为1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果是$00则置位；否则清0

C:R7 + R6 + R5 + R4 + R3 + R2 + R1 + R0

如果有借位则置1；否则清0。当且仅当运算后的结果是$00时会产生借位。

运算后的结果放到Rd中。

例如：

sub r11,r0    ; R11中的数据减去r0中的数据

brpl positive ; 如果结果为正则跳转

neg r11       ; 将r11中的数据取补码

positive:  nop      ; 分支目的地

字长： 1 (2 字节)

指令周期： 1


NOP - 空操作

说明：

这条指令就是在一个周期内不作任何操作。

操作：

语法：         操作数：               程序计数器：

(i) NOP         无                   PC ← PC + 1

操作码：

0000

0000

0000

0000

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r16                 ; 将r16寄存器清0

ser r17                 ; 置位r17寄存器（使r17寄存器的所有位为1）

out $18,r16             ; 向B口（Port B）输出0，即低电平

nop                     ; 等待一个时钟周期 (什么也不做)

out $18,r17             ; 向B口（Port B）输出1，即高电平

字数: 1 (2 字节)

指令周期： 1


OR - Logical OR

OR - 逻辑或

说明：

完成寄存器Rd和寄存器Rr内容的逻辑或操作，结果放在目的寄存器Rd中。

操作：

(i)Rd ← Rd v Rr

语法：操作数：Program 程序计数器：

(i)OR Rd,Rr0 ≤ d ≤ 31, 0 ≤ r ≤ 31PC ← PC + 1

操作码：

0010

10rd

dddd

rrrr

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V,表明运算结果的正负

V:0

为0

N:R7

如果结果的最高有效位是1则置1；否则清0

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果是$00就置1；否则为0

运算结束后结果保存在目标寄存器Rd中。

例如：

or r15,r16    ; 对两个寄存器中的数据逐位取或

bst r15,6     ; 将第6位的值保存在T状态寄存器中

brts ok       ; 标志位T=1跳转

...

ok:   nop     ; 分支标号（什么也不做）

字数: 1 (2 字节)

指令周期： 1


ORI - 或立即数

说明：

完成寄存器Rd中的内容与常量之间的逻辑或运算，并将结果保存在Rd寄存器中。

操作：

(i)Rd ← Rd v K

语法：          操作数：                     程序计数器：

(i)ORI Rd,K      16 ≤ d ≤ 31, 0 ≤ K ≤ 255      PC ← PC + 1

操作码：

0110

KKKK

dddd

KKKK

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V, 表明运算结果的正负

V:0

为0

N:R7

如果结果的最高有效位是1则置1；否则清0

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果是$00就置1；否则为0

运算结束后结果保存在目标寄存器Rd中。

例如：

ori r16,$F0      ; 设置r16寄存器的高4位全为1

ori r17,1        ; 设置r17寄存器的第0位为1

字数: 1 (2 字节)

指令周期： 1


OUT - Store Register to I/O Location

OUT - 寄存器数据送I/O口

说明:

将寄存器Rr中的数据传送到I/O空间（口，定时器，配置寄存器等）。

操作：

(i)I/O(A) ← Rr

语法：         操作数：                      程序计数器：

(i) OUT A,Rr    0 ≤ r ≤ 31, 0 ≤ A ≤ 63         PC ← PC + 1

16位的操作码：

1011

1AAr

rrrr

AAAA

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r16         ; r16清0

ser r17         ; 置位r17

out $18,r16     ; 向B口输出0

nop             ; 等待

out $18,r17     ; 向B口输出1

字长： 1 (2 字节)

指令周期： 1


POP - Pop Register from Stack

POP - 出栈指令

说明:

这条指令将堆栈中的字节装入寄存器Rd中。 堆栈指针在POP之前首先减1。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i)Rd ← STACK

语法：          操作数：                    程序计数器：           堆栈：

(i) POP Rd       0 ≤ d ≤ 31                   PC ← PC + 1                SP ← SP + 1

16位的操作码：

1001

000d

dddd

1111

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

callroutine               ; 调用子程序

...

routine:   pushr14        ; 将R14中的数据保存到堆栈

push r13       ; 寄存器R13中的数据保存到堆栈

...

pop r13        ; 还原r13

pop r14        ; 还原r14

ret            ; 子程序返回

字长： 1 (2 字节)

指令周期： 2


PUSH - Push Register on Stack

PUSH - 进栈指令

说明:

该指令存储寄存器Rr中的数据到堆栈。堆栈的指针在PUSH后加1。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

操作：

(i) STACK ← Rr

语法：          操作数：            程序计数器：             堆栈：

(i) PUSH Rr      0 ≤ r ≤ 31           PC ← PC + 1                  SP ← SP - 1

16位的操作码：

1001

001d

dddd

1111

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

callroutine                ; 调用子程序

...

routine:   push r14   ; 保存r14中的数据到堆栈

push r13        ; 保存r13中的数据到堆栈

...

pop r13        ; 恢复r13

pop r14        ; 恢复r14

ret             ; 子程序返回

字长： 1 (2 字节)

指令周期： 2

"


RCALL - Relative Call to Subroutine

RCALL - 相对调用子程序

说明:

相对调用PC - 2K + 1 到 PC + 2K (字)范围内的子程序。返回地址（RCALL后面那条指令的地址）保存到堆栈当中。 (相关参考：CALL). 在汇编程序中，标号作为相对调用的操作数。对于程序存储器不超过4K字（8K字节）的AVR芯片，这条指令可以寻址整个程序存储器空间。在调用RCALL指令时，堆栈指针是带后减量的（调用完成后减少）。

操作：

(i)PC ← PC + k + 1 对于具有16位的PC, 最大128K字节程序存储器的芯片

(ii)PC ← PC + k + 1 对于具有22位的PC, 最大8M字节程序存储器的芯片

语法：        操作数：                  程序计数器：             堆栈：

(i) RCALL k    -2K ≤ k < 2K               PC ← PC + k + 1              STACK ← PC + 1

                                                                       SP ← SP - 2 (2 字节, 16 位)

(ii)RCALL k    -2K ≤ k < 2K               PC ← PC + k + 1              STACK ← PC + 1

                                                                       SP ← SP - 3 (3 字节, 22 位)

16位的操作码：

1101

kkkk

kkkk

kkkk

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

rcallroutine             ; 调用子程序

...

routine:    push r14     ; R14压栈

...

pop r14      ; 恢复R14

ret          ; 子程序返回

字长： 1 (2 字节)

指令周期： 3 （16-位 PC的芯片）

4 （22－位PC的芯片）


RET - Return from Subroutine

RET - 子程序返回

说明:

从子程序返回。 返回地址从堆栈中获得。 在执行RET时堆栈指针带有预增量（调用前堆栈指针增加）。

操作：

(i)PC(15:0) ← STACK 对于具有16位的PC, 最大128K字节程序存储器的芯片

(ii)PC(21:0) ← STACK 对于具有22位的PC, 最大8M字节程序存储器的芯片

语法：        操作数：                  程序计数器：             堆栈：

(i) RET        无                       依具体操作而定               SP←SP + 2, (2字节,16 位)

(ii) RET       无                       依具体操作而定               SP←SP + 3, (3字节,22 位)

16位的操作码：

1001

0101

0000

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

callroutine                     ; 调用子程序

...

routine:   push r14             ; r14入栈

...

pop r14             ; r14出栈

ret                 ; 子程序返回

字长： 1 (2 字节)

指令周期： 4 （16-位PC的芯片）

5 （22-位PC的芯片）


RETI - Return from Interrupt

RETI - 中断返回

说明:

从中断返回。返回地址从堆栈中获得。并且将全局中断标志置位。

注意，寄存器的状态不会在进入中断的时候自动保存，也不会在中断返回的时候恢复。这些工作都要由应用程序进行处理。在RETI指令中堆栈指针带有预增量。

操作：

(i)PC(15:0) ← STACK对于具有16位的PC, 最大128K字节程序存储器的芯片

(ii)PC(21:0) ← STACK对于具有22位的PC, 最大8M字节程序存储器的芯片

语法：        操作数：                   程序计数器：            堆栈：

(i) RETI       无                        依具体的操作而定              SP ← SP + 2 (2 字节, 16 位)

(ii) RETI      无                        依具体的操作而定            SP ← SP + 3 (3 字节, 22 位)

16位的操作码：

1001

0101

0001

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
1 | - | - | - | - | - | - | -

I: 1

置位全局中断允许标志I。

例如：

...

extint:    push     r0      ; R0入栈

...

pop     r0      ; R0出栈

reti            ; 中断返回并打开全局中断允许

字长： 1 (2 字节)

指令周期： 4 （16-位PC的芯片）

5 （22-位PC的芯片）


RJMP - Relative Jump

RJMP - 相对跳转

说明:

相对跳转到PC - 2K +1 ～ PC + 2K (字) 范围内的地址。在汇编程序中，标号被用作该指令的操作数。对于程序存储器空间不超过4K字（8K字节）的芯片，该指令可以寻址整个程序存储器空间的每一个地址。

操作：

(i)PC ← PC + k + 1

语法：        操作数：             程序计数器：            堆栈：

(i) RJMP k     -2K ≤ k < 2K          PC ← PC + k + 1             不变

16位的操作码：

1100

kkkk

kkkk

kkkk

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

cpir16,$42              ; 将R16和$42比较

brneerror               ; 如果r16 不等于 $42 则跳转

rjmp ok                 ; 无条件转移

error:addr16,r17              ; r17中的值累加到r16

incr16                  ; r16中的值加1

ok:   nop                     ; rjmp的目的地

字长： 1 (2 字节)

指令周期： 2


ROL - Rotate Left trough Carry

ROL - 带进位左循环

说明:

寄存器Rd中所有位左移1位，C标志被移到Rd的第0位，Rd的第7位移到C标志。这个指令与LSL结合，能有效的实现多字节的有符号/无符号数的乘2操作。

操作：

C

X

b7 ------------------b0

←

C

语法：         操作数：                     程序计数器：

(i)ROL Rd       0 ≤ d ≤ 31                    PC ← PC + 1

16位的操作码： (参考 ADC Rd,Rd)

0001

11dd

dddd

dddd

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H:Rd3

S: N [+] V, 检验符号的正负

V:N [+] C (是指移位以后的N和C)

N:R7

如果结果的最高有效位为1则置1；否则清0。

Z: R7 · R6 ·R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

C:Rd7

移位前目的寄存器的最高有效位为1则置1；否则清0。

结果保存在目的寄存器Rd中。

例如：

lsl r18            ; 将r19:r18乘以2

rol r19            ; r19:r18是一个有符号或无符号的2进制整数

brcsoneenc               ; 如果有进位则跳转

...

oneenc:nop               ; 分支目的地

字长： 1 (2 字节)

指令周期： 1


ROR - 带进位右循环

说明：

寄存器Rd的所有位右移一位，C标志被移到Rd的第7位，Rd的第0位被移到C标志位。在执行ASR时， 相当于实现有符号数的2进制补码除2的操作，不改变符号，C标志用于结果的舍入。在执行LSR时，相当于实现一个无符号数除2的操作，C标志被用于结果的舍入。在本循环方式中C标志参与了2进制数的右循环。

操作：

C

→

b7------------------b0

→

C

语法：            操作数：                         程序计数器：

(i) ROR Rd         0 ≤ d ≤ 31                        PC ← PC + 1

操作码：

1001

010d

dddd

0111

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | <> | <> | <> | <> | <>

S: N [+] V, 表明运算结果的正负。

V:N [+] C (移动以后的N和C)

N:R7

如果结果的最高有效位是1则置1；否则清0（即表明结果是否为负）

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

结果为0时置1；否则清0

C:Rd0

当运算有借位发生的时候为1；否则为0（如果减数加上原来的借位组成的数的绝对值比被减数的绝对值大，会发生借位）

运算结束后结果保存在目标寄存器Rd中。

例如：

lsr r19                     ; 将r19:r18中的数除2

ror r18                     ; r19:r18中时一个2字节的无符号整数

brcc zeroenc1               ; C=0跳转

asr r17                     ; 将r17:r16中的数除2

ror r16                     ; r17:r16中是一个2字节有符号整数

brcc zeroenc2               ; C=0跳转

...

zeroenc1:nop                ; 分支1

...

zeroenc2:nop                     ; 分支2

字数: 1 (2 字节)

指令周期： 1


SBC - 带进位的减法

说明：

两个寄存器带着标志位相减，结果放在目的寄存器Rd中。

操作：

(i) Rd ← Rd - Rr - C

语法：          操作数：                        程序计数器：

(i) SBC Rd,Rr    0 ≤ d ≤ 31, 0 ≤ r ≤ 31           PC ← PC + 1

操作码：

0000

10rd

dddd

rrrr

状态寄存器 标志位:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · Rr3 + Rr3 · R3 + R3 · Rd3

当低四位向高四位有借位/进位/进位/进位的时候置1；其他情况下为0

S: N [+] V,表明运算结果的正负

V:Rd7 · Rr7 · R7 + Rd7 · Rr7 · R7

如果结果的2进制补码溢出则置1；否则为0

N:R7

如果结果的最高有效位是1则置1；否则清0（即表明结果是否为负）

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 · Z

结果为0时置1；否则清0

C: Rd7 · Rr7+ Rr7 · R7 +R7 · Rd7

当运算有借位发生的时候为1；否则为0（如果减数加上原来的借位组成的数的绝对值比被减数的绝对值大，会发生借位）

运算结束后结果保存在目标寄存器Rd中。

例如：

                ; r3:r2中的数与r1:r0中的数相减

sub r2,r0       ; 低位字节相减

sbc r3,r1       ; 高位减

字数: 1 (2 字节)

指令周期： 1


SBR - Set Bits in Register

SBR - 将寄存器的位置1

描述;

将寄存器Rd指定位置1。将寄存器Rd的内容和常量掩码K取逻辑或ORI并讲结果保存到目的寄存器Rd中。

操作：

(i)Rd <- Rd v K

语法：                 操作:                           程序计数器:

(i)SBR Rd,K           16<=d<=31, 0<=K<=255             PC ← PC + 1

16位操作代码:

0110

KKKK

dddd

KKKK

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N ⊕ V, 符号位测试

V:0

清零

N:R7

结果得最高位为1则置位；否则清零

Z: 'R7 · 'R6 · 'R5 · 'R4 · 'R3 · 'R2 · 'R1 · 'R0

操作执行后 R (Result) ＝Rd

例子：

sbr   r16,3      ; 将 r16 0，1位置1

sbr   r17,$F0    ; 将 r17高4位置1

字长: 1 (2 字节)

周期数: 2


SBRC - Skip if Bit in Register is Cleared

SBRC - 如果寄存器某一位为0则跳行

描述：

这条指令测试寄存器的某一位，如果这一位被清除则跳过下一条指令

操作：

(i)If Rr(b) = 0 then PC ← PC + 2 (or 3) else PC ← PC + 1

语法：            操作:                           程序计数器:

(i)SBRC Rr,b   0 ≤ r ≤ 31, 0 ≤ b ≤ 7     PC ← PC + 1, 不满足条件，不执行跳过

                                            PC ← PC + 2, 跳过一条1个字长指令

                                            PC ← PC + 3, 跳过一条2个字长指令

16位操作代码:

1111

110r

rrrr

0bbb

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例子：

sub r0,r1            ;  r0－r1

sbrc r0,7            ; 如果 r0 第7位被清除则执行跳过

sub r0,r1            ; 只有在第7位不为0时才执行

nop                  ; 继续（不做任何操作）

字长: 1 (2 字节)

如果条件为假，周期数为1（不执行跳过）

如果条件为真，周期数为2 (执行跳过) ，跳过的指令为1个字长

如果条件为真，周期数为3(执行跳过) ，跳过的指令为2个字长


SBRS - Skip if Bit in Register is Set

SBRS - 如果寄存器某一位为1跳行

描述：

这条指令测试寄存器的某一位，如果这一位为1则跳过下一条指令

操作：

(i)If Rr(b) = 1 then PC ← PC + 2 (or 3) else PC ← PC + 1

语法：            操作:                           程序计数器:

(i)SBRS Rr,b   0 ≤ r ≤ 31, 0 ≤ b ≤ 7      PC ← PC + 1, 不满足条件，不执行跳过

                                             PC ← PC + 2, 跳过一条1个字长指令

                                             PC ← PC + 3, 跳过一条2个字长指令

16位操作代码:

1111

111r

rrrr

0bbb

状态寄存器和布尔方程式

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例子：

sub   r0,r1   ;  r0－r1

sbrs  r0,7    ; 如果r0 第7位为1，则置位

neg   r0      ; 只有在第7位不为1时才执行

nop           ; 继续（不做任何操作)

字长: 1 (2 字节)

如果条件为假，周期数为1（不执行跳过）

如果条件为真，周期数为2 (执行跳过) ，跳过的指令为1个字长

如果条件为真，周期数为3(执行跳过) ，跳过的指令为2个字长


SEC - Set Carry Flag

SEC - 将进位标志位（C）置1

描述：

将进位标志位（C）置1

操作：

(i)C ← 1

语法：            操作:                           程序计数器:

(i)SEC          无                         PC ← PC + 1

16位的操作码：

1001

0100

0000

1000

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | 1

C: 1

进位标志位（carry）置1

例子：

sec          ; 进位标志位置1

adc r0,r1    ; r0=r0+r1+1

字长: 1 (2 字节)

周期数: 2


SEH - Set Half Carry Flag

SEH - 将半进位标志位（H）置1

描述：

将半进位标志位（H）置1

操作：

(i)H ← 1

语法：            操作:                           程序计数器:

(i) SEH            无                   PC ← PC + 1

16位操作符代码：

1001

0100

0101

1000

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | 1 | - | - | - | - | -

H: 1

半进位标志位（H）置1

例子：

seh ; 将半进位标志位（H）置1

字长: 1 (2 字节)

周期数: 2


SBI - Set Bit in I/O Register

SBI - I/O寄存器中指定位置1

说明:

将指定的I/O 寄存器某一位置1。这条指令用于低32位的I/O寄存器－地址0-31。

操作:

(i)I/O(A,b) ← 1

语法：          操作:                   程序计数器:

(i)SBI A,b     0 ≤ A ≤ 31, 0 ≤ b ≤ 7   PC ← PC + 1

16位操作码:

1001

1010

AAAA

Abbb

状态寄存器 (SREG) 标志位 ：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

out  $1E,r0   ; 写 EEPROM 地址

sbi  $1C,0    ; 将 EECR第0位（读位）置位

in   r1,$1D   ; 读EEPROM 数据

字长: 1 (2 字节)

周期数: 2


SBCI - 带进位的字减立即数

说明：

寄存器和立即数带着标志位相减，结果放在目的寄存器Rd中。

操作：

(i)Rd ← Rd - K - C

语法：         操作数：                      程序计数器：

(i) SBCI Rd,K   16 ≤ d ≤ 31, 0 ≤ K ≤ 255       PC ← PC + 1

机器码：

0100

KKKK

dddd

KKKK

状态寄存器 标志位:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · K3 + K3 · R3 + R3 · Rd3

当低四位向高四位有借位的时候置1；其他情况下为0

S: N [+] V,表明运算结果的正负。

V:Rd7 · K7 · R7 + Rd7 · K7 · R7

如果结果的2进制补码溢出则置1；否则为0

N:R7

如果结果的最高有效位是1则置1；否则清0（即表明结果是否为负）

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0 · Z

结果为0时置1；否则清0

C: Rd7 · K7+ K7 · R7 +R7 · Rd7

当运算有借位发生的时候为1；否则为0（如果减数加上原来的借位组成的数的绝对值比Rd的绝对值大，会发生借位）

运算结束后结果保存在目标寄存器Rd中。

例如：

; r17:r16中的数与立即数$4F23相减

subi   r16,$23   ; 低位减

sbci  r17,$4F    ; 高位减

字数: 1 (2 字节)

指令周期： 1


SBIC - Skip if Bit in I/O Register is Cleared

<

SBIC -I/O寄存器中指定位为0则跳行

说明:

这条指令测试I/O寄存器的一个特殊位 ，如果这个位被清除，则跳一行执行指令。该指令只在低32位的IO寄存器内操作，对应的IO空间地址为0～31。

操作：

(i)If I/O(A,b) = 0 then PC ← PC + 2 (or 3) else PC ← PC + 1

语法：            操作:                           程序计数器:

(i)SBIC A,b     0 ≤ A ≤ 31, 0 ≤ b ≤ 7        PC ← PC + 1, 不满足条件，不跳行

                                                PC ← PC + 2, 跳过一条1个字长指令

                                                PC ← PC + 3, 跳过一条2个字长指令

16位操作代码:

1001

1001

AAAA

Abbb

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例子：

e2wait:   sbic $1C,1              ; 如果EEWE 被清除，则跳过下一条指令

rjmp e2wait             ; 写EEPROM 没有完成

nop; 继续（不做任何操作）

字长: 1 (2 字节)

如果条件为假，周期数为1（不执行跳过）

如果条件为真，周期数为2 (执行跳过) ，跳过的指令为1个字长

如果条件为真，周期数为3(执行跳过) ，跳过的指令为2个字长


SBIS - Skip if Bit in I/O Register is Set

SBIS - I/O寄存器中指定位为1则跳行

描述:

这条指令测试I/O寄存器的一个特殊位 ，如果这个位被置位，则跳过下一条指令。 这条指令作用于 I/O寄存器低32位－对应IO控键地址：0～31。

操作：

(i)If I/O(A,b) = 1 then PC ← PC + 2 (or 3) else PC ← PC + 1

语法：            操作:                           程序计数器:

(i)SBIS A,b    0 ≤ A ≤ 31, 0 ≤ b ≤ 7  PC ← PC + 1, 不满足条件，不执行跳过

                                         PC ← PC + 2, 跳过一条1个字长指令

                                         PC ← PC + 3, 跳过一条2个字长指令

16位操作代码:

1001

1011

AAAA

Abbb

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例子：

waitset:  sbis $10,0        ; 如果 Port D 0置位1，则跳过下一条指令

rjmp waitset     ; 不置位

nop

；继续（不做任何操作）

字长: 1 (2 字节)

如果条件为假，周期数为1（不执行跳过）

如果条件为真，周期数为2 (执行跳过) ，跳过的指令为1个字长

如果条件为真，周期数为3(执行跳过) ，跳过的指令为2个字长


SBIW - Subtract Immediate from Word

SBIW - 从字中减去立即数

描述：

寄存器对（字）减去一个立即数（0－63）并把结果存放在这个寄存器对里。 这条指令作用于高4个寄存器对， 很适合操作于指针寄存器。

这条指令并不适合所有的芯片。 具体请参考相应的芯片。

操作：

(i)Rd+1:Rd ← Rd+1:Rd - K

语法：                 操作:                              程序计数器:

(i)SBIW Rd+1:Rd,K     d E {24,26,28,30}, 0 ≤ K ≤ 63    PC ← PC + 1

16位操作代码:

1001

0111

KKdd

KKKK

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
- | - | - | <=> | <=> | <=> | <=> | <=>

S: N ⊕ V, 符号测试

V:Rdh7 · R15

操作使寄存器对溢出则置1； 否则清零

N:R15

所得结果的最高位为1则置位； 否则清零

Z: R15 · R14 · R13 · R12 · R11 · R10 · R9 · R8 · R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

结果为$0000则置位; 否则清零

C:R15 · Rdh7

K 的绝对值大于 Rd的绝对值则置位; 否则清零

执行(Rdh7-Rdh0 = R15-R8, Rdl7-Rdl0=R7-R0)后，R (Result) ＝ Rdh:Rdl.

例子：

sbiw r25:r24,1 ; r25:r24 －1

sbiw YH:YL,63  ;  Y 指针 (r29:r28)－63

字长: 1 (2 字节)

周期数: 2


SEI - Set Global Interrupt Flag

SEI - 将全局中断标志位置1

描述：

将状态寄存器的全局中断标志位置1。 在响应中断之前执行这条指令。

操作：

(i) I ← 1

语法：            操作:                           程序计数器:

(i) SEI            无                         PC ← PC + 1

16位操作符代码：

1001

0100

0111

1000

状态寄存器和布尔方程式：

I | T | H | S | V | N | Z | C
1 | - | - | - | - | - | - | -

I: 1

全局中断标志位置1

例子：

sei            ; 置全局中断标志位为允许中断

sleep          ; 输入sleep,等待中断

               ; 注意：在处理任何中断之前要输入sleep

字长: 1 (2 字节)

周期数: 2


SEN - Set Negative Flag

SEN - 置位负标志位

说明:

置位状态寄存器SREG中的负数标志。

操作：

(i) N ← 1

语法：         操作数：                  程序计数器：

(i) SEN         无                       PC ← PC + 1

16位的操作码：

1001

0100

0010

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | 1 | - | -

N: 1

置位负标记

例如：

add r2,r19       ; 将r19值累加到r2

sen              ; 置位负标记

字长： 1 (2 字节)

指令周期： 1


SER - Set all bits in Register

SER - 置位寄存器中的所有位

说明:

将$FF直接装入目的寄存器Rd。

操作：

(i) Rd ← $FF

语法：            操作数：                    程序计数器：

(i) SER Rd         16 ≤ d ≤ 31                  PC ← PC + 1

16位的操作码：

1110

1111

dddd

1111

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr r16                 ; 清除r16

ser r17                 ; 置位r17

out $18,r16             ; B口输出0

nop                     ; 延时(空操作)

out $18,r17             ; B口输出1

字长： 1 (2 字节)

指令周期： 1


SES - Set Signed Flag

SES - 置S标志位

说明:

置位状态寄存器SREG 中的符号标志。

操作：

(i) S ← 1

语法：         操作数：                      程序计数器：

(i) SES         无                           PC ← PC + 1

16位的操作码：

1001

0100

0100

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | 1 | - | - | - | -

S: 1

置位符号标志位

例如：

add r2,r19       ; r19的值累加到r2

ses              ; 置位符号标志位

字长： 1 (2 字节)

指令周期： 1


SET - Set T Flag

SET - 置T标志位

说明:

置位状态寄存器SREG 中的T标志。

操作：

(i) T ← 1

语法：         操作数：                        程序计数器：

(i) SET         无                             PC ← PC + 1

16位的操作码：

1001

0100

0110

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | 1 | - | - | - | - | - | -

T: 1

置位T标志位

例如：

set ; 置位T标志位

字长： 1 (2 字节)

指令周期： 1


SEV - Set Overflow Flag

SEV - 置V标志位

说明:

置位状态寄存器SREG的溢出标志。

操作：

(i) V ← 1

语法：            操作数：               程序计数器：

(i)SEV             无                    PC ← PC + 1

16位的操作码：

1001

0100

0011

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | 1 | - | - | -

V: 1

置位溢出标志

例如：

add r2,r19 ; r19 加 r2

sev ; 置位溢出标志

字长： 1 (2 字节)

指令周期： 1


SEZ - Set Zero Flag

SEZ - 置位Z标志位

说明:

置位状态寄存器SREG中的零标志Z

操作：

(i) Z ← 1

语法：            操作数：                     程序计数器：

(i) SEZ            无                          PC ← PC + 1

16位的操作码：

1001

0100

0001

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | 1 | -

Z: 1

置位0标志 位

例如：

add r2,r19     ; r19的值累加到r2

sez            ; 置位0标志位

字长： 1 (2 字节)

指令周期： 1


SLEEP

SLEEP 进入休眠

说明:

这条指令使电路进入MCU控制寄存器中所定义的休眠模式。

操作：

请参考器件文档查阅SLEEP指令的详细用法。

语法：          操作数：                程序计数器：

SLEEP            无                     PC ← PC + 1

16位的操作码：

1001

0101

1000

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

mov r0,r11            ; 将r11的值复制到r0

ldi r16,(1<<SE)       ; 允许休眠模式

out MCUCR, r16

sleep                 ; 使MCU进入休眠

字长： 1 (2 字节)

指令周期： 1


SPM - Store Program Memory

SPM - 写程序存储器指令

说明:

SPM可以用来擦除程序存储器的一页，可以向已擦除的页中写数据。也可以设定启动向导锁定位。在某些芯片中，程序存储器可以一次只写一个字，而在其他的芯片中要把事先填到临时页缓冲区的内容同时写到程序存储器的一页当中。 就一切情况而论，程序存储器一次必须擦除一页。当擦除程序存储器的时候RAMPZ和Z寄存器用作指定页地址。当写程序存储器的时候RAMPZ和Z寄存器可以被用作页地址或字地址，R1:R0寄存器对用于写入的数据。 R1确定高字节，R0确定低字节.... 当设置启动引导锁定位时R1:R0寄存器对被用作数据。请参考芯片使用文档来查看SPM的详细用法。这个指令可以在整个程序存储器空间中寻址。

这条指令不是对所有的芯片都有效。 具体请参考相应芯片的特殊指令集。

  1. R1确定高字节R0确定低字节

说明：                                  注释:

(i)(RAMPZ:Z) ← $ffff                   ；擦除程序存储器页

(ii)(RAMPZ:Z) ← R1:R0                  ；将字写到存储器

(iii)(RAMPZ:Z) ← R1:R0                 ；将数据写到临时页缓冲区

(iv)(RAMPZ:Z) ← TEMP                   ；将页缓冲区数据写到存储器页

(v)BLBITS ← R1:R0                      ；设定启动引导锁定位

语法：         操作数：              程序计数器：

(i)-(v) SPM     无                   PC ← PC + 1

16位的操作码：

1001

0101

1110

1000

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

;这个例子示例了SPM写一页的数据到芯片（用页写的方式）

;-这个例子将一页数据（来自RAM）写到Flash

; RAM中第一个数据的地址由Y指针指定

; Flash中第一个数据的地址由Z指针指定

;- 不包括错误处理

;- 这个例子必须放置在引导空间

; (至少do_spm子例程)

;- 用到的寄存器： r0, r1, temp1, temp2, looplo, loophi, spmcrval

; (temp1, temp2, looplo, loophi, spmcrval 必须由用户指定)

; 这里不包括对寄存器状态的存储和恢复

; 在不考虑代码长度的情况下可以对寄存器的使用更加优化

.equ PAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words

.org SMALLBOOTSTART

write_page:

;页擦除

ldi spmcrval, (1<<PGERS) + (1<<SPMEN)

call do_spm

;从RAM中传送数据到页缓冲区

ldi looplo, low(PAGESIZEB)              ;初始化loop变量

ldi loophi, high(PAGESIZEB)             ;对于PAGESIZEB<=256 不需要

wrloop:ld r0, Y+

ld r1, Y+

ldi spmcrval, (1<<SPMEN)

call do_spm

adiw ZH:ZL, 2

sbiw loophi:looplo, 2                   ;对于PAGESIZEB<=256 使用SUBI

brne wrloop

                                             ;执行页写

subi ZL, low(PAGESIZEB)                 ;恢复指针

sbci ZH, high(PAGESIZEB)                ;对于PAGESIZEB<=256 不需要

ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)

call do_spm

                                              ;读取并检验，可选的

ldi looplo, low(PAGESIZEB)              ;初始化loop变量

ldi loophi, high(PAGESIZEB)             ;对于PAGESIZEB<=256 不需要

subi YL, low(PAGESIZEB)                 ;恢复指针

sbci YH, high(PAGESIZEB)

rdloop:lpmr0, Z+

ldr 1, Y+

cp ser0, r1

jmp error

sbi wloophi:looplo, 2                   ;对于PAGESIZEB<=256 使用SUBI

brne rdloop

;返回

ret

do_spm:

;输入: spmcrval 决定 SPM 行为

;如果全局中断允许，则禁止它，保存状态

in temp2, SREG

cli

;检测上次的SPM是否完成

wait:intemp1, SPMCR

sbr ctemp1, SPMEN

rjm pwait

;SPM时序

out SPMCR, spmcrval

spm

;还原SREG (如果原先中断允许，则也要打开中断允许)

out SREG, temp2

ret

字长： 1 (2 字节)

指令周期： 取决于具体操作


ST - Store Indirect From Register to data space using Index X

ST - X间址存数

说明:

从寄存器中向数据区间接存储一个字节的数据。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

X寄存器指定要存储的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPX 的校准。

在操作中X寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到X寄存器的高字节，这时X寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPY积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。具体请参考相应芯片的特殊指令集。

象下面的这种使用组合就没有定义：

ST X+, r26

ST X+, r27

ST -X, r26

ST -X, r27

使用X指针:

说明：                                  注释:

(i)(X) ← Rr                                 X: 不变

(ii)(X) ← Rr         X ← X+1                X: 执行后加1

(iii)X ← X - 1       (X) ← Rr               X: 执行前减1

语法：              操作数：              程序计数器：

(i)ST X, Rr          0 ≤ r ≤ 31             PC ← PC + 1

(ii)ST X+, Rr        0 ≤ r ≤ 31             PC ← PC + 1

(iii)ST -X, Rr       0 ≤ r ≤ 31             PC ← PC + 1

16-位的操作码：

(i) | 1001 | 001r | rrrr | 1100
(ii) | 1001 | 001r | rrrr | 1101
(iii) | 1001 | 001r | rrrr | 1110

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr   r27            ; 清除X寄存器高字节

ldi   r26,$60        ; 将X寄存器低字节设置成$60

st    X+,r0          ; 存储r0内容到数据存储器控件中的$60处（执行后X值加1）

st    X,r1           ; 存储r1内容到数据存储器的$61处

ldi   r26,$63        ; 将X寄存器低字节设置成$63

st    X,r2           ; 存储r2中的数据到指定的$63数据空间处

st   -X,r3           ; 存储r3的数据到数据空间中地址为$62的地方（X 事先减1）

字长： 1 (2 字节)

指令周期： 2


ST (STD) - Store Indirect From Register to data space using Index Y

ST (STD) - Y间址存数

说明：

从寄存器中向数据区带位移或不带位移的间接存储一个字节的数据。对于带SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。 对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

Y寄存器指定要存储的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPY的校准。

在操作中Y寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到Y寄存器的高字节，这时Y寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPY积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。具体要参考器件的指令集。

象下面的这种使用组合就没有定义：

ST Y+, r28

ST Y+, r29

ST -Y, r28

ST -Y, r29

使用Y寄存器：

操作：                                                注释：

(i)(Y) ← Rr                                               Y: 不变

(ii)(Y) ← Rr                Y ← Y+1                       Y: 运算以后加一

(iii)Y ← Y - 1              (Y) ← Rr                      Y: 运算以前先减一

(iiii) (Y+q) ← Rr                                         Y: 不变， q: 偏移量

语法：                     操作数：                     程序计数器：

(i)ST Y, Rr                 0 ≤ r ≤ 31                    PC ← PC + 1

(ii)ST Y+, Rr               0 ≤ r ≤ 31                    PC ← PC + 1

(iii)ST -Y, Rr              0 ≤ r ≤ 31                    PC ← PC + 1

(iiii)STD Y+q, Rr           0 ≤ r ≤ 31, 0 ≤ q ≤ 63       PC ← PC + 1

操作码：

(i) | 1000 | 001r | rrrr | 1000
(ii) | 1001 | 001r | rrrr | 1001
(iii) | 1001 | 001r | rrrr | 1010
(iiii) | 10q0 | qq1r | rrrr | 1qqq

状态寄存器 (SREG) 标志位:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr        r29               ;清除Y寄存器的高字节

ldi        r28,$60           ;设置Y寄存器的低字节为$60

st         Y+,r0             ;将寄存器r0中的数据存储在指定的地址上：$60(取址后Y值加一)

st         Y,r1              ;将寄存器r1中的数据存储在指定的地址上：$61

ldi        r28,$63           ;设置Y寄存器的低字节为$63

st         Y,r2              ;将寄存器r2中的数据存储在指定的地址上：$63

st         -Y,r3             ;将寄存器r3中的数据存储在指定的地址上：$62(存储之前Y值首先减一变成$62)

std        Y+2,r4            ;将寄存器r4中的数据放在地址为$64的地方

字数: 1 (2 字节)

指令周期： 2


ST (STD) - Store Indirect From Register to data space using Index Z

ST (STD) - Z间址存数

说明:

从寄存器中向数据区带位移或不带位移的间接存储一个字节的数据。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

Z寄存器指定要存储的地址。对存储器数据的访问被限定在当前数据段的64K字节的空间，如果要访问另一个数据段大于64K的空间，就要改变I/O空间中RAMPZ的校准。

在操作中Z寄存器的值可以不变，也可以带预减量或后增量。这些特性尤其适合于访问数组，矩阵表，堆栈指针等。然而，Z寄存器可以被用作间接子程序调用，间接跳转和查表，所以最好还是使用X或Y指针寄存器作为一个专门的堆栈指针。注意对于具有不超过256字节数据空间的芯片，这条指令没有用到Z寄存器的高字节，这时Z寄存器的高字节可以用作其他用途。有的芯片具有超过64K字节的数据空间或者超过64K字节的程序空间，这个时候在取址的时候还要用到I/O寄存器区中的RAMPZ积存器，组成24位，来取址。

不是所有芯片都支持这条指令的各种变形。 具体请参考相应芯片的特殊指令集。

象下面的这种使用组合就没有定义：

ST Z+, r30

ST Z+, r31

ST -Z, r30

ST -Z, r31

使用Z指针：:

说明：                                                          注释:

(i)(Z) ←Rr                                                          Z: 不变

(ii)(Z) ← Rr                     Z ← Z+1                            Z: 执行后加1

(iii)Z ← Z - 1                   (Z) ← Rr                           Z: 执行前减1

(iiii) (Z+q) ← Rr                                                   Z: 不变, q: 偏移量

语法：                          操作数：                          程序计数器：

(i)ST Z, Rr                      0 ≤ r ≤ 31                         PC ← PC + 1

(ii)ST Z+, Rr                    0 ≤ r ≤ 31                         PC ← PC + 1

(iii)ST -Z, Rr                   0 ≤ r ≤ 31                         PC ← PC + 1

(iiii)STD Z+q, Rr                0 ≤ r ≤ 31, 0 ≤ q ≤ 63            PC ← PC + 1

16-bit Opcode :

(i) | 1000 | 001r | rrrr | 0000
(ii) | 1001 | 001r | rrrr | 0001
(iii) | 1001 | 001r | rrrr | 0010
(iiii) | 10q0 | qq1r | rrrr | 0qqq

状态寄存器（SREG）和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

clr          r31                 ; 清除Z寄存器高字节

ldi          r30,$60             ; 设置Z低字节为$60

st           Z+,r0               ; 将r0数据存储到数据空间中指定地址$60处(Z值加1)

st           Z,r1                ; 将r1数据存储到数据空间中指定地址$61处

ldi          r30,$63             ; Z低字节设置为$63

st           Z,r2                ; 将r2数据存储到数据空间中指定地址$63处

st           -Z,r3               ; 将r3数据存储到数据空间中指定地址$62处(Z执行前减了1)

std          Z+2,r4              ; 将r4数据存储到数据空间中指定地址$64处

字长： 1 (2 字节)

指令周期： 2


STS - Store Direct to data space

STS - 寄存器数据直接送SRAM

说明:

将寄存器中的内容直接存储到数据存储空间中。对于带有SRAM的芯片，数据空间由寄存器堆，I/O存储器和内部SRAM存储器，和外部SRAM（如果在使用）组成。对于不带SRAM的芯片，数据区仅由寄存器堆组成。EEPROM有单独的地址空间。

对存储器数据的访问被限定在当前数据段的64K字节的空间。STS指令和RAMPD 寄存器结合使用可以访问超过64K字节的数据空间。就要改变I/O空间中RAMPD的校准。

这条指令不是对所有的芯片都适用，请具体参考相关芯片的特殊指令集。

操作：

(i)(k) ← Rr

语法：              操作数：                      程序计数器：

(i)STS k,Rr          0 ≤ r ≤ 31, 0 ≤ k ≤ 65535      PC ← PC + 2

32位的操作码：

1001 | 001d | dddd | 0000
kkkk | kkkk | kkkk | kkkk

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

lds     r2,$FF00    ; 数据空间中位于$FF00的数据装入寄存器r2

add     r2,r1       ; 将 r1 的值累加到 r2

sts     $FF00,r2    ; 写回

字长： 2 (4 字节)

指令周期： 2


SUB - Subtract without Carry

SUB - 不带进位减

说明:

将两个寄存器中的数据相减，结果放在目的寄存器Rd中。

操作：

(i)Rd ← Rd - Rr

语法：          操作数：                  程序计数器：

(i)SUB Rd,Rr     0 ≤ d ≤ 31, 0 ≤ r ≤ 31     PC ← PC + 1

16位的操作码：

0001

10rd

dddd

rrrr

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · Rr3 +Rr3 · R3 +R3 · Rd3

如果高四位和低四位之间有进位/借位则置位；否则清0

S: N ⊕ V, 检验符号的正负

V:Rd7 · Rr7 · R7 + Rd7 · Rr7 · R7

如果这个操作结果的二进制补码溢出则置位；否则清0.

N:R7

如果结果的最高有效位为1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

C: Rd7 · Rr7 +Rr7 · R7 +R7 · Rd7

如果Rr中的绝对值大于Rd中的绝对值则置位；否则清0

结果保存在目的寄存器Rd中。

例如：

sub      r13,r12       ; r13 内容减去 r12

brne     noteq         ; 如果r12 不等于 r13则跳转

...

noteq:     nop                    ; 分支目的地

字长： 1 (2 字节)

指令周期： 1


SUBI - Subtract Immediate

SUBI - 减立即数

说明:

一个寄存器和常数相减，结果送目的寄存器Rd。该指令工作于寄存器R16～R31之间，非常适合X、Y和Z指针的操作。

操作：

(i)Rd ← Rd - K

语法：       操作数：                      程序计数器：

(i)SUBI Rd,K  16 ≤ d ≤ 31, 0 ≤ K ≤ 255       PC ← PC + 1

16位的操作码：

0101

KKKK

dddd

KKKK

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | <> | <> | <> | <> | <> | <>

H: Rd3 · K3+K3 · R3 +R3 · Rd3

如果高四位与低四位之间有进位/借位则置1；否则清0

S: N [+] V, 检验符号的正负

V:Rd7 · K7 · R7 + Rd7 · K7 · R7

如果这项操作结果的二进制补码溢出则置1；否则清0

N:R7

如果结果的最高有效位为1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

C: Rd7 · K7 +K7 · R7 +R7 · Rd7

如果K的绝对值大于Rd的绝对值则置位；否则清0

结果保存在目的寄存器Rd中。

例如：

subi    r22,$11       ; r22减去$11

brne    noteq         ; 如果r22 不等于 $11则跳转

...

noteq:     nop                   ; 分支目的地

字长： 1 (2 字节)

指令周期： 1


SWAP - Swap Nibbles

SWAP - 寄存器高四位与低四位交换

说明:

将一个寄存器中的高四位与低四位进行交换。

操作：

(i)R(7:4) ← Rd(3:0), R(3:0) ← Rd(7:4)

语法：             操作数：                          程序计数器：

(i)SWAP Rd          0 ≤ d ≤ 31                         PC ← PC + 1

16位的操作码：

1001

010d

dddd

0010

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

结果保存在目的寄存器Rd中。

例如：

inc      r1             ; r1内容加1

swap     r1             ; 交换r1

inc      r1             ; r1高四位加1

swap     r1             ; 交换回来

字长： 1 (2 字节)

指令周期： 1


TST - Test for Zero or Minus

TST - 零检测或负数检测

说明:

检测寄存器是否是零或负数。执行了寄存器和它本身的逻辑与。它只影响标志位而寄存器的内容将保持不变。

操作：

(i)Rd ← Rd ·Rd

语法：            操作数：                          程序计数器：

(i)TST Rd          0 ≤ d ≤ 31                         PC ← PC + 1

16位的操作码： (参考 AND Rd, Rd)

0010

00dd

dddd

dddd

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | <> | 0 | <> | <> | -

S: N [+] V, 检验符号的正负

V:0

清零

N:R7

如果结果的最高有效位为1则置1；否则清0。

Z: R7 · R6 · R5 · R4 · R3 · R2 · R1 · R0

如果结果为$00则置1；否则清0。

结果保存在寄存器Rd中。

例如：

tst r0                     ; 测试r0

breq zero                  ; 如果r0=0跳转

...

zero:      nop                         ; 分支目的地

字长： 1 (2 字节)

指令周期： 1


WDR - Watchdog Reset

WDR - 看门狗复位

说明:

这个指令复位看门狗定时器。这条指令必须在WD预定标器所限定的时间内执行。请参考看门狗定时器硬件详细说明。

操作：

(i)WD 定时器重启

语法：            操作数：                      程序计数器：

(i)WDR             无                           PC ← PC + 1

16位的操作码：

1001

0101

1010

1000

状态寄存器和布尔表达式:

I | T | H | S | V | N | Z | C
- | - | - | - | - | - | - | -

例如：

wdr ; 复位看门狗计时器

字长： 1 (2 字节)

指令周期： 1


疑难解答

疑难解答与处理

AVR汇编器

这里所列出的疑难问题仅适用于AVR 汇编器1，对于 AVR 汇编器2的疑难解答，请点击这里。

注意：AVR 汇编器1一般已不再使用，它所出现的问题可能没有被修正。所有的这些问题在AVRASM2中已经被解决。

  • 汇编程序标签最长不能超过31个字符。如果超出了这个长度，将会报错。

  • 汇编器对>0X10000(64KB)的空间，不支持摩托罗拉十六进制输出格式的寻址，这种大于0x10000的寻址应该被解码成3－字节52 条记录，但是汇编器会把它解码成2－字节 51条记录，并且没有警告发生。

  • 语法分析程序不能检测到某些语法错误。例如，条件语句 .if A=0 就不能被检测（正确的应该是 .if A==0）。不仅没有检测到错误，汇编器还把它翻译成 if A,这和正确的语句正好相反。有些情况下这些不能检测到的错误可以在AVRASM2中被检测到。

  • '#' 和 ';' 被定义成注释符，就连引号括中的这些 符号也认为成注释符。这样在使用字符串("#")或字符常量(';')的时候产生"garbage at and of line"错误。

  • 在宏定义的时候，.endmacro只能出现在单独的行而不能与标签在同一行。

    label: .endmacro
    将会产生"Macro call within macro not supported"的错误信息。

    解决方法就是分开写，例如：

    label:
    .endmacro

  • 在一系列的.if ... .else ... .elif ... .endif.等序列中，汇编器不能检测到放错位置的.elif条件语句。

    例如：下面的代码编译时不会报错，并输出message "a != 1 && a != 0"。

    .equ a = 0
    .if a == 1
    .message "a = 1"
    .else
    .message "a != 1 && a != 0"
    .elif a == 0
    .message "a = 0"
    .endif


AVR Assembler 2

Atmel AVR 汇编器2

运行AVR Studio 4.11后，AVR汇编器2 (AVRASM2) 作为AVR默认的汇编器。 AVRASM2拥有许多新特性，并且向下兼容AVRASM。 老版本的汇编器仍然保留在AVR Studio中，但是不再对它进行更新和维护（也就是说，老版本的汇编器不支持新增器件）。

AVRASM2 相关主题

新增功能 - 介绍AVRASM2的新特性
AVR 汇编器2 语法
AVR 汇编器2 预处理程序
AVR 汇编器2 命令行
AVR 汇编器2 疑难解答与处理


AVR Assembler 2 - 新增功能

本部分介绍了一些在AVRASM2中，以前的AVRASM1.x没有的新特性。

C-型预处理程序
严格的语法
新的汇编器伪指令
新增表达式
内置的包含文件路径
超大文件的摩托罗拉十六进制格式
宏的改进
AVRASM2 版本更新记录

C-型 预处理程序

AVRASM2的特色伪指令是模仿C预处理程序；参见 AVR 汇编器2 预处理程序 。 预处理程序符号可以通过 命令行来定义或者取消定义。

严格的语法

汇编器语法 比以前更加严格了一点， 汇编器中的关键字（指令、寄存器、内置函数）都不能再作为用户定义的符号（伪指令.def/.equ/.set中的标号、名称）使用了。这样可能会使一些现有的代码出错，但是可以帮助避免一些漏洞，还可以增强程序的可读性。

不再支持的指令

使用不再支持的指令会导致生成一个汇编器错误，而不是警告。这种情况可以在Studio汇编器设置窗口中更改，使用命令行选项-W+iw。

新的汇编器伪指令

.undef 符号

取消一个被.def 伪指令定义过的寄存器的定义。使用此指令可以避免“已经被伪指令.DEF定义过”的警告。

.dd 表达式[,表达式 ...]
.dq 表达式[,表达式 ...]

这两个伪指令与 .dw 伪指令是类似的，只有一点不同，就是它们分别是用来定义双字(32-bit) 和四字(64-bit) 的， 字节和字的顺序严格按照 little-endian方式（一个字中的低字节放在内存中这个字的低地址处）。

.warning "<消息>"

用来输出一条警告消息。

改进的表达式

常量表达式可以是正数或者浮点数，C的操作数优先规则具有传递性。如果符号或指令操作数是整型的，其相对应的函数在操作之前也应该转换为整型(例如下面提到的， int(), q7() )。

实型到整型的转换会引起一个警告，其小数部分会被忽略。整型或浮点型数据都占64位。

AVRASM2 和AVRASM支持相同的 操作数 ，另外 % 表示(模/余数)。

并且AVRASM支持的 函数 ， 还有下面的新函数，也是AVRASM2所支持的：

int()

将一个浮点型表达式强制转换为整型（舍去其小数部分）。

frac()

取出一个浮点表达式的小数部分(舍去其整数部分)。

q7()

将一个浮点型表达式的小数部分转换为适用于指令FMUL/FMULS/FMULSU 的形式 (符号位 + 7位的小数部分)。

q15()

将一个浮点型表达式的小数部分转换为指令FMUL/FMULS/FMULSY 返回的形式 (符号位 + 15位的小数部分)。

abs()

返回一个常量表达式的绝对值。

内置的包含文件路径

与AVRASM1不同， AVRASM2 一旦被作为AVR Studio的一部分安装，它就会知道Appnotes的目录是什么，用户不需要指定路径命令行如下：

-I "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes"

当汇编器从命令行中作为一个单独的程序被调用时更加方便。

超大文件的摩托罗拉十六进制格式

一个在AVRASM中长期存在的错误在AVRASM2中被修复了： 摩托罗拉十六进制 (S-record) 输出格式可以超出64kB的限制了，当段的大小超过64k字节时，使用S2 data records。

宏命令的改进

  • 汇编器宏命令参数的数量在AVRASM2中没有限制了 (在AVRASM中最大为10)。

  • 宏调用的嵌套 (一个宏命令调用另一个宏命令)在AVRASM2中是允许的 - 不过不推荐过度使用。

AVRASM2 版本更新记录

版本更新记录主要记录了每一个AVRASM2 版本的重要改变。

AVR Studio 4.11 SP3中的2.0.31版本的变化

  • 修订：在预处理程序中缺少符号常量 ',' 或 '\' ，会导致错误。

  • 修订：当进行条件汇编时试图先于定义引用符号，隐藏"internal error" 消息(参见 疑难解答)。

  • 修订：当源文件打不开时，汇编器生成"empty" (仅包含头文件)的输出文件。

AVR Studio 4.11 SP2中的2.0.30版本的变化

  • 修订：超出了8kB flash芯片内目标地址范围的相对跳转(rjmp/rcall)所导致的Off-by-one 错误。

AVR Studio 4.11 SP1中的2.0.29版本的变化

  • 修正绝对路径名包含的文件错误

  • 在汇编器源文件中允许换页(当作空格处理)。

AVR Studio 4.11中的2.00 版本 (2.0.28)的变化

  • 新的包含文件

  • 新的 预设宏定义

  • -FD/-FT 选项控制 __DATE__/__TIME__ 预设宏定义 的格式

  • 测试版中大量的漏洞都在最后的版本中被修订了。它们是：

    • 错误报告的改进。即，在一般的错误情况中减少"Syntax error: Unexpected FOOBAR"消息的出现 。

    • 修正了二进制数大小写敏感的漏洞。也就是说， 0b 和 0B 现在是等同的。

    • 修正了嵌套宏调用中冲突的漏洞。

    • 修正了错误的 #elif/.elif 条件赋值伪指令。

    • 修正了一些在不正确程序汇编时，会导致汇编器崩溃或中止的漏洞。

    • 修正了关于声明行号的 off-by-one错误。

    • 去掉了 .warning 汇编器伪指令功能。

    • 完善了对默认字节操作数范围的检查。

    • 删除了所有失败的输出文件。

    • 对空的源文件(无代码或数据)进行警告，如果源文件为空则不产生输出。

下面是在最后的 AVRASM2 测试版中做的一些修改。

BETA5中的变化:

  • 汇编器宏定义中的预处理程序条件汇编可以使用了(但是请在使用之前读 这里 和 这里 )。

  • 命令行选项和pragmas指令对超出范围的字节操作数的警告。

  • List files:李表文件：在条件汇编不为真的情况下的代码不被列在表内。

  • 漏洞修正：当嵌套的包含文件发生错误时，出错信息中会显示出这些出错文件的名字。

  • 漏洞修正：如.dw 的汇编器伪指令在预处理程序中不再使用。

  • 漏洞修正：在汇编器宏定义中使用预处理宏定义会使参数 @x的赋值出错。

BETA4中的变化:

  • 允许 .set 和 .def 伪指令在宏定义中使用。

  • 修正了.exit 伪指令。


AVR Assembler 2 Syntax

AVR汇编器2的语法

要了解基本的AVRASM语法请点击 这里 ， 另外AVRASM2 还有下述一些要注意的事项。

关键字
预处理程序伪指令
注释
行的延续
字符串和字符常量
一行中的多个指令
操作数

关键字

和AVRASM不同， 预先定义的标识符 (关键字) 被保存下来，并且不允许再定义。这些关键字包括所有的指令， 寄存器 R0-R31 和 X, Y, Z, 以及所有 函数。

汇编器的关键字一般对大小写是不敏感的，除非你使用case-sensitive选项， 此时关键字才会区分大小写 (例如, 预先定义了"add" ， 此时"ADD"不表示"add" )。

例如

下述的无意义的或者使人费解的程序在AVRASM中不会产生错误， 但在AVRASM2中会被指出。

.equ    add = 2                 ; 'add'是关键字  (指令)
.def    r1 = r16                ; 'r1' 是关键字  (寄存器)
.def    r0 = r31                ; 'r0' 是关键字  (寄存器)
.def    r16 = r24               ; 'r16' 是关键字 (寄存器)
.def    add = r2                ; 'add' 是关键字- 再次 (指令)
.def    mov = r29               ; 'mov' 是关键字 (指令)

mov:    cpi r16,100             ; 'mov' 是关键字 - 再次 (指令)
        mov mov,mov             ; 真有意思... :)
        ldi mov,mov             ; ... 多余!
        mov r1,add              ; 这里使用的'add'是哪个定义?
        mov r0,r1               ; 事实并非如此!
        rjmp mov                ; 那么现在该做什么...?

预处理程序伪指令

AVRASM2把所有以 '#' 开始的行作为一种无空格特性的预处理程序伪指令处理。

注释

另外，经典的汇编器注释以 ';'开始, AVRASM2可以识别C语言的注释。 下述的注释类型均是可识别的：

;   本行后面的部分都作为注释 (经典汇编器注释)
//  和';'一样，本行的部分都作为注释
/*  块注释；被括起来的文本部分作为注释，可以跨越多行。
    这种类型的注释不能嵌套 */

行的延续

象在C语言中一样，源程序的行可以通过使用一个反斜杠(\)作为一行的延续符号。这在较长的预处理宏定义中，或在伪指令.db中非常有用。

例如

.db 0, 1, "This is a long string", '\n', 0, 2, \
"Here is another one", '\n', 0, 3, 0

字符串和字符常量

AVRASM2可以以和AVRASM相同的方式识别字符串和字符，而且它还可以使用AVRASM不支持的转义字符。

用双引号(")括起来的字符串只能使用伪指令.db连接。 字符串是逐字识别的，此时不会当它是转义字符，它也不是由空字符终止的。

用单引号 (')括起来的字符常量，可以使用在任何被允许的整型表达式中。下列C语言中的转义字符可以在AVRASM2中被识别，并且和C语言中的具有相同含义：

转义字符 | 含义
\n | 换行 (ASCII LF 0x0a)
\r | 回车 (ASCII CR 0x0d)
\a | 警铃 (ASCII BEL 0x07)
\b | 退格 (ASCII BS 0x08)
\f | 换页 (ASCII FF 0x0c)
\t | 水平制表 (ASCII HT 0x09)
\v | 垂直制表 (ASCII VT 0x0b)
\\ | 反斜杠
\0 | 空字符 (ASCII NUL)

\ooo (ooo = 八进制) 以及 \xhh (hh = 十六进制)也被支持。

例如
.db "Hello\n"  // is equivalent to:
.db 'H', 'e', 'l', 'l', 'o', '\\', 'n'

要生成一个与C字符串 "Hello, world\n"等同的字符串：

.db "Hello, world", '\n', 0

一行中的多个指令

AVRASM2允许在一行中有多个指令或者伪指令，但是这种用法不被推荐。它需要支持多行的预处理宏定义。

操作数

另外AVRASM所支持的操作数， AVRASM2限制了对浮点型常量表达式的支持。


AVR Assembler 2 Preprocessor

AVR 汇编器2 预处理程序

简介
预处理程序伪指令
预设宏定义

简介

AVRASM2 的预处理程序和C预处理程序类似，处理下述一些地方不同：

  • 支持所有 AVRASM2中使用的整型格式，也就是说，$abcd 和 0b011001 在预处理程序中都是有效整型量，同时也可以在 #if 伪指令表达式中使用。

  • 在标识符中，允许使用'.' 和 '@' 。 '.' 是预处理程序伪指令中必须用到的，例如 '.dw' 使用在预处理宏定义上， '@' 是正确使用汇编器宏参数时所必需的。

  • 汇编器型的注释支持分隔符 (';') ，同C型注释。使用 ';' 作为注释的分隔符和C中的 ';'有一定的冲突，因此在于处理程序伪指令中不推荐使用汇编器型的注释。

  • #line 伪指令不再使用。

  • ## 和 # 操作符不再使用。

  • 可变参数宏 (带大量可变参数的宏定义)不再允许使用。

  • The AVRASM2 预处理程序不再在进行汇编前作为分离途径被调用，而是作为汇编器整体的一部分。如果相似的预处理程序和汇编器的结构掺杂进来就可能会导致一些混乱(例如 #if 和 .if 条件汇编指令)。 这也可能导致汇编器宏定义使用时，预处理程序的条件值在宏展开时，而不是在定义时就被给定。条件汇编指令不能跨越宏定义的开头或结尾(但是可以跨越一个完整的宏定义，包括开头结尾)。

  • 不能在ANSI C 标准中指定 #warning 和 #message 伪指令。

预处理程序伪指令

#define
#elif
#else
#endif
#error

#if
#ifdef
#ifndef
#include
#message

杂注
#undef
#warning
# (空伪指令)

#define

语法

  1. #define 宏名 [值]

  2. #define 宏名(参数, ...) [值]

说明

定义一个预处理宏。有两种形式的宏：（1）目标型宏指令（object-like macros），基本上是定义一个常量；(2)函数型宏（function-like macros），进行参数替换。

[值] 可以是任意的字符串,除非这个宏在扩展（使用）的时候才会被用到。如果 值 没有被检测到，默认是1。

形式(1)中的宏可以在命令行中定义，使用-D 参数。

当使用形式（2）时,宏在调用的时候参数的数目必须与声明时相同。宏被调用的时候，值 中的 参数 将会被替换成调用它时的 参数 。注意左括号与 宏名 之间不能有空格，否则将会被认定为一个形式（1）宏的 值 。

例如

注意左括号"("的位置，在下面的例子中它的位置是很重要的。

  1. #define EIGHT (1 << 3)

  2. #define SQR(X) ((X)*(X))

#undef

语法

#undef 宏名

说明

取消已定义的宏。如果 宏名 没有事先被定义，那么.undef伪指令将会被忽略，这是按照ANSI 标注C来做的。也可以使用命令行来取消宏定义， -U 选项。

#ifdef

语法

#ifdef 宏名

说明

如果 宏名 事先被#defined，所有下面的行直到对应的#endif, #else, 或 #elif 都被有条件的执行。它是#if defined(宏名)的简写。

例如

#ifdef FOO
// 什么也不作
#endif

#ifndef

语法

#ifndef 宏名

说明

与#ifdef相反的伪指令:如果 宏名 没有事先被#defined，所有下面的行直到对应的#endif, #else, 或 #elif 都被有条件的执行。是#if !defined(宏名)的简写。

#if
#elif

语法

#if 条件1

#elif 条件2

说明

如果条件1为真（不等于0），所有下面的行直到对应的#endif, #else, 或 #elif 都被有条件的执行。条件1 可以是任何的整型表达式，包括程序中正在使用中的其他宏。预处理程序认可 defined(宏名) 表达式返回1（如果 宏名 已事先#defined），否则返回0。表达式中所有未定义的宏都被认为是0。

它可以被任意深度的嵌套。

#elif 条件2 用法同#if，除非前面的分支#if .. #elif被认定为真。

例如

#if 0
// 这里的代码不会被包含
#endif

#if defined(__ATmega48__) || defined(__ATmega88__)
// 专为这些芯片的代码
#elif defined (__ATmega169__)
// 专为ATmega169的代码
#endif

#else

语法

#else

说明

如果相应#if ... #elif ... 序列的前一个分支被认为false时，所有下面的行直到对应的#endif都被有条件的执行。

Example

#if defined(__ATmega48__) || defined(__ATmega88__)
// 这些芯片专用的代码
#elif defined (__ATmega169__)
// 专为ATmega169的代码
#else
#error "不支持的芯片:" __PART_NAME__
#endif

#endif

语法

#endif

说明

终止一个以#if, #ifdef, 或 #ifndef 伪指令开始的条件块。

#error
#warning
#message

语法

#error 标记

#warning 标记

#message 标记

说明

#error 发布后面的 标记 到标准错误中，并增加汇编器的错误计数，因此防止了程序被成功的编译。#error 在标准ANSI C中被指定。

#warning 发布后面的 标记 到标准错误中，并增加汇编器的警告计数。#warning 在标准ANSI C中未被指定,但可以在GNU C等预处理器中实现。

#message 发布后面的 标记 到标准输出中，它不影响汇编起错误计数和警告计数。#message没有在ANSI 标准C中规定。

对于所有的芯片，输出应该包括文件名和行数，象错误信息和警告信息一样。

这里的标记 是一个预处理标记序列。除了出现在引号中的预处理宏都将被扩展。

例如

#error "不支持的芯片:" __PART_NAME__

#include

语法

  1. #include "file"

  2. #include <file>

说明

包含一个文件。形式（1）首先在当前工作目录中查找文件，与汇编器的.include伪指令功能等效；形式(2)不查找当前的工作路径。两种格式都查找汇编器内置的（确定路径）路径文件。

强烈不建议在#include中使用绝对路径。这将给工程在不同的文件夹或不同的电脑之间移动造成困难。使用-I 命令行参数指定包含的路径, 或者在AVR Studio中设置：－>Project－>Assembler Options。

例如

#include <m48def.inc>

#include "mydefs.inc"

#pragma, 通用目的

语法

  1. #pragma 警告字节范围 选项

  2. #pragma 重叠 选项

  3. #pragma 错误指令

  4. #pragma 警告指令

说明

  1. 汇编器认定常整型表达式为64-位的有符号数。当这样的表达式被用作立即数时，必须按照指令截去高位来使用。对于大多数的操作数，一个超范围的值会导致一个"操作数超范围"的错误信息。然而，对于ldi, cpi, ori, andi, subi, sbci 指令使用的字节型立即数，受参数的不同有不同的解释。
    选项     = integer 立即数被认为是一个整数，如果它的范围在[-128 ... 255]之外，就会给出一个警告。汇编器不知道用户的意图是有符号整数还是无符号整数，因此它适合一个字节的所有有符号或无符号整数。
    选项    = overflow (默认): 立即数被认定为一个无符号字节数据，所有的符号扩充位被忽略。当用整数处理位屏蔽会造成很多警告的时候（例如ldi r16, ~((1 << 7) | (1 << 3))），这个选项尤其适合。
    选项    = 无 禁止所有的字节型操作数的超范围警告。不建议使用。

  2. 如果不同部分的代码映使用 .org 伪指令射到了重叠的存储器定位，就会给出一个错误。这个选项就对这种行为进行了描述：
    选项     = ignore 完全忽略重叠情况；没有错误，没有警告，不建议使用。
    选项    = warning 检测到重叠情况时产生警告。
    选项    = error 将重叠的情况看作错误的情况；这是默认的也是建议的用法。

  3. 在指定的芯片中，对于不支持的指令产生一个汇编错误（默认）。

  4. 在指定的芯片中，对于不支持的指令产生一个汇编警告。

相关参考

  1. 命令行参数 -W.

  2. 命令行参数 -O.

#pragma, 关于AVR芯片

语法

  1. #pragma AVRPART ADMIN PART_NAME 字符串

  2. #pragma AVRPART CORE CORE_VERSION 版本字符串

  3. #pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED 指令[ 操作数[,操作数] ][:...]

  4. #pragma AVRPART CORE NEW_INSTRUCTIONS 指令[ 操作数[,操作数]][:...]

  5. #pragma AVRPART MEMORY PROG_FLASH 大小

  6. #pragma AVRPART MEMORY EEPROM 大小

  7. #pragma AVRPART MEMORY INT_SRAM SIZE 大小

  8. #pragma AVRPART MEMORY INT_SRAM START_ADDR 地址

说明

这些伪指令用来指定芯片的特有属性，一般被用在芯片定义文件(partdef.inc)中。一般没有理由在程序中直接使用这些杂注。

预处理宏不允许定义在杂注中。表达式不允许参数为分数，只能是纯数字的十进制、十六进制、八进制、或二进制格式。字符串参数不能被引号括起来。这些杂注指明下面的芯片属性：

  1. 芯片名称,如：ATmega8

  2. AVR 内核版本。这定义了所知持的基本的指令集。允许的内核版本是：V0, V0E, V1, V2, 和 V2E。

  3. 这个芯片不支持的、由冒号隔开的指令列表，相对于内核版本。

  4. 这个芯片指定的、冒号隔开的附加指令列表，相对于内核版本。

  5. FLASH 程序存储器大小，以字节为单位。

  6. EEPROM 存储器大小，以字节为单位。

  7. SRAM 存储器大小，以字节为单位。

  8. SRAM 存储器起始地址。对于基本的AVR 芯片是0x60；带扩展I/O的芯片是0x100（或更大）。

例如

请注意这些例子中的组合并不描述一个真正的AVR芯片。

  1. #pragma AVRPART ADMIN PART_NAME ATmega32

  2. #pragma AVRPART CORE CORE_VERSION V2

  3. #pragma AVRPART CORE INSTRUCTIONS_NOT_SUPPORTED movw:break:lpm rd,z

  4. #pragma AVRPART CORE NEW_INSTRUCTIONS lpm rd,z+

  5. #pragma AVRPART MEMORY PROG_FLASH 131072

  6. #pragma AVRPART MEMORY EEPROM 4096

  7. #pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

  8. #pragma AVRPART MEMORY INT_SRAM SIZE 4096

# (空伪指令)

语法

#

说明

顾名思义,这个伪指令什么也不作。它存在的唯一原因是因为在ANSI C标准中有要求。

预设宏定义（Pre-defined macros）

预处理程序有一系列的预设宏定义。所有的这些宏名都用两个下划线（__）开始、结束。为避免冲突，用户自定义的宏不能和这个命名规则相同。

预设宏定义或者是内置的（built-in）或者是被用作杂注（杂注）向下表所示的这样。

名称 | 类型 | 用途 | 说明
__AVRASM_VERSION__ | 整型 | 内置 | 汇编器版本，按照(1000*major + minor)编码
__CORE_VERSION__ | 字符 | 杂注 | AVR内核版本
__DATE__ | 字符 | 内置 | 建立日期 格式: "Jun 28 2004"，请参考-FD 命令行选项.
__TIME__ | 字符 | 内置 | 建立时间 格式： "HH:MM:SS"，请参考-FT命令行选项
__CENTURY__ | 整型 | 内置 | 建立时的世纪（典型的是 20）
__YEAR__ | 整型 | 内置 | 建立时的年份（0－99）
__MONTH__ | 整型 | 内置 | 建立时的月份（1－12）
__DAY__ | 整型 | 内置 | 建立时的日(1-31)
__HOUR__ | 整型 | 内置 | 建立时的时(0-23)
__MINUTE__ | 整型 | 内置 | 建立时的分(0-59)
__SECOND__ | 整型 | 内置 | 建立时的秒(0-59)
__FILE__ | 字符 | 内置 | 源文件名字
__LINE__ | 整型 | 内置 | 当前行在源文件中的行数
__PART_NAME__ | 字符 | 杂注 | AVR芯片名字
__partname__ | 整型 | 杂注 | 相应于__PART_NAME__的芯片名字。 例如: #ifdef __ATmega8__
__CORE_coreversion__ | 整型 | 杂注 | 相应于__CORE_VERSION__的内核版本。例如: #ifdef __CORE_V2__


AVR Assembler 2 Command Line Options

AVR 汇编器2 命令行选项

和AVRASM一样， AVRASM2的命令行可以作为一个单独的程序来使用。AVRASM2的命令行语法如下所示。这里面的很多选项和AVRASM都是相同的， 新的或是修改了的AVRASM2中的选项在下面用 粗体字 标明。

usage: avrasm2.exe [options] file.asm

 选项:
-f [O|M|I|G|E] 输出文件格式
-fO AVR Studio的仿真调试信息(默认)
-fM 摩托罗拉十六进制格式
-fI Intel十六进制格式
-fG Generic十六进制格式
-f- 无输出文件
-o ofile   把输出放置在'ofile'中
-d dfile   在AVR Studio里生成仿真调试信息放在'dfile'中，只能和-f [M|I|G]选项一起使用
-l lfile   在'lfile'中生成列表
-m mfile   在'mfile'中生成资源映射
-e efile   把 EEPROM 的内容放置在'efile'中
-w         允许在最大4K字的程序存储器中空间相对跳转[ignored]
-C ver     指明 AVR 内核版本
-c         大小写敏感
-1/-2      打开/关闭AVR汇编器1兼容模式
-I dir     预处理程序：添加'dir'到查找目录
-i file    预处理程序：明确预先包含的文件
-D name[=value] 预处理程序： 定义符号， 如果 =value被省去，则置1
-U name    预处理程序：取消定义符号
-v verbosity [0-9][s]:
-vs 包括目标资源的使用统计
-vl 输出低级汇编代码到标准输出设备
-v0 仅输出错误信息
-v1 输出错误和警告信息
-v2 输出错误、警告和其他信息(默认)
-v3-v9 未详细说明的，汇编器增加的内部存储数量
-O i|w|e 越界报告: 忽略|警告|错误 [error]
-W-b|+bo|+bi 字节操作码超出范围的警告 无效|溢出|整型
-W+ie|+iw  不支持的指令 错误|警告
-FD|Tfmt   __DATE__ | __TIME__ 格式，使用 strftime(3) 格式字符串

-w

一定范围的相对跳转。此选项已经不再使用，因为AVRASM2 能够自动决定什么时候基于程序存储器的大小在一定范围内相对跳转。此选项AVRASM2可以识别但是不再使用。

-C core-version

指明 AVR 内核版本。内核的版本core version通常是在定义文件部分(partdef.inc)指出的，此选项是为了测试汇编器， 一般不在用户终端使用。

-c

使汇编器对大小写敏感。预处理程序伪指令和宏定义对大小写都是敏感的。警告：此选项的设置会影响许多现有的工程。

-1
-2

打开和关闭AVRASM1兼容模式。默认为关闭模式 (-2)。兼容模式能够允许一些可能被认为错误的结构，减少了汇编程序时被打断的情况。还可以影响内置的包含路径，让汇编器1在目录 C:\Atmel\AVR Tools\AvrAssembler\Appnotes 查找器件包含文件(devicedef.inc) ，而不是在C:\Atmel\AVR Tools\AvrAssembler2\Appnotes中查找 (参看 XML Converter)。注意，新的器件可能不支持汇编器1。

-I directory

添加路径 directory 到包含文件的查找路径。它对预处理程序伪指令#include和汇编器伪指令.include 都会有影响。

可以使用多个-I directory 指定路径，此时程序会按照列表的顺序依次查找路径。

-i file

包含一个文件。 #include “file” 伪指令是在第一个源代码行之前进行处理的。可以使用多个-i 指令，程序会按顺序进行处理。

-D name[=value]
-U name

定义或取消定义一个预处理程序的宏。注意，函数类型预处理命令宏定义不能在命令行中进行。如果=value 被省去，则被置1。

-vs

输出对标准输出的寄存器、指令和存储器使用的统计。默认方式下，只能输出存储器的状态。注意：如果指定了其中一个，则通常完整的统计都会被输出到列表。

-vl

在所有符号信息被替换之后，可以输出标准输出的原始指令 。主要是为了汇编器调试所用。

-v0

仅输出错误信息，警告和其他信息被禁止。

-v1

仅输出错误和警告信息，其他信息被禁止。

-v2

输出错误、警告及其他信息。这是默认方式。

-v3 ... -v9

输出汇编器内部存储数量。大部分用在汇编器调试上。

-O i|w|e

如果使用.org 伪指令时，代码的不同部分映射到内存的相同地址，这时一般会产生一条出错信息。

此选项允许设置的条件引起错误(-Oe, 默认)、警告(-Ow)或忽略 (-Oi)。对一般的程序不推荐使用。

此设置也可以用 #pragma overlap 伪指令来实现。

-W-b |-W+bo | -W+bi

-b、+bo和 +bi 分别对应着输出所有警告、溢出警告或整型量超出范围警告。此设置也可以通过#pragma warning range来实现。

-W+ie|+iw

+ie 和 +iw 分别对应着对不支持指令给出错误和警告。其默认值是给出出错信息。分别和#pragma error 指令/ #pragma warning 指令类似。

-FDformat
-FTformat

分别指定 __DATE__ 和 __TIME__ 预设的宏定义 的格式。format字符串被传递给strftime(3) C的库函数。__DATE__ 和 __TIME__ 宏定义代表着这些字符串， 也就是说，他们的值将用双引号括起来。

其默认格式分别是 “%b %d %Y” 和 “%H:%M:%S”。

例如： 用 __DATE__指定 ISO 的格式：指定 -FD"%Y-%m-%d"  见下面的注释

这些格式只能造命令行中设置，而没有相对应的#pragma 伪指令。

重要提示： Windows 的命令解释程序 (cmd.exe 或 command.com) 被引用时，可以用符号'%' 解释开头和结尾一种特定的顺序，它可以随着范围扩大的变化而改变。 这可能会导致日期/时间格式字符串被命令解释程序改变，而不象预期的那样工作。一个工作在多种情况下的工作区应该使用两个'%' 符号来指定伪指令的格式， 例如： -FD"%%Y-%%m-%%d" 。这种命令解释程序的形式似乎有点矛盾，而这种变化依靠的是情况的多样性，举例来说，批处理模式和交互模式就是不同的。格式伪指令的效果应该被测试。下面给出了测试的源文件：

#message "__DATE__ =" __DATE__ "__TIME__ =" __TIME__

当程序进行汇编时，将会输出日期和时间宏定义的值，很容易测试出结果 (参见 #message 伪指令文件)。

为避免这个问题，指定格式的另一种方法将放在以后的AVRASM2 版本中。

一些与strftime() 格式相关的列表(详情参见 strftime(3) 手册页面)：

  • %Y - 年，4个阿拉伯数字

  • %y - 年，2个阿拉伯数字

  • %m - 月 数字(01-12)

  • %b - 月的缩写

  • %B - 月的全称

  • %d - 每个月的日期(01-31)

  • %a - 星期的缩写

  • %A - 星期的全称

  • %H - 小时，24小时制(00-23)

  • %I - 小时，12小时制(01-12)

  • %p - 12小时制的"上午" 或 "下午"

  • %M - 分钟(00-59)

  • %S - 秒 (00-59)


AVR 汇编器2 - 疑难解答

AVR 汇编器2 - 疑难解答与处理

下列AVRASM2所存在的漏洞和问题在发布的同时我们就知道到了。 请注意 AVRASM1 疑难解答与处理 并不适用于AVRASM2。

文件结尾无空行
宏调用时使用注释
自加/自减操作符
条件汇编中引用还未定义的符号
出错信息
预处理命令中的问题

文件结尾无空行

当源文件的结尾没有加一个空行时，AVRASM2 会出现一些问题：此时如果错误出现在被包含的文件的最后一行，出错信息中指出的文件名或行号可能会出错，还会导致一些语法错误。

注意 AVR Studio 编辑器不会在源程序结尾自动添加新的一行。

宏调用时使用注释

当C型注释(/* */, //)在汇编器宏调用的所在行使用时，会有一个已知的漏洞导致语法错误。

自加/自减 操作符

汇编器支持的自加/自减操作符(++/--)可能会导致令人惊讶的结果。 举例来说，如果你在程序中写出--1，该 符号--1 可能会引起语法错误。 这个漏洞同C预处理程序中的一致。

条件汇编中引用还未定义的符号

在条件汇编预处理命令中引用还未定义的符号，可能会导致错误，并且这是不允许的。例如：

.ifdef FOO
nop ; 一些 代码
.endif
rjmp label
; 一些代码
.equ FOO = 100
label:
nop

在上面的例子中 FOO 在使用条件汇编时还没有被定义，而且此程序的目标不明确。

下面这个例子似乎是合理的，但是会生成类似的错误：

.org LARGEBOOTSTART
; the following sets up RAMPZ:Z to point to a FLASH data object, typically
; for use with ELPM.
        ldi ZL, low (cmdtable * 2)
        ldi ZH, high (cmdtable * 2)
.if ((cmdtable * 2) > 65535)
        ldi r16, 1
        sts RAMPZ, r16
.endif
        ; more code follows here
cmdtable: .db "foo", 0x0

此错误产生的原因可能是条件汇编的结果会影响到前面的标号行的值，而它反过来又影响了条件汇编的结果。

一直到AVRASM 2.0.30版，这些导致不可理解的出错信息的情况才不再出现了， 并且从2.0.31版开始，给出了明确的出错信息。

注意，在使用条件汇编预处理命令(#if/#ifdef)时，预处理命令中使用的符号必须首先明确定义。在没有明确的定义前，其一直保持未定义状态，这样才会使这种类似的错误不再发生。

出错信息

有时的出错信息很难让人理解。非常典型的是，在某些情况下会产生一行简单的错误信息如下：

myfile.asm(30): error: syntax error, unexpected FOO

虽然引用的文件名和行号都是正确的，但是FOO让人觉得不知所云。

预处理命令中的问题

  • 预处理命令操作符##(concatenation)或#(stringifcation)仍然不能被支持。

  • 由于预处理命令不是独立的部分，而是包含在汇编器中的一个整体，因此可能会导致一些令人惊讶的结果。比如说：使用了条件汇编预处理命令对宏进行定义，一旦条件不满足，宏将不会被定义，但却在程序中使用了；条件汇编预处理命令不能跨越汇编器宏的开始和结束，等等。

  • 在错误的条件汇编里面，预处理命令不能检测到无效的预处理程序伪指令。这可能导致如下的结果：
    #if __ATmega8__
    //...
    #elseif __ATmega16__   //     错误，正确的伪指令应该是 #elif
     //     当if后面的条件不满足(即__ATmega8__为假)时,后面像#elseif这样的错误就不会被检测出来
    //...
    #else
    // 当if后面的条件不满足(即    __ATmega8__为假)时,即使 __ATmega16__ 为真,此部分仍然进行汇编
    #endif
    如果这是一个漏洞的话这是具争议的，因为这种情况和C预处理程序是相同的。

  • 如果预处理程序通过了在伪指令之后不正确的附加文本，可能会引起错误，例如：
    #endif #endif
    将会作为#endif伪指令被中断，而没有任何出错或警告信息。


XML Converter

XML转换器

  • 简介

  • 位置和启用

  • 例：创建一个汇编包含文件

  • 例：创建一个IAR编译器的头文件

  • 例：创建一个GCC编译器的头文件

  • 版本更新内容

简介

XML转换器是一个专用的命令行软件，用来按照AVR Studio的描述文件（XML）生成汇编包含文件和C头文件。

所有分布在AVR Assembler2中的汇编包含文件都是由这个工具生成的。这个工具除了用作生成“普通”（不用特殊编译器）的C文件外，还可以生成AVR GCC和IAR C的头文件。

目前AVR Studio还不支持XML转换器的图形化界面，必须使用命令行方式调用。

位置和启用

下面的内容是假定AVR Studio安装在默认路径的情况下来描述的。默认路径是：
C:\Program Files\Atmel\AVR Tools. 如果不是安装在这个路径下，请在下面的使用中调整相应的路径。

XML转换器的位置是在这里：

C:\Program Files\Atmel\AVR Tools\AvrStudio4\xmlconvert.exe

为了更方便的访问XML转换器，XML转换器的路径应该包含在PATH中。在控制面板中->系统属性中，可以将XML转换器的路径添加到PATH中，也可以使用下面的命令：

PATH = %PATH%;"C:\Program Files\Atmel\AVR Tools\AvrStudio4"

假定已经在适当的位置，可以在命令提示符下输入xmlconvert来访问XML转换器。如果调用正确，XMLconvert将会打印如下所示的用法消息：

xmlconvert: No source file specified
Usage: xmlconvert [-f output-format] [-o outdir] [-1nbclV] infile ...
Output formats: a[vrasm] | g[cc] | i[ar] | c[c] (generic c)
Options:
-1  = Don't generate AVRASM2 #pragma's
-n  = Don't warn about bad names
-b  = use DISPLAY_BITS attribute to limit bit definitions
-c  = Add some definitions for compatibility with old files
-l  = Produce linker file (IAR only)
-V  = print xmlconvert version number

AVR芯片描述文件（XML）位于：C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles路径下。每个芯片有一个文件。下面我们用一些简单的例子来描述XMLconvert的用法。

创建一个适用于mega128汇编包含文件

xmlconvert -c -o c:\Work\Tmp "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles\ATmega128.xml"

这条命令产生了一个适用于mega128的汇编包含文件，并输出在 C:\Work\Tmp路径下。如果-o参数被省略。输出文件将会被放在输入文件相同的路径下。

注意:如果产生的文件与存在的文件一致，就应该总是使用－C参数。

这条命令的输出文件将会是：C:\Work\Tmp\m128def.inc.

创建适用于所有的芯片的IAR C的头文件和连接文件

cd "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles"
xmlconvert -c -n -fiar -l -o C:\Work\tmp *.xml

当使用多个输入文件时，需要先cd到源文件（输入文件）所在的路径下。-fiar参数表明要产生IAR的输出文件，-l参数要求产生连接文件，-n参数压制一些警告信息。

注意: 产生的连接文件只是理论上的，有可能在适用之前还需要一些编辑，这就要看是什么芯片了。请参考IAR的用户手册来查找更详细的信息。

创建适用于所有芯片的AVR－GCC的头文件

cd "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles"
xmlconvert -c -n -fgcc -o C:\Work\tmp *.xml

这与上一个例子很相似，只是将-fiar参数改成了-fgcc 用来表明要输出gcc文件，并省略了对gcc无意义的-l 参数。

更新内容

版本 2.17,与AVR Studio 4.11 SP1一起发布

  • 删除了不带EEPROM芯片的输出文件中的伪EEADRBITS

  • 添加了对tiny28低层的中断向量的支持

  • 添加了理论上对32-位的寄存器四元组的支持。(-q 参数).

  • 修正了如果输入文件的大小写失配时输出错误文件名。