一个avr单片机的汇编程序,注意几个宏指令
第二章 AVR系列单片机的结构、时序及指令系统
• • Bit 7 – I: 全局中断使能 • I 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。 如果I 清零,则不论单独中断标志置位与否,都不会产生中断。任意一个 中断发生后I 清零,而执行RETI指令后I 恢复置位以使能中断。I 也可以通 过SEI 和CLI 指令来置位和清零。 • • Bit 6 – T: 位拷贝存储 • 位拷贝指令BLD 和BST 利用T 作为目的或源地址。BST 把寄存器的某一 位拷贝到T,而BLD 把T 拷贝到寄存器的某一位。 • • Bit 5 – H: 半进位标志 • 半进位标志H 表示算术操作发生了半进位。此标志对于BCD 运算非常有 用。 • • Bit 4 – S: 符号位, S = N ⊕ V • S 为负数标志N 与2 的补码溢出标志V 的异或。 • • Bit 3 – V: 2 的补码溢出标志 • 支持2 的补码运算。 • • Bit 2 – N: 负数标志 • 表明算术或逻辑操作结果为负。 • • Bit 1 – Z: 零标志 • 表明算术或逻辑操作结果为零。 • • Bit 0 – C: 进位标志 • 表明算术或逻辑操作发生了进(1)运算逻辑单元 )运算逻辑单元ALU • 顾名思义,运算逻辑单元ALU 的作用是进行运算,包括算 术运算和逻辑运算。AVR ALU 与32 个通用工作寄存器直 接相连。寄存器与寄存器之间、寄存器与立即数之间的 ALU 运算只需要一个时钟周期。ALU 操作分为3 类:算 术、逻辑和位操作。此外还提供了支持无/ 有符号数和分 数乘法的乘法器,一次乘法操作的时间为2个指令周期, 而51系列单片机里面,做一次乘法运算需要4个指令周期。 • (2)状态寄存器 ) • 状态寄存器包含了最近执行的算术指令的结果信息。这些 信息可以用来改变程序流程以实现条件操作(如表2-1所 示)。如指令集所述,所有ALU 运算都将影响状态寄存器 的内容。这样,在许多情况下就不需要专门的比较指令了, 从而使系统运行更快速,代码效率更高。在进入中断服务 程序时状态寄存器不会自动保存,中断返回时也不会自动 恢复。这些工作需要软件来处理。
avr单片机指令集
avr单片机指令集AVR单片机指令集指令集概述指令,操作数,说明,操作标志# ,时钟数算数和逻辑指令ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd ? Rr Z,N,V 1ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd ? K Z,N,V 1OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1COM Rd 1 的补码Rd ← 0xFF ? Rd Z,C,N,V 1NEG Rd 2 的补码Rd ← 0x00 ? Rd Z,C,N,V,H 1SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1CBR Rd,K 寄存器位清零Rd ← Rd ? (0xFF - K) Z,N,V 1INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1DEC Rd 减一操作Rd ← Rd ? 1 Z,N,V 1TST Rd 测试是否为零或负Rd ← Rd ? Rd Z,N,V 1CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1SER Rd 寄存器置位Rd ← 0xFF None 1MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2MULSU Rd, Rr 有符号数与无符号数乘法R1:R0 ← Rd x Rr Z,C 2 FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2跳转指令RJMP k 相对跳转PC ← PC + k + 1 无2IJMP 间接跳转到(Z) PC ← Z 无2RCALL k 相对子程序调用PC ← PC + k + 1 无3ICALL 间接调用(Z) PC ← Z 无3RET 子程序返回PC ← STACK 无4RETI 中断返回PC ← STACK I 4CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr) PC ← PC + 2 or 3 无1 /2 / 3CP Rd,Rr 比较Rd ? Rr Z, N,V,C,H 1CPC Rd,Rr 带进位比较Rd ? Rr ? C Z, N,V,C,H 1CPI Rd,K 与立即数比较Rd ? K Z, N,V,C,H 1SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令if (P(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s) = 1) then PC←PC+k + 1 无1 / 2BRBC s, k 状态寄存器位为"0” 则跳过下一条指令if (SREG(s) =0) then PC←PC+k + 1 无1 / 2BREQ k 相等则跳转if (Z = 1) then PC ← PC + k + 1 无1 / 2BRNE k 不相等则跳转if (Z = 0) then PC ← PC + k + 1 无1 / 2 BRCS k 进位位为"1” 则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2 BRCC k 进位位为"0” 则跳转if (C = 0) then PC ← PC + k + 1 无1 / 2 BRSH k 大于或等于则跳转if (C = 0) then PC ← PC + k + 1 无1 / 2 BRLO k 小于则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2BRMI k 负则跳转if (N = 1) then PC ← PC + k + 1 无1 / 2BRPL k 正则跳转if (N = 0) then PC ← PC + k + 1 无1 / 2BRGE k 有符号数大于或等于则跳转if (N ⊕ V= 0) then PC ← PC + k + 1 无1 / 2BRLT k 有符号数负则跳转if (N ⊕ V= 1) then PC ← PC + k + 1 无1 / 2 BRHS k 半进位位为"1” 则跳转if (H = 1) then PC ← PC + k + 1 无1 / 2 BRHC k 半进位位为"0” 则跳转if (H = 0) then PC ← PC + k + 1 无1 / 2 BRTS k T 为"1” 则跳转if (T = 1) then PC ← PC + k + 1 无1 / 2 BRTC k T 为"0” 则跳转if (T = 0) then PC ← PC + k + 1 无1 / 2 BRVS k 溢出标志为"1” 则跳转if (V = 1) then PC ← PC + k + 1 无1 / 2 BRVC k 溢出标志为"0” 则跳转if (V = 0) then PC ← PC + k + 1 无1 / 2 274 ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数BRIE k 中断使能再跳转if ( I = 1) then PC ← PC + k + 1 无1 / 2 BRID k 中断禁用再跳转if ( I = 0) then PC ← PC + k + 1 无1 / 2数据传送指令MOV Rd, Rr 寄存器间复制Rd ← Rr 无1MOVW Rd, Rr 复制寄存器字Rd+1:Rd ← Rr+1:Rr 无1LDI Rd, K 加载立即数Rd ← K 无1LD Rd, X 加载间接寻址数据Rd ← (X) 无2LD Rd, X+ 加载间接寻址数据,然后地址加一Rd ← (X), X ← X + 1 无2 LD Rd, - X 地址减一后加载间接寻址数据X ← X - 1, Rd ← (X) 无2LD Rd, Y 加载间接寻址数据Rd ← (Y) 无2LD Rd, Y+ 加载间接寻址数据,然后地址加一Rd ← (Y), Y ← Y + 1 无2 LD Rd, - Y 地址减一后加载间接寻址数据Y ← Y - 1, Rd ← (Y) 无2LDD Rd,Y+q 加载带偏移量的间接寻址数据Rd ← (Y + q) 无2LD Rd, Z 加载间接寻址数据Rd ← (Z) 无2LD Rd, Z+ 加载间接寻址数据,然后地址加一Rd ← (Z), Z ← Z+1 无2LD Rd, -Z 地址减一后加载间接寻址数据Z ← Z - 1, Rd ← (Z) 无2LDD Rd, Z+q 加载带偏移量的间接寻址数据Rd ← (Z + q) 无2 LDS Rd, k 从SRAM 加载数据Rd ← (k) 无2ST X, Rr 以间接寻址方式存储数据(X) ← Rr 无2ST X+, Rr 以间接寻址方式存储数据,然后地址加一(X) ← Rr, X ← X + 1 无2ST - X, Rr 地址减一后以间接寻址方式存储数据X ← X - 1, (X) ← Rr 无2 ST Y, Rr 加载间接寻址数据(Y) ← Rr 无2ST Y+, Rr 加载间接寻址数据,然后地址加一(Y) ← Rr, Y ← Y + 1 无2ST - Y, Rr 地址减一后加载间接寻址数据Y ← Y - 1, (Y) ← Rr 无2 STD Y+q,Rr 加载带偏移量的间接寻址数据(Y + q) ← Rr 无2ST Z, Rr 加载间接寻址数据(Z) ← Rr 无2ST Z+, Rr 加载间接寻址数据,然后地址加一(Z) ← Rr, Z ← Z + 1 无2ST -Z, Rr 地址减一后加载间接寻址数据Z ← Z - 1, (Z) ← Rr无2 STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q) ← Rr 无2STS k, Rr 从SRAM 加载数据(k) ← Rr 无2LPM 加载程序空间的数据R0 ← (Z) 无3LPM Rd, Z 加载程序空间的数据Rd ← (Z) 无3LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z), Z ← Z+1 无3 SPM 保存程序空间的数据(Z) ← R1:R0 无-IN Rd, P 从I/O 端口读数据Rd ← P 无1OUT P, Rr 输出端口P ← R r 无1PUSH Rr 将寄存器推入堆栈STACK ← Rr 无2POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无2位和位测试指令SBI P,b I/O 寄存器位置位I/O(P,b) ← 1 无2CBI P,b I/O 寄存器位清零I/O(P,b) ← 0 无2LSL Rd 逻辑左移Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V 1LSR Rd 逻辑右移Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1ROL Rd 带进位循环左移Rd(0)←C,Rd(n+1)← Rd(n),C←Rd(7) Z,C,N,V 1ROR Rd 带进位循环右移Rd(7)←C,Rd(n)← Rd(n+1),C←Rd(0) Z,C,N,V 1 ASR Rd 算术右移Rd(n) ← Rd(n+1), n=0..6 Z,C,N,V 1 SWAP Rd 高低半字节交换Rd(3..0)←Rd(7..4),Rd(7..4)←Rd(3..0) 无1 BSET s 标志置位SREG(s) ← 1 SREG(s) 1BCLR s 标志清零SREG(s) ← 0 SREG(s) 1BST Rr, b 从寄存器将位赋给T T ← Rr(b) T 1 BLD Rd, b 将T 赋给寄存器位Rd(b) ← T 无1 SEC 进位位置位C ← 1 C 1CLC 进位位清零C ← 0 C 1SEN 负标志位置位N ← 1 N 1CLN 负标志位清零N ← 0 N 1SEZ 零标志位置位Z ← 1 Z 1CLZ 零标志位清零Z ← 0 Z 1SEI 全局中断使能I ← 1 I 1CLI 全局中断禁用I ← 0 I 1SES 符号测试标志位置位S ← 1 S 1CLS 符号测试标志位清零S ← 0 S 1SEV 2 的补码溢出标志置位V ← 1 V 1CLV 2 的补码溢出标志清零V ← 0 V 1SET SREG 的T 置位T ← 1 T 1指令集概述275ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数CLT SREG 的T 清零T ← 0 T 1SEH SREG 的半进位标志置位H ← 1 H 1CLH SREG 的半进位标志清零H ← 0 H 1MCU 控制指令NOP 空操作无1SLEEP 休眠( 见对睡眠功能的特殊说明) 无1WDR 复位看门狗( 见对WDR/timer 的特殊说明) 无1。
AVRmega8汇编指令汇总.
指令集概述指令操作数说明操作标志 # 时钟数算数和逻辑指令ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2 SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd • Rr Z,N,V 1ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd • K Z,N,V 1OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1COM Rd 1 的补码Rd ← 0xFF − Rd Z,C,N,V 1NEG Rd 2 的补码Rd ← 0x00 − Rd Z,C,N,V,H 1SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1CBR Rd,K 寄存器位清零Rd ← Rd • (0xFF - K Z,N,V 1INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1DEC Rd 减一操作Rd ← Rd − 1 Z,N,V 1TST Rd 测试是否为零或负Rd ← Rd • Rd Z,N,V 1CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1SER Rd 寄存器置位Rd ← 0xFF None 1MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2MULSU Rd, Rr 有符号数与无符号数乘法 R1:R0 ← Rd x Rr Z,C 2FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2跳转指令RJMP k 相对跳转PC ← PC + k + 1 无 2IJMP 间接跳转到(Z PC ← Z 无 2RCALL k 相对子程序调用PC ← PC + k + 1 无 3ICALL 间接调用(Z PC ← Z 无 3RET 子程序返回PC ← STACK 无 4RETI 中断返回PC ← STACK I 4CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr PC ← PC + 2 or 3 无 1 / 2 / 3CP Rd,Rr 比较Rd − Rr Z, N,V,C,H 1CPC Rd,Rr 带进位比较Rd − Rr − C Z, N,V,C,H 1CPI Rd,K 与立即数比较Rd − K Z, N,V,C,H 1SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b=1 PC ← PC + 2 or 3 无1 / 2 / 3 SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令 if (P(b=1 PC ← PC + 2 or 3 无 1 / 2 / 3BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s = 1 then PC←PC+k + 1 无 1 / 2 BRBC s, k 状态寄存器位为"0” 则跳过下一条指令 if (SREG(s = 0 then PC← PC+k + 1 无 1 / 2 BREQ k 相等则跳转if (Z = 1 then PC ← PC + k + 1 无 1 / 2BRNE k 不相等则跳转 if (Z = 0 then P C ← PC + k + 1 无 1 / 2BRCS k 进位位为"1” 则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRCC k 进位位为"0” 则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRSH k 大于或等于则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRLO k 小于则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRMI k 负则跳转if (N = 1 then PC ← PC + k + 1 无 1 / 2BRPL k 正则跳转if (N = 0 then PC ← PC + k + 1 无 1 / 2BRGE k 有符号数大于或等于则跳转 if (N ⊕ V= 0 then PC ← PC + k + 1 无 1 / 2 BRLT k 有符号数负则跳转 if (N ⊕ V= 1 then PC ← PC + k + 1 无 1 / 2BRHS k 半进位位为"1” 则跳转if (H = 1 then PC ← PC + k + 1 无 1 / 2BRHC k 半进位位为"0” 则跳转if (H = 0 then PC ← PC + k + 1 无 1 / 2BRTS k T 为"1” 则跳转if (T = 1 then PC ← PC + k + 1 无 1 / 2BRTC k T 为"0” 则跳转if (T = 0 then PC ← PC + k + 1 无 1 / 2BRVS k 溢出标志为"1” 则跳转if (V = 1 then PC ← PC + k + 1 无 1 / 2BRVC k 溢出标志为"0” 则跳转if (V = 0 then PC ← PC + k + 1 无 1 / 2← Z - 1, (Z ← Rr 无 2STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q ← Rr 无 2STS k, Rr 从 SRAM 加载数据(k ← Rr 无 2LPM 加载程序空间的数据R0 ← (Z 无 3LPM Rd, Z 加载程序空间的数据Rd ← (Z 无 3LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z, Z ← Z+1 无 3SPM 保存程序空间的数据(Z ← R1:R0 无 -IN Rd, P 从 I/O 端口读数据Rd ← P 无 1OUT P, Rr 输出端口P ← Rr 无 1PUSH Rr 将寄存器推入堆栈STACK ← Rr 无 2POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无 2位和位测试指令SBI P,b I/O 寄存器位置位I/O(P,b ← 1 无 2CBI P,b I/O 寄存器位清零I/O(P,b ← 0 无 2LSL Rd 逻辑左移Rd(n+1 ← Rd(n, Rd(0 ← 0 Z,C,N,V 1LSR Rd 逻辑右移Rd(n ← Rd(n+1, Rd(7 ← 0 Z,C,N,V 1ROL Rd 带进位循环左移Rd(0← C,Rd(n+1← Rd(n,C← Rd(7 Z,C,N,V 1 ROR Rd 带进位循环右移Rd(7← C,Rd(n← Rd(n+1,C← Rd(0 Z,C,N,V 1 ASR Rd 算术右移Rd(n ← Rd(n+1, n=0..6 Z,C,N,V 1SWAP Rd 高低半字节交换Rd(3..0← Rd(7..4,Rd(7..4← Rd(3..0 无 1 BSET s 标志置位SREG(s ← 1 SREG(s 1BCLR s 标志清零SREG(s ← 0 SREG(s 1BST Rr, b 从寄存器将位赋给T T ← Rr(b T 1BLD Rd, b 将 T 赋给寄存器位Rd(b ← T 无 1SEC 进位位置位C ← 1 C 1CLC 进位位清零C ← 0 C 1SEN 负标志位置位N ← 1 N 1CLN 负标志位清零N ← 0 N 1SEZ 零标志位置位Z ← 1 Z 1CLZ 零标志位清零Z ← 0 Z 1SEI 全局中断使能I ← 1 I 1CLI 全局中断禁用I ← 0 I 1SES 符号测试标志位置位S ← 1 S 1CLS 符号测试标志位清零S ← 0 S 1SEV 2 的补码溢出标志置位V ← 1 V 1CLV 2 的补码溢出标志清零V ← 0 V 1SET SREG 的 T 置位T ← 1 T 1CLT SREG 的 T 清零T ← 0 T 1SEH SREG 的半进位标志置位H ← 1 H 1CLH SREG 的半进位标志清零H ← 0 H 1MCU 控制指令NOP 空操作无 1SLEEP 休眠 ( 见对睡眠功能的特殊说明无 1WDR 复位看门狗 ( 见对 WDR/timer 的特殊说明无 1。
AVR汇编指令集
算术和逻辑指令•ADD 加法•ADC 带进位加•ADIW 加立即数•SUB 减法•SUBI 减立即数•SBC 带进位减•SBCI 带C 减立即数•SBIW 减立即数•AND 与•ANDI 与立即数•OR 或•ORI 或立即数•EOR 异或•COM 取反•NEG 取补•SBR 寄存器位置位•CBR 寄存器位清零•INC 加1•DEC 减1•TST 测试零或负•CLR 寄存器清零•SER 寄存器置FF•MUL 乘法•MULS 有符号数乘法•MULSU 有(无)符号数乘法•FMUL 小数乘法•FMULS 有符号数乘法•FMULSU 有(无)符号小数乘法条件转移指令•RJMP 相对转移•IJMP 间接转移•JMP 长转移•RCALL 相对调用•ICALL 间接调用•CALL 长调用•RET 子程序返回•RETI 中断返回•CPSE 比较相等跳行•CP 比较•CPC 带进位比较•CPI 带立即数比较•SBRC 位清零跳行•SBRS 位置位跳行•SBIC I/O 位清零跳行•SBIS I/O 位置位跳行•BRBS SREG 位置位转•BRBC SREG 位清零转•BREQ 相等转移•BRNE 不相等转移•BRCS C 置位转•ELPM 扩展装载程序存储器•EIJMP 扩展间接跳转•ESPM 扩展存储程序存储器•EICALL延长间接调用子程序•BRCC C 清零转•BRSH 转•BRLO 小于转(无符号)•BRMI 负数转移•BRPL 正数转移•BRGE 转(带符号)•BRLT 小于转(带符号)•BRHS H 置位转移•BRHC H 清零转移•BRTS T 置位转移•BRTC T 清零转移•BRVS V 置位转移•BRVC V 清零转移•BRIE 中断位置位转移•BRID 中断位清零转移数据传送指令•MOV 寄存器传送•MOVW 拷贝寄存器字•LDI 装入立即数•LD X X 间接取数•LD X+ X 间接取数后•LD -X X 间接取数先•LD Y Y 间接取数•LD Y+ Y 间接取数后+•LD –Y Y 间接取数先•LDD Yq Y 间接取数 q•LD Z Z 间接取数•LD Z+ Z 间接取数后•LD –Z Z 间接取数先•LDD Zq Z 间接取数 q•LDS 从SRAM 装入•ST X X 间接存数•ST X+ X 间接存数后•ST –X X 间接存数先•ST Y Y 间接存数•ST Y+ Y 间接存数后•ST –Y Y 间接存数先•STD Yq Y 间接存数 q•ST Z Z 间接存数•ST Z+ Z 间接存数后•ST –Z Z 间接存数先•STD Zq Z 间接存数 q•STS 数据送SRAM•LPM 装程序存储器•LPM Z Z•LPM Z+ Z+•SPM 存储程序存储器•IN I/O 口输入•OUT 送I/O 口•PUSH 压栈•POP 出栈位指令和位测试指令•SBI 置位I/O 位•CBI 清零I/O 位•LSL 左移•LSR 右移•ROL 带进位左循环•ROR 带进位右循环•ASR 算术右移•SWAP 半字节交换•BSET 置位SREG•BCLR 清零SREG•BST Rr 的b 位送T•BLD T 送Rr 的b 位•SEC 置位C•CLC 清零C•SEN 置位N•CLN 清零N•SEZ 置位Z•CLZ 清零Z•SEI 置位I•CLI 清零I•SES 置位S•CLS 清零S•SEV 置位V•CLV 清零V•SET 置位T•CLT 清零T•SEH 置位H•CLH 清零H•NOP 空操作•SLEEP 休眠•WDR 看门狗复位90 条指令器件:Attiny11/12/15/2289 条指令器件:AT90S1200118 条指令器件:AT90S2313/2323/2343/2333 AT90S4414/4433/4434/8515 AT90S8534/8535 121 条指令器件:ATmega603/103130 条指令器件:ATmega161。
AVR指令表
(-2K 28KB)(-2K 28KB) 执行同功能的程序 8MHzAVR 224MHz C5不再有作废的产品; 不需要5分钟的紫外线擦除时间;再也用不着因为掩模而无法入睡了;没有10周订货交货时间; 添加新特性易如反掌;容易调试;容易在线升级,几秒钟搞定;AVR指令表2000/5耿德根编数据传送指令位指令和位测试指令MOV Rd,Rr寄存器拷贝LSL Rd逻辑左移LDI Rd,K装入立即数LSR Rd逻辑右移LDS Rd,K直接从SRAM装入ROL Rd通过进位左循环LD Rd,X X变址间接装入R ROR Rd通过进位右循环LD Rd,X+X变址ASR Rd算术右移LD Rd,-X X变址SWAP s半字节交换LD Rd,Y Y变址BSET s置状态寄存器的位LD Rd,Y+Y变址BCLR s SREG中的位清除LD Rd,-Y Y变址SBI P,b置I/O寄存器的位LDD Rd,Y+q Y变址间接装入R CBI P,b清I/O寄存器的位LD Rd,Z Z变址BST Rr,b R中位到SREG中T标志LD Rd,Z+Z变址BLD Rd,b SREG中T标志到R某位LD Rd,-Z Z变址SEC置位进位标志LDD Rd,Z+q Z变址CLC清除进位标志STS K,Rr R数据直接送SRAM SEN置位负数标志ST X,Rr X变址间接装入SRAM CLN清除负数标志ST X+,Rr X变址SEZ置位零标志ST-X,Rr X变址CLZ清零标志位ST Y,Rr Y变址SEI置位全局中断标志ST Y+,Rr Y变址CLI清除全局中断标志ST-Y,Rr Y变址SES置位符号标志STD Y+q,Rr变址间接装入SRAM CLS清除符号标志ST Z,Rr Z变址SEV置位溢出标志位ST Z+,Rr Z变址CLV清除溢出标志ST-Z,Rr Z变址SET置位T标志STD Z+q,Rr Z变址CLT清除T标志LPM装入程序存储器SEH置位半进位标志IN Rd,P I/O口数据装入到R CLH清除半进位标志OUT P,Rr寄存器数据送I/O口NOP空操作PUSH Rr压寄存器到堆栈SLEEP休眠POP Rd堆栈弹出到寄存器WDR看门狗复位汇编器伪指令(伪指令前必须加“ ..” ).BYTE-- 保存寄节到变量.CSEG-- 代码段.DB-- 字节常数.EXIT-- 退出文件.DEF-- 设置寄存器的符号名.INCLUDE--包括号外的文件.DEVICE--定义被汇编的器件.LIST-- 打开列表文件生成器.DSEG-- 数据段.LISTMAC--打开宏表达式.DW-- 字常数.MACR O-- 宏开始.ENDMACRO--宏结束.NOLIST-- 关闭列表文件生成器.EQU-- 设置符号相等于一个表达式.ORG-- 设置程序起始位置.ESEG-- EPROM段.SET-- 设置一个与表达式相等的符号A VR ICE200在线仿真器双龙电子为中国大陆总代理ICE200可仿真的器件为A T90S1200/2313/2333/4433/4414/8515/4434/8535及A Ttiny10/11/12由于仿真器的电源不对外所以ICE200也支持低电压器件A T90S I/O空间定义十六进制地址名称AT90SMEG103名称AT90S1200名称AT90S8515功能(对应8515名称,*为对应MEG103)$3F($5F)SREG SREG SREG状态寄存器$3E($5E)SPH SPH堆栈指针高$3D($5D)SPL SPL堆栈指针低$3C($5C)XDIV XTAL分频控制器 *$3B($5B)RAMPZ GIMSK GIMSK通用中断屏蔽寄存器$3A($5A)EICR GIFR通用中断标态寄存器$39($59)EIMSK TIMSK TIMSK定时器/计数器中断屏敝寄存器$38($58)EIFR TIFR TIFR定时器/计数器中断标志寄存器$37($57)TIMSK定时器/计数器中断屏敝寄存器 * $36($56)TIFR定时器/计数器中断标志寄存器 * $35($55)MCUCR MCUCR MCUCR MCU通用控制寄存器$34($54)MCUSR MCU通用控制寄存器 *$33($53)TCCR0TCCR0TCCR0定时器/计数器0控制寄存器$32($52)TCNT0TCNT0TCNT0定时器/计数器0(8位)$31($51)OCR0定时器/计数器0输出比较寄存器 * $30($50)ASSR异步方式状态寄存器 *$2F($4F)TCCR1A TCCR1A定时器/计数器1控制寄存器A$2E($4E)TCCR1B TCCR1B定时器/计数器1控制寄存器B$2D($4D)TCNT1H TCNT1H定时器/计数器1高字节$2C($4C)TCNT1L TCNT1L定时器/计数器1低字节$2B($4B)OCR1AH OCR1AH定时器/计数器1输出比较寄存器A高字节$2A($4A)OCR1AL OCR1AL定时器/计数器1输出比较寄存器A低字节$29($49)OCR1BH OCR1BH定时器/计数器1输出比较寄存器B高字节$28($48)OCR1BL OCR1BL定时器/计数器1输出比较寄存器B低字节$27($47)ICR1H定时器/计数器1输入捕获寄存器高字节 * $26($46)ICR1L定时器/计数器1输入捕获寄存器低字节 * $25($45)TCCR2ICR1H T/C1输入捕获寄存器高字节$24($44)TCNT2ICR1L T/C1输入捕获寄存器低字节$23($43)OCR2定时器/计数器2输出比较寄存器 * $22($42)$21($41)WDTCR WDTCR WDTCR看门狗定时控制寄存器$20($40)$1F($3F)EEARH EEARH EPROM地址寄存器高字节$1E($3E)EEARL EEAR EEARL EPROM地址寄存器低字节$1D($3D)EEDR EEDR EEDR EPROM数据寄存器$1C($3C)EECR EECR EECR EPROM控制寄存器$1B($3B)PORTA PORTA A口数据寄存器$1A($3A)DDRA DDRA A口数据方向寄存器$19($39)PINA PINA A口输入脚$18($38)PORTB PORTB PORTB B口数据寄存器$17($37)DDRB DDRB DDRB B口数据方向寄存器$16($36)PINB PINB PINB B口输入脚$15($35)PORTC PORTC C口数据寄存器$14($34)ODRC C口数据方向寄存器$13($33)PINC C口输入脚$12($32)P0RTD PORTD PORTD D口数据寄存器$11($31)DDRD DDRD DDRD D口数据方向寄存器$10($30)PIND PIND PIND D口输入脚$0F($2F)SPOR SPOR SPI I/O数据寄存器$0E($2E)SPSR SPSR SPI状态寄存器$0D($2D)SPCR SPCR SPI控制寄存器$0C($2C)UDR UDR UART I/O数据寄存器$0B($2B)USR USR UART状态寄存器$0A($2A)UCR UCR UART控制寄存器$09($29)UBRR UBRR UART波特率寄存器$08($28)ACSR ACSR ACSR模拟比较控制和状态寄存器$07($27)ADMUX ADC多路选择寄存器 *$06($26)ADCSR ADC状态和控制寄存器 *$05($25)ADCH ADC数据寄存器高 *$04($24)ADCL ADC数据寄存器低 *$03($23)PORIE E口数据寄存器 *$02($22)DDRE E口数据方向寄存器 *$01($21)PINE E口输入脚 *$00($20)PINF F口输入脚 *复位和中断向量向量号程序地址源源中断定义1$000/RESET/RESET硬件脚和看门狗复位2$001INT0INT0外部中断请求03$002INT1INT1外部中断请求14$003TIMER1 CAPT TIMER1 CAPT定时器/计数器1捕获事件5$004TIMER1 COMPA TIMER1 COMPA定时器/计数器1比较匹配A6$005TIMER1 COMPB TIMER1 COMPB定时器/计数器1比较匹配B7$006TIMER1 OVF TIMER1 OVF定时器/计数器1溢出8$007TIMER0 OVF TIMER0 OVF定时器/计数器0溢出9$008SPI,STC SPI,STC串行传送完成10$009UART,RX UART,RX UART,RX完成11$00A UART,UDRE UART,UDRE UART数据寄存器空12$00B UART,TX UART,TX UART,TX完成13$00C ANA_COMP ANA_COMP模拟比较器OK-AVR万用串行下载开发实验板OK-AVR万用串行下载开发实验板,采用双龙电子公司的专利技术(专利号:98226094.6),是为ATMEL公司的AVR单片机特别研制的廉价的万用串行下载开发实验工具该板适用于ATMEL公司所有具有串行下载功能的AVR单片机,同时还可做AVR单片机的I/O口A/D D/A音频输出等实验本公司随机提供了ATMEL的集成模拟仿真调试软件,对初学AVR 单片机的设计者,可暂时节省购买较昂贵的实时仿真器及万用编程器的费用; OK-AVR万用串行下载开发实验板有CZ1电源及通讯下载用插座,LED电源指示,下载通讯工作指示;附AVR单片机8根下载信号线; AVR单片机四种DIP封装器件下载锁紧插座;WR划线电位器可作为模拟信号输入用,有音响器,另有用户器件扩展区,焊接你实验需要的器件;AVR集成软件包包括: AVR Assembler 1.30编译器; AVR Studio 3.00; AVR Prog;送一片AT90S1200单片机及集成软件AVR单片机数据资料OK-AVR下载开发实验板使用说明等光盘AVR单片机可下载器件:90S120090S231390S2323/90LS232390S2343/90LS234390S2333/90LS233390S4433/90LS443390S441490LS851590S4434/90LS443490S8535/90LS853590S8555ATtiny10/11/12/15MEGA103/603/161/163(适用所有串行下载信号线的AVR单片机)。
AVR 软件延时宏(汇编)
.IF (@0==9)
RCALL DL_9
.ENDIF
.IF (@0==10)
RCALL DL_10
.ENDIF
.IF (@0==11)
RCALL DL_11
.ENDIF
.IF (@0==12)
RCALL DL_12
.ENDIF
.IF (@0==13)
;0B01000001-8T 1+5
;0B01111111-194 5+63*3
.MACRO DL6_194
; DL194: ;(10--+3),(11--+3),(00--+4),(01--+5)
SBRC @0,7
RJMP pc+3
SBRC @0,6
RJMP PC+1
.IF (@0==32)
RCALL DL_32
.ENDIF
.IF (@0==33)
RCALL DL_33
.ENDIF
.IF (@0==34)
RCALL DL_34
.ENDIF
.IF (@0==35)
RCALL DL_35
.ENDIF
.IF (@0>35)
LDI DL_TEMP,((@0-7)/3)
;======================================================================
;======================================================================
;DL0 (0<@0≤767);@0=0不操作;仅当@0>5使用TEMP0
AVR单片机C语言编程
}
2021/1/28
6
机电系统控制电路设计
1 C语言基础
关于编译预处理(宏定义)
❖ #define PI 3.14159 ---不带参数 #define S(a,b) a*b---带参数 ❖ #define — 宏定义命令 ❖ PI — 符号常量(宏名,最好用大写,以区别一般变量) ❖ 3.14159 —宏体(可以是一个表达式,如3+4) ❖ 作用:用简单符号代表宏体部份内容(编译时会先自动替换) ❖ 意义:直观/多次使用/便于修改 ❖ 注意: #define 可出现在程序的任一位置
#include <math.h>
/*编译预处理——文件包含*/
main( )
/*主函数*/
{
float r,s;
/*定义变量r、s类型为单精度实型*/
r =1.0;
/*变量r赋初值*/
s=PI * pow(r,2);
/*计算圆面积s*/
printf ("半径R=%f 时,面积S=%f \n",r,s); /*输出结果*/
执行部份:输入、赋值、计算、控制、输出等:
r=1.0;
/*变量r赋初值*/
s=PI*pow(r,2);
/*计算圆面积s*/
printf("半径R=%f 时,面积S=%f \n",r,s); /*输出结果*/
2021/1/28
11
机电系统控制电路设计
1 C语言基础
其他函数
❖ 标准库函数——只能调用 。使用方法: ⒈先“包含”,即将该函数所在头文件包含在程序中。 例: #include <stdio.h> ⒉后调#用in。clu调de用<方m式at:h.h函>数名(参数) main( ) { …… s=PI*pow(r,2); …… printf(“半径R=%f 时,面积S=%f\n”,r,s); } 说明:pow(x,y) 求xy (math.h中的标准数学函数) printf(……); (stdio.h中的标准输出函数)
ICCAVR 汇编参考
ICCAVR 汇编参考一. 名称1.1所有汇编名称必须由下列字符组成( …_‟ | [a-z] ) [ [a-z] | [0-9] | …_‟ ] *1.2在ICC 中汇编名称必须由下划线或字母开始,随后跟字母数字或下划线组成.1.3在这个文档中名称和符号是同名词名称,可以是表示一个常数值的符号名称或代表某一个地址的标号名称中的任意一个.1.4一个名称的长度最多为30 个字符长而且区分大小写,汇编指令和汇编伪指令除外1.5符号可以只用在程序模块中, 也可显式地被其它模块使用,在以前的例子中符号表示局部符号,而在以后的例子中表示全局符号1.6如果在一个文件一个符号没有被定义而直接使用了,那么它是被假设为在其它文件已经定义,而且它的值由链接器决定二. 数1.如果数带有一个0x 或$前坠那么这个数是一个十六进制数例如: 100x10$100xBAD0xBEEF0xC0DE-20三. 汇编文件格式汇编文件必须是一个ASCII纯文本文件,而且要遵守一定的规则文件的每一行应该是如下的格式[label: [:]] [command] [operands] [;comments]label 表示标号一个冒号表示局部符号两个符号表示全局符号command 表示操作码指令码operands 表示操作数[ ] 表示为可选项comments 表示注释注意在C 文件中注释用/ /或/* …. */ 引导而在汇编文件中用分号或// 引导上式的每项之间必须用一个或多个空格分开系统汇编时对注释部分不进行处理四. 标号1.一个后面跟着一个或两个冒号的名称表示标号.2.标号的值是程序中某一点的PC 计数器的值3.一个标号带两个符号表示全局符号,它在其它模块中也是显式的4.操作码应该是AVR 指令5.伪指令或宏操作数是指指令所需要的参数五. 4 表达式1.在指令后的操作数可以是表达式2.例如直接地址是一个最简单的表达式lds R10,asymbolasymbol 是一个简单表达式有例子它是一个符号或标号名称通常一个表达式描述为expr: term |{ expr }unop exprexpr binop exprterm: . 当前程序计数器PC 值name |#name3.圆括号用于分组其运算优先级高于运算符表达式,不能随意使用,有一个限制是使用链接器的重定位信息表达式的基本规则,是它只能出现一个重定位符号4.例如lds R10,foo+bar如果foo 和bar 两个全都是外部符号那么表达式无效六. 运算符下面列出了各种运算符和它们的优先级,运算符的优先级是很有用的只有加号可以用于重定位符号计算, 比如外部符号其它所有运算符必须用于常数或本文件中定义的符号的运算运算符功能类型优先级乘法二进制10/ 除法二进制10% 取模二进制10<< 左移二进制5>> 右移二进制5^ 按位异或XOR 二进制4& 按位与AND 二进制4| 按位或二进制4负号一元运算符11~ 取补运算一元运算符11< 取低字节一元运算符11取高字节一元运算符111.圆点. 或程序计数器如果圆点出现在表达式中那么当前程序计数器的值被放置在圆点的位置七. 汇编伪指令1.area <name> [(attributes)]定义代码或数据装入的内存区域, 链接器将所有使用同一名称的区域集合至一起,并且根据它们的属性进行连接或覆盖2.属性有两类2.1一类为abs, 或绝对定位区域rel 重定位区域2.2另一类为con, 或连接定位ovr 覆盖定位3.绝对定位区域的起始点地址是在汇编文件中由它自己指定的,而重定位区域的起始地址是由送命令选项给链接器来指定的,对带连接属性的区域链接器连接这个区域到另一个同名区域后面,对带有覆盖属性的区域对每一个文件链接器都是从同一地址开始安排区域4.下面举例说明它们的区别4.1file1.o:.area text 10 bytes, 调用text_1.area data 10 bytes.area text 20 bytes, 调用text_24.2file2.o:.area data 20 bytes.area text 40 bytes, 调用text_34.3text_1 和text_2 在这个例子中是正确的名称,实际上它们是不会获得一个单独的名称的让,我们假设text 区域的起始地址设置为0, 如果这个text 区域有“con”属性, 那么text_1将从0 开始, text_2 从地址10 开始, 而text_3 从30 地址开始,如果这个text 区域有“ovr”属性, 那么text_1 和text_2 将分别地从0 和10 开始,但对text_3 ,由于它在另外一个文件中定义,所以它将同样从0 地址开始. 所有同名的区域必须有相同有属性即使它们用在不同的模块中.4.4下面是具有合适属性的全部例子.area foo(abs).area foo(abs,con).area foo(abs,ovr).area foo(rel).area foo(rel,con).area foo(rel,ovr).ascii strings?八. ASC 字符串1..ASCIZ 字符串2.这个伪指令用于定义字符串,无论哪一个都要附上一对分界符在两个分界符之内任意可打印字符都是有效的下面是C 语言中的类型转义字符转义字符都是从反斜线\ 开始的\e ESC\b 退格\f 换页\n 换行\r 回车\t TAB3.\<最多三个八进制数> 字符是等于这个八进制数的值4.A SCIZ 定义在字符串的结尾增加了NUL 字符(\0) 它使\0 正确地嵌入字符串的内部例如: asciz “Hello World\n”asciz “23\0456”3 .byte <expr> [,<expr>]*.word <expr> [,<expr>]*.long<expr> [,<expr>]*5.这些伪指令是定义常数它们分别表示字节常数(byte) 字常数(2byte) 和双字长数6.(4byte) 字和双字常数是以高低字节倒置的格式输出这个格式用于AVR 微控制器(MCU)7.注意双字常数只能用作操作数而另外两个可以用于重定位表达式8.例如: .byte1, 2, 39..word label,foo10.4 .blkb <value>11..blkw <value>12..blkl <value>13.这些伪指令是保留空间而没有给它们赋值指令后面的数分别是指保留的字节字或14.双字的数目九.d efine <symbol> <value>1.定义一个文本替代符无论何时"symbol"可用在表达式中如寄存器符号或标号它2.是用"value."定义的例如3..define quot R154.mov quot,R16十.i f <symbol name>1..else2..endif3.上述三个伪指令定义了一个条件汇编语句如果条件<symbol name>为真非0 则执4.行.if 和.else 之间的指令如果条件<symbol name>为假等于0 则执行.else 和.endif 之间5.的指令.else 可以省略条件语句最多可以嵌套10 层如6..if cond7.lds R10,a8..else9.lds R10,b10..endif11.如果cond 不等于0 则将a 装入R10 如果cond 等于0 则将b 装入R10十一.macro <macroname>1.定义一个宏由一直到.endmacro 之间的所有声明组成宏除了另外一个宏声明外任意汇编声明可以是宏的组成部分在宏内部表达式@digit(digit 由0~9 的数字代替)是宏被调用时相应的宏参数定义的宏名称不能与汇编指令及汇编伪指令名称相冲突例如定义宏名“foo”.macro foolds @0,amov @1,@0ImageCraft ICCAVR 的中文使用说明.endmacro2.调用宏foo 需要两参数如foo R10,R11等同于lds R10,amov R11,R103.e ndmacro 结束一个宏定义4.<macro> [<arg0> [,<args>]*]调用宏是在操作码的位置放置宏名后面跟上相应的参数汇编器使用组成宏的声明来替换宏同时用相应的宏参数来扩展@digit 你可以指定多个参数例如:foo bar,x调用宏foo 而且带两个参数bar 和x.<symbol> = <value>定义一个符号等于常数值如:foo = 5十二.include “<filename>”1.处理指定的由文件名称指定的文件,如果当前目录该文件不存在汇编器将试图按文件名称指定的路径打开指定的文件2.如: .include “registers.h”十三.org <value>1.设定程序计数器PC 的值为"value." 这个伪指令中在带有"abs"属性的区域内有效,注意"value"是字节地址2.例如:.area interrupt_vectors(abs) 0xFFD04.dc.wreset十四.全局符号,1.将一个符号定义为全局符号使其在当前或其它模块中都是显式的这也和跟着两个冒号的标号相同否则符号只能在当前模块中使用。
宏 指 令
宏指令宏指令是汇编功能的另一种扩充。
在我们编写程序时,常常会遇到这种情况:一些程序段它们的结构相同,但在不同情况下使用的参数不同,这时可以把那变化的参数定义为形参,采用宏指令的方法来解决。
在汇编时,汇编程序将填入相应的实参,把它们逐条汇编并生成到相应的程序中去。
一个宏指令是汇编语句的一个代码段,其中可以包含有形参,所谓形参是指它的值由引用宏指令时定义,在编写宏指令时它仅仅是一个符号而已。
每个宏指令都有一个宏指令名,在程序中可以通过引用它的名字以及给定所需要的参数使用它。
宏指令通在汇编语句的命令中使用,参数出现在参数部分中,宏指令每次在程序中引用时,通过实参对形参的替换,使程序中宏指令中的形参获得实际值。
一个宏指令必须在它的第一次使用之前被定义。
通常,所有的宏指令的定义都集中在程序的首部,宏指令的定义格式如下:宏指令名MACRO形参表(宏指令体)ENDMMACRO和ENDM语句是宏指令定义的标志,它们指出了宏指令的首部和尾部。
每个MACRO语句必须有一个匹配的ENDM语句。
这些语句不使用标号。
宏指令名按照汇编程序中的其它符号名约定,宏指令名被加到汇编程序符号表中,并赋给一个宏指令类型。
因而它必须有唯一的名字。
其名字将包括在汇编程序列表输出的汇编符号清单中。
形参表是在宏指令定义中使用的形参集合。
这些参数用符号表示,且仅仅在宏指令定义中使用,而不被加到汇编符号表中。
它们只能在宏指令中的代码块中使用。
各个形参在参数表中应该用逗号隔开。
宏汇编中,每个宏指令最多可支持40个参数。
但是,参数表必须与MACFO指令在同一行上,由于每一代码行最大长度为80个字符,因形参的数量也受这个条件限制,参数表是任选的,所以一个宏指令也可以是无参的。
宏指令是程序块,它可以是任何汇编语言或伪指令,但由于汇编程序不支持嵌套的宏指令,因此,在宏指令体内不能再使用宏指令或对其他宏指令进行定义。
形参可以在代码段语句的任何域中使用,包括标号、命令、参数和注解。
AVR第三章(AVR指令系统)11年上
机器码:10q0 qq0d dddd 1qqq。
13
九、从程序存储器取常数寻址
只有一条指令LPM,也称查表指令。
程序存储器中存放常数字节的地址由寄存器Z的内容确定。 Z寄存器的高15位用于选择字地址,而Z寄存器的最低位D0用 于存放字地址的高低字节。若最低位为0,则选择低字节;若 最低位为1,则选择高字节。
说明:
一个汇编文件包含若干个代码段,若干个数据段 ,若 干个E2PROM 段 ,在汇编时,它们按类型的不同被分别连接 成一个代码段,一个数据段,一个E2PROM段。
18
二、ORG——设置程序、数据在段中的起始位置
语法: .ORG 表达式 ; 表达式的值为定位计数器的值---绝对值(无符号数)。 如果ORG伪指令放在数据段,则设置SRAM定位计数器。 如果该伪指令放在代码段,则设置程序存储器计数器。 如果该伪指令放在E2PROM段,则设置E2PROM定位计数器。 缺省值:代码段:0;数据段:32; E2PROM 段 :0。 注意:程序存储器定位计数器--按字计数; 而E2PROM和SRAM 定位计数器--按字节计数。
19
三、数据定义伪指令
1.BYTE——在SRAM数据区定义字节 语法:LABEL:.BYTE 表达式(表)
2. DB——在程序存储器或E2区中定义字节常数 语法:LABEL: .DB 表达式(表)
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f ;七段码表
例:LPM ; 操作: R0←(Z),既把以Z为指针的程序存储 器的内容送R0。若Z=$0100,即把地址为$0080的程序存储器 的低字节内容送R0,若Z=$0101,即把地址为$0080的程序存 储器的高字节内容送R0。 先了解一下,指令部分详细讲解。
(完整版)51单片机汇编指令(全)
指令中常用符号说明Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1)Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址#data表示8位常数(立即数)#data16表示16位常数Add16表示16位地址Addr11表示11位地址Rel8位代符号的地址偏移量Bit表示位地址@间接寻址寄存器或基址寄存器的前缀( )表示括号中单元的内容(( ))表示间接寻址的内容指令系统数据传送指令(8个助记符)助记符中英文注释MOV Move 移动MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器AMOV A , Direct;(direct)→A,直接地址的内容送AMOV A ,@ Ri;(Ri)→A,RI间址的内容送AMOV A , #data;data→A,立即数送AMOV Rn , A;A→Rn,累加器A的内容送寄存器RnMOV Rn ,direct;(direct)→Rn,直接地址中的内容送RnMOV Rn , #data;data→Rn,立即数送RnMOV direct , A;A→(direct),累加器A中的内容送直接地址中MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址MOV direct , #data;8位立即数送到直接地址中MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中MOV @Ri , #data; data→@Ri ,8位立即数送到间址中MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令)(MOV类指令共16条)MOVC Move Cod 查表指令MOVC A , @A+PC;PC+1→PC,(A+PC)→AMOVC A , @A+DPTR;(A+DPTR) →A(MOVC类指令共两条)MOVX Move External 与外部数据寄存区传送数据MOVX A , @DPTR;(DPTR)→A,DPTR间址单元内容送AMOVX @DPTR , A;A→(DPTR),A中内容送入DPTR间址单元MOVX A , @Ri;(Ri)→A,Ri间址单元内容送AMOVX @Ri , A;A→(Ri),A中内容送Ri间址单元(MOVX类指令4条)XCH Exchange 交换指令XCH A , Rn;Rn←→A , Rn的内容与A的内容交换XCH A , Direct; Direct ←→A ,直接地址的内容与A的内容交换XCH A , @Ri;(Ri)←→A ,间址的内容与A的内容交换XCHD Exchange Decimal十进制交换XCHD A , @Ri;(Ri.3~Ri.0) ←→A.3~A.0,间址内容低四位与A中内容低四位交换SWAP Swap 交换SWAP A;A.3~A.0←→ A.7~A.4 , A中低四位与高四位内容交换PUSH Push 入栈PUSH direct;SP+1→SP , (direct)→(SP);直接地址内容压入堆栈顶POP Pop 出栈POP direct;(SP)→(direct) , SP-1→SP;堆栈内容弹出到直接地址●算术运算类指令(7个助记符)ADD Add 加法运算ADD A , Rn;A + Rn→A , A与Rn的内容相加,结果送到A中ADD A , direct;(direct)+A→A,A与直接地址的内容相加,结果送到A中ADD A , @Ri;((Ri))+A→A, A与间址中的内容相加,结果送到A中ADD A , #data;data+A→A,A与立即数相加,和送入AADDC ADD with Carry 带进位加法ADDC A , Rn;A + Rn+CY→A , A与Rn的内容、进位状态相加,结果送到A中ADDC A , direct;(direct)+A+CY→A,A与直接地址的内容、进位状态相加,结果送到A中ADDC A , @Ri;((Ri))+A+CY→A, A与间址中的内容、进位状态相加,结果送到A中ADDC A , #data;data+A+CY→A,A与立即数、进位状态相加,和送入ASUBB Subbtract with Borrow 带进位减法SUBB A , Rn;A-Rn-CY→A,A减寄存器Rn的内容及进位标志,结果送ASUBB A , direct; A-(direct)-CY→A,A直接地址的内容及进位标志,结果送ASUBB A , @Ri; A-((Ri))-CY→A,A间址的内容及进位标志,结果送ASUBB A , #data; A-data-CY→A,A立即数及进位标志,结果送AMUL Multiply 乘法指令MUL AB;A x B→B和A,结果16位,高8位存入B,低8位存入A;若结果大于FFH,则将溢出标志OV置1DIV Divide 除法指令DIV AB;A÷B 商→A,余数→B;若除数为0,结果不确定,则将溢出标志OV置1INC Increment 加1指令INC A;A+1→A,A加1,结果放在AINC Rn; Rn +1→ Rn, Rn加1,结果放在RnINC direct; (direct)+1→ direct,直接地址的内容加1,结果放在该地址中INC @Ri;((Ri))+1→( Ri),间址中的内容加1,结果放在该间址中INC DPTR;(DPTR)+1→DPTR,数据指针内容加1,结果放在数据指针寄存器(DPTR)中DEC Decrement 减1指令INC A;A-1→A,A减1,结果放在AINC Rn; Rn -1→ Rn, Rn减1,结果放在RnINC direct; (direct)-1→ direct,直接地址的内容减1,结果放在该地址中INC @Ri;((Ri))-1→( Ri),间址中的内容减1,结果放在该间址中DA Decimal Adjust 十进制加法调整指令DA A;在加法指令后,把A中二进制码自动调整为BCD码;DA A只能更跟在ADD或ADDC加法指令后,不适用于减法●逻辑运算指令(9个助记符)ANL Logical And 逻辑与运算ANL A , Rn; (A)与(Rn)→A, A的内容与Rn中的内容相与,结果放在A中ANL A , direct; (A)与(direct)→A, A的内容与直接地址中的内容相与,结果放在A中ANL A , @Ri; (A)与((Ri))→A, A的内容与间址的内容相与,结果放在A中ANL A , #data; (A)与(data)→A, A的内容与立即数相与,结果放在A中ANL direct , A; (direct)与(A)→direct, 直接地址中的内容相与A的内容相与,结果放在直接地址中ANL direct , #data;(direct)与#data→direct, 直接地址中的内容相与立即数相与,结果放在直接地址中ORL Logical OR 逻辑或运算ORL A , Rn; (A) 或(Rn)→A, A的内容与Rn中的内容相或,结果放在A中ORL A , direct; (A) 或(direct)→A, A的内容与直接地址中的内容相或,结果放在A中ORL A , @Ri; (A) 或((Ri))→A, A的内容与间址的内容相或,结果放在A中ORL A , #data; (A) 或(data)→A, A的内容与立即数相或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相或,结果放在直接地址中ORL direct , #data;(direct) 或#data→direct, 直接地址中的内容相与立即数相或,结果放在直接地址中XRL Logical exclusive or 逻辑异或运算ORL A , Rn; (A) 异或(Rn)→A, A的内容与Rn中的内容相异或,结果放在A中ORL A , direct; (A) 异或(direct)→A, A的内容与直接地址中的内容相异或,结果放在A中ORL A , @Ri; (A) 异或((Ri))→A, A的内容与间址的内容相异或,结果放在A中ORL A , #data; (A) 异或(data)→A, A的内容与立即数相异或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相异或,结果放在直接地址中ORL direct , #data;(direct) 异或#data→direct, 直接地址中的内容相与立即数相异或,结果放在直接地址RL Rotate Left 循环左移指令RL A;每执行一次,A中的内容左移一位RR Rotate Right 循环右移指令RR A;每执行一次,A中的内容右移一位RLC Rotate Left with the Carry flag 带进位循环左移指令RLC A;每执行一次,CY和A中的内容左移一位RRC Rotate Right with the Carry flag带进位循环又移指令RRC A;每执行一次,CY和A中的内容右移一位注意:循环移位指令只能对A中的内容进行移位操作CPL Complement 取反指令(求补指令)CPL A;累加器内容按位取反,0变1,1变0CLR Clear 清零指令CLR A;累加器清零(A各位全变为0)●控制转移指令(9个助记符)LJMP Long Jump 长跳转指令LJMP add16;add16→PC,无条件跳转到add16地址,可在64KB范围内转移AJMP Absolute Jump 绝对跳转指令AJMP add11;add11→PC,无条件跳转到add11地址,可在2KB范围内转移SJMP Short Jump 短跳转指令SJMP rel;PC+2+rel→PC,rel是偏移量,8位有符号数(-127~127),可向前后跳转±128个地址单元JMP Jump 跳转指令JMP @A+DPTR;A+DPTR→PC,属于散转指令,无条件转向A与DPTR内容相加后形成的新地址JZ Jump if acc is Zero累加器为零转移JZ rel;A=0转向PC+2+rel→PC,A≠0,顺序执行JNZ Jump if acc is Not Zero累加器不为零转移JNZ rel;A≠0转向PC+2+rel→PC,A=0,顺序执行CJNE Compare and Jump if Not Equal比较不相等则转移CJNE A , direct , rel;A≠(direct)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(direct)CY=0, (A)<(direct)CY=1CJNE A , #data , rel;A≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(data)CY=0,( A)<(data)CY=1CJNE Rn , #data , rel; Rn≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); (Rn) >(data)CY=0, (Rn) <(data)CY=1CJNE @Ri , #data , rel;((Ri))≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); ((Ri))>(data)CY=0, ((Ri)) <(data)CY=1DJNE Decrement and Jump if Not Zero 减1不为0则转移DJNE Rn , rel;Rn-1→Rn, Rn≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)DJNZ direct , rel;(direct-1)→direct, direct≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)LCALL Long Call 长条用指令LCALL addr16;调用程序入口地址为addr16的之程序ACALL Absolute Call短调用ACALL addr11;调用程序入口地址为addr11的之程序RET ReturnRET;放在子程序最后,使程序准确返回到主程序断点处RETI Return from InterruptRETI;中断返回指令,能清楚优先级状态NOP No Operation 空操作指令NOP;空操作,产生一个机器周期延时●位操作指令MOV Move 数据传送指令MOV C , bit;(bit)→C,寻址位的状态送入CMOV bit , C;(C)→bit,C的转态送入地址中CLR Clear 清零指令CLR C;0→C,清零累加器CLR bit;清零直接寻址位CPL Complement 取反指令(求补指令)CPL C;c取反CPL bit;直接寻址位取反SETB Set Bit 置位SETB C;C置1SETB bit;直接寻址位置1ANL And Logical 与逻辑运算ANL C , bit;直接寻址位与C相与,结果放在CANL C , /bit; 直接寻址位与非C相与,结果放在CORL OR Logical 或逻辑运算ORL C , bit;直接寻址位与C相或,结果放在CORL C , /bit; 直接寻址位与非C相或,结果放在CJC Jump if Carry is set 进位位为1则转移JC rel;C=1,转向PC+2+rel→PC,否则顺序执行PC+2→PCJNC Jump if Carry is Not set 进位位为不为1则转移JNC rel;C=0,转向PC+2+rel→PC,否则顺序执行PC+2→PCJB Jump if Bit is set 进位位为1则转移JB bit , rel;(bit)=1,转向PC+3+rel→PC,否则顺序执行PC+3→PCJNB Jump if Bit is Not set 进位位为1则转移JNB bit , rel;(bit)=0,转向PC+3+rel→PC,否则顺序执行PC+3→PCJBC Jump if Bit is set and Clear bit指定位等于1转移并清该位JBC bit , rel; (bit)=1,转向PC+3+rel→PC,同时0→bit否则顺序执行PC+3→PC伪指令ORG Origin 代码起始地址指令ORG 0000HMOV A , #0010H;这条指令从0000H这个地址单元开始写起END End 汇编程序结束指令END;汇编指令结束DB字节定义伪指令ORG 1000HDB 01H , 02H;则(1000H)=01H,(1001H)=02HORG 1100HDB ‘01’;则(1100H)=30H,30H是0的ASCII码,(1101H)=31H,31H是1的ASCII码DW双字节定义伪指令ORG 2000HDW 2546H , 0178H; (2000H)=25H, (2001H)=46H, (2002H)=01H, (2003H)=78H,EQU数据赋值伪指令X EQU n;将n的值赋给xBIT位数据赋值伪指令y BIT b;y是用户定义标号,b为0或1MACRO宏指令宏指令名MACRO 形式参数······代码段······ENDM;宏指令定义结束寻址方式及相关的存储空间寻址方式寻址范围寄存器寻址R0~R7A 、B、C(CY)、AB(双字节)、DPTR(双字节)、PC(双字节)直接寻址内部RAM低128字节特殊功能寄存器内部RAM位寻区的128个位特殊功能寄存器中可寻址的位寄存器间接寻址内部数据存储器RAM【@R0,@R1,@SP(仅PUSH,POP)】内部数据存储器单元的低4位(@R0,@R1)外部RAM或I/O口(@R0,@R1,@DPTR)立即寻址程序存储器(常数)程序存储器(@A+PC,@A+DPTR)基寄存器加变址寄存器间接寻址。
第三章 AVR汇编指令
AVR 汇编语言系统
器件定义文件“m16def.inc” 函数
LOW(表达式) 返回一个表达式值的最低字节。 HIGH(表达式) 返回一个表达式值的第二个字节。 BYTE2(表达式) 与HIGH 函数相同。 BYTE3(表达式) 返回一个表达式值的第三个字节。 BYTE4(表达式) 返回一个表达式值的第四个字节。 LWRD(表达式) 返回一个表达式值的0~15 位。 HWRD(表达式) 返回一个表达式值的16~31 位。 PAGE(表达式) 返回一个表达式值的16~21 位。 EXP2(表达式) 返回(表达式值)2 次幂的值。 LOG2(表达式) 返回Log2(表达式值)的整数部分。
Rd,Rr Rd,Rr Rd,Rr Rd,Rr Rd,Rr
Rd,Rr
AVR指令系统-比较和跳转指令
无条件跳转指令
相对跳转 间接跳转 直接跳转 测试条件符合跳转指令
RJMP IJMP JMP
k k
条件跳转指令
状态寄存器中位为“1”跳转 状态寄存器中位为“0”跳转 相等跳转 不相等跳转 进位标志位C 为“1”跳转 进位标志位C 为“0”跳转
BRBS BRBC BREQ BRNE BRCS BRCC
s, s,
k k
k k
k k
AVR指令系统-比较和跳转指令
大于或等于跳转(对无符号数) 小于跳转(对无符号数) 结果为负跳转 结果为正跳转 大于或等于跳转(带符号数) 小于跳转(带符号数) 半进位标志为“1”跳转 半进位标志为“0”跳转 T 标志为“1”跳转 T 标志为“0”跳转 溢出标志为“1”跳转 溢出标志为“0”跳转 中断标志为“1”跳转 中断标志为“0”跳转
单片机宏指令-概念解析以及定义
单片机宏指令-概述说明以及解释1.引言概述部分的内容应包括对单片机宏指令的介绍和其在单片机编程中的作用。
以下是一个示例的概述部分内容:1.1 概述单片机是一种集成电路,具有处理器核心、存储器、输入/输出接口和时钟等关键组件。
作为嵌入式系统的核心,单片机广泛应用于各个领域,如家电、汽车电子、工业控制以及物联网等。
在单片机编程过程中,为了方便开发者快速进行软件开发,提高编程效率,宏指令被广泛应用。
宏指令是一种预定义的代码片段,可以在程序中通过简单的方式复用,起到简化程序编写的作用。
宏指令是在编译时被处理的,通过简单的替换机制,将宏指令展开为实际的代码。
宏指令可以包含常见的控制结构、函数调用以及常量定义等,使得程序的编写更加简洁和易读。
通过使用宏指令,开发者可以通过定义自己的宏指令,根据具体的需求和应用场景,灵活地定制和优化程序,提高代码的可维护性和可复用性。
本文将深入探讨单片机宏指令的定义和作用,介绍常用的宏指令以及宏指令的优缺点。
同时,本文还将总结宏指令在单片机编程中的重要性,并对宏指令的未来发展进行展望。
1.2 文章结构文章结构部分的内容主要是对整篇文章的组织架构和章节安排进行介绍。
在本篇文章中,我们将按照以下结构进行描述:2. 正文部分:2.1 单片机概述:在这一章节中,我们将会对单片机进行简要介绍,包括单片机的定义、组成结构、工作原理等。
2.2 宏指令的定义和作用:这一章节将会详细说明宏指令的概念和作用,解释宏指令在单片机编程中的重要性,并举例说明宏指令的实际应用场景。
2.3 常用的宏指令:我们将会列举并详细介绍一些常用的宏指令,如延时指令、循环指令、条件判断指令等,同时还会给出相应的代码示例和应用案例。
2.4 宏指令的优缺点:在这一章节中,我们将会对宏指令的优点和限制进行分析和讨论,提出宏指令在单片机编程中的局限性,并探讨如何在宏指令使用过程中克服其不足之处。
3. 结论部分:3.1 总结宏指令的重要性:我们将会对前文中所述的宏指令的定义、作用和优缺点进行总结,强调宏指令在单片机编程中的重要性和实际应用意义。
AVR单片机指令集
ADD Rd, Rr 无进位加法 Rd ← Rd + Rr Z,C,N,V,H 1 ADC Rd, Rr 带进位加法 Rd ← Rd + Rr + C Z,C,N,V,H 1 ADIW Rdl,K 立即数与字相加 Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2 SUB Rd, Rr 无进位减法 Rd ← Rd - Rr Z,C,N,V,H 1 SUBI Rd, K 减立即数 Rd ← Rd - K Z,C,N,V,H 1 SBC Rd, Rr 带进位减法 Rd ← Rd - Rr - C Z,C,N,V,H 1 SBCI Rd, K 带进位减立即数 Rd ← Rd - K - C Z,C,N,V,H 1 SBIW Rdl,K 从字中减立即数 Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与 Rd ← Rd • Rr Z,N,V 1 ANDI Rd, K 与立即数的逻辑与操作 Rd ← Rd • K Z,N,V 1 OR Rd, Rr 逻辑或 Rd ← Rd v Rr Z,N,V 1 ORI Rd, K 与立即数的逻辑或操作 Rd ← Rd v K Z,N,V 1 EOR Rd, Rr 异或 Rd ← Rd ⊕ Rr Z,N,V 1 COM Rd 1 的补码 Rd ← 0xFF − Rd Z,C,N,V 1 NEG Rd 2 的补码 Rd ← 0x00 − Rd Z,C,N,V,H 1 SBR Rd,K 设置寄存器的位 Rd ← Rd v K Z,N,V 1 CBR Rd,K 寄存器位清零 Rd ← Rd • (0xFF - K) Z,N,V 1 INC Rd 加一操作 Rd ← Rd + 1 Z,N,V 1 DEC Rd 减一操作 Rd ← Rd − 1 Z,N,V 1 TST Rd 测试是否为零或负 Rd ← Rd • Rd Z,N,V 1 CLR Rd 寄存器清零 Rd ← Rd ⊕ Rd Z,N,V 1 SER Rd 寄存器置位 Rd ← 0xFF None 1 MUL Rd, Rr 无符号数乘法 R1:R0 ← Rd x Rr Z,C 2 MULS Rd, Rr 有符号数乘法 R1:R0 ← Rd x Rr Z,C 2 MULSU Rd, Rr 有符号数与无符号数乘法 R1:R0 ← Rd x Rr Z,C 2 FMUL Rd, Rr 无符号小数乘法 R1:R0 ← (Rd x Rr) << 1 Z,C 2 FMULS Rd, Rr 有符号小数乘法 R1:R0 ← (Rd x Rr) << 1 Z,C 2 FMULSU Rd, Rr 有符号小数与无符号小数乘法 R1:R0 ← (Rd x Rr) << 1 Z,C 2跳转指令RJMP k 相对跳转 PC ← PC + k + 1 无 2 IJMP 间接跳转到(Z) PC ← Z 无 2 RCALL k 相对子程序调用 PC ← PC + k + 1 无 3 ICALL 间接调用(Z) PC ← Z 无 3 RET 子程序返回 PC ← STACK 无 4 RETI 中断返回 PC ← STACK I 4 CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr) PC ← PC + 2 or 3 无 1 / 2 / 3 CP Rd,Rr 比较 Rd − Rr Z, N,V,C,H 1 CPC Rd,Rr 带进位比较 Rd − Rr − C Z, N,V,C,H 1 CPI Rd,K 与立即数比较 Rd − K Z, N,V,C,H 1 SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b)=0) PC ← PC + 2 or 3 无 1 / 2 / 3 SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b)=1) PC ← PC + 2 or 3 无 1 / 2 / 3 SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b)=0) PC ← PC + 2 or 3 无 1 / 2 / 3 SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令if (P(b)=1) PC ← PC + 2 or 3 无 1 / 2 / 3 BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s) = 1) then PC←PC+k + 1 无 1 / 2 BRBC s, k 状态寄存器位为"0” 则跳过下一条指令if (SREG(s) = 0) then PC←PC+k + 1 无 1 / 2 BREQ k 相等则跳转if (Z = 1) then PC ← PC + k + 1 无 1 / 2 BRNE k 不相等则跳转if (Z = 0) then PC ← PC + k + 1 无 1 / 2 BRCS k 进位位为"1” 则跳转if (C = 1) then PC ← PC + k + 1 无 1 / 2 BRCC k 进位位为"0” 则跳转if (C = 0) then PC ← PC + k + 1 无 1 / 2 BRSH k 大于或等于则跳转 if (C = 0) then PC ← PC + k + 1 无 1 / 2 BRLO k 小于则跳转if (C = 1) then PC ← PC + k + 1 无 1 / 2 BRMI k 负则跳转if (N = 1) then PC ← PC + k + 1 无 1 / 2 BRPL k 正则跳转if (N = 0) then PC ← PC + k + 1 无 1 / 2 BRGE k 有符号数大于或等于则跳转if (N ⊕ V= 0) then PC ← PC + k + 1 无 1 / 2 BRLT k 有符号数负则跳转if (N ⊕ V= 1) then PC ← PC + k + 1 无 1 / 2 BRHS k 半进位位为"1” 则跳转if (H = 1) then PC ← PC + k + 1 无 1 / 2 BRHC k 半进位位为"0” 则跳转if (H = 0) then PC ← PC + k + 1 无 1 / 2 BRTS k T 为"1” 则跳转if (T = 1) then PC ← PC + k + 1 无 1 / 2 BRTC k T 为"0” 则跳转if (T = 0) then PC ← PC + k + 1 无 1 / 2 BRVS k 溢出标志为"1” 则跳转if (V = 1) then PC ← PC + k + 1 无 1 / 2 BRVC k 溢出标志为"0” 则跳转if (V = 0) then PC ← PC + k + 1 无 1 / 2 274 ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数BRIE k 中断使能再跳转if ( I = 1) then PC ← PC + k + 1 无 1 / 2 BRID k 中断禁用再跳转if ( I = 0) then PC ← PC + k + 1 无 1 / 2数据传送指令MOV Rd, Rr 寄存器间复制 Rd ← Rr 无 1 MOVW Rd, Rr 复制寄存器字 Rd+1:Rd ← Rr+1:Rr 无 1 LDI Rd, K 加载立即数 Rd ← K 无 1 LD Rd, X 加载间接寻址数据 Rd ← (X) 无 2 LD Rd, X+ 加载间接寻址数据,然后地址加一 Rd ← (X), X ← X + 1 无 2 LD Rd, - X 地址减一后加载间接寻址数据 X ← X - 1, Rd ← (X) 无 2 LD Rd, Y 加载间接寻址数据 Rd ← (Y) 无 2 LD Rd, Y+ 加载间接寻址数据,然后地址加一 Rd ← (Y), Y ← Y + 1 无 2 LD Rd, - Y 地址减一后加载间接寻址数据 Y ← Y - 1, Rd ← (Y) 无 2 LDD Rd,Y+q 加载带偏移量的间接寻址数据 Rd ← (Y + q) 无 2 LD Rd, Z 加载间接寻址数据 Rd ← (Z) 无 2 LD Rd, Z+ 加载间接寻址数据,然后地址加一 Rd ← (Z), Z ← Z+1 无 2 LD Rd, -Z 地址减一后加载间接寻址数据 Z ← Z - 1, Rd ← (Z) 无 2 LDD Rd, Z+q 加载带偏移量的间接寻址数据 Rd ← (Z + q) 无 2 LDS Rd, k 从SRAM 加载数据 Rd ← (k) 无 2 ST X, Rr 以间接寻址方式存储数据 (X) ← Rr 无 2 ST X+, Rr 以间接寻址方式存储数据,然后地址加一 (X) ← Rr, X ← X + 1 无 2 ST - X, Rr 地址减一后以间接寻址方式存储数据 X ← X - 1, (X) ← Rr 无 2 ST Y, Rr 加载间接寻址数据 (Y) ← Rr 无 2 ST Y+, Rr 加载间接寻址数据,然后地址加一 (Y) ← Rr, Y ← Y + 1 无 2 ST - Y, Rr 地址减一后加载间接寻址数据 Y ← Y - 1, (Y) ← Rr 无 2 STD Y+q,Rr 加载带偏移量的间接寻址数据 (Y + q) ← Rr 无 2 ST Z, Rr 加载间接寻址数据 (Z) ← Rr 无 2 ST Z+, Rr 加载间接寻址数据,然后地址加一 (Z) ← Rr, Z ← Z + 1 无 2 ST -Z, Rr 地址减一后加载间接寻址数据 Z ← Z - 1, (Z) ← Rr 无 2 STD Z+q,Rr 加载带偏移量的间接寻址数据 (Z + q) ← Rr 无 2 STS k, Rr 从SRAM 加载数据 (k) ← Rr 无 2 LPM 加载程序空间的数据 R0 ← (Z) 无 3 LPM Rd, Z 加载程序空间的数据 Rd ← (Z) 无 3 LPM Rd, Z+ 加载程序空间的数据,然后地址加一 Rd ← (Z), Z ← Z+1 无 3 SPM 保存程序空间的数据 (Z) ← R1:R0 无 -IN Rd, P 从I/O 端口读数据 Rd ← P 无 1 OUT P, Rr 输出端口 P ← Rr 无 1 PUSH Rr 将寄存器推入堆栈 STACK ← Rr 无 2 POP Rd 将寄存器从堆栈中弹出 Rd ← STACK 无 2位和位测试指令SBI P,b I/O 寄存器位置位 I/O(P,b) ← 1 无 2 CBI P,b I/O 寄存器位清零 I/O(P,b) ← 0 无 2 LSL Rd 逻辑左移 Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V 1 LSR Rd 逻辑右移 Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1 ROL Rd 带进位循环左移 Rd(0)←C,Rd(n+1)← Rd(n),C←Rd(7) Z,C,N,V 1 ROR Rd 带进位循环右移 Rd(7)←C,Rd(n)← Rd(n+1),C←Rd(0) Z,C,N,V 1 ASR Rd 算术右移 Rd(n) ← Rd(n+1), n=0..6 Z,C,N,V 1 SWAP Rd 高低半字节交换 Rd(3..0)←Rd(7..4),Rd(7..4)←Rd(3..0) 无 1 BSET s 标志置位 SREG(s) ← 1 SREG(s) 1 BCLR s 标志清零 SREG(s) ← 0 SREG(s) 1 BST Rr, b 从寄存器将位赋给T T ← Rr(b) T 1 BLD Rd, b 将T 赋给寄存器位 Rd(b) ← T 无 1 SEC 进位位置位 C ← 1 C 1 CLC 进位位清零 C ← 0 C 1 SEN 负标志位置位 N ← 1 N 1 CLN 负标志位清零 N ← 0 N 1 SEZ 零标志位置位 Z ← 1 Z 1 CLZ 零标志位清零 Z ← 0 Z 1 SEI 全局中断使能 I ← 1 I 1 CLI 全局中断禁用 I ← 0 I 1 SES 符号测试标志位置位 S ← 1 S 1 CLS 符号测试标志位清零 S ← 0 S 1 SEV 2 的补码溢出标志置位 V ← 1 V 1 CLV 2 的补码溢出标志清零 V ← 0 V 1 SET SREG 的T 置位 T ← 1 T 1指令集概述275ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数CLT SREG 的T 清零 T ← 0 T 1 SEH SREG 的半进位标志置位 H ← 1 H 1 CLH SREG 的半进位标志清零 H ← 0 H 1 MCU 控制指令NOP 空操作 无 1 SLEEP 休眠( 见对睡眠功能的特殊说明) 无 1 WDR 复位看门狗( 见对WDR/timer 的特殊说明) 无 1。
用汇编语言编写AVR单片机程序入门教程
用汇编语言编写AVR单片机程序入门教程作者:伟纳电子 Gguoqing原文发表在伟纳电子论坛:/forum_view.asp?forum_id=25&view_id=54381.硬件准备实验系统:ME300全系列单片机开发板。
实验芯片: ATmega8515L或Atmega8515。
2.软件准备AVRStudio V4.11 AVRStudio 是一个完整的开发工具,包括编辑、仿真功能,利用这个工具我们可以编辑源程序代码,并在AVR器件上运行。
ME300_V3.1版控制软件/down_view.asp?id=315上述软件有收录在ME300随机光盘中3.AVR 汇编语言学习环境的建立安装AVRStudio和ME300_V3.1版控制软件。
1)创建一个新项目:打开AVR Studio软件,选择“Project”菜单中的“New project”命令,弹出下面窗口。
这里新建一个名为work1的项目。
并在“Location”栏目中确定存放文件的路径与相应的文件夹。
点击“Finish”存盘后出现下面界面。
2)编辑汇编源程序:用汇编语言编写的源程序如下:;8只LED的跑马灯演示程序.INCLUDE "8515DEF.INC" ;CPU配置文件.ORG $0000RJMP RESET ;上电复位跳转到主程序.ORG $0013 ;代码段定位,跳过中断区RESET:LDI R16,LOW(RAMEND) ;设置堆栈指针OUT SPL,R16LDI R16,HIGH(RAMEND)OUT SPH,R16LDI R16,0B11111111 ;设置PA口为输出端口OUT DDRA,R16START:LDI R17,0B11111110 ;PA0输出低电平,LED0亮。
OUT PORTA,R17LDI R16,50 ;延时1秒RCALL DELAYLDI R17,0B11111101 ;PA1输出低电平,LED1亮。
AVR单片机C语言调用汇编指令集的宏
AVR单片机C语言调用汇编指令集的宏/**************************************** AVR单片机C语言调用汇编指令集的宏 ****************************************/#ifndef _ASM_H_#define _ASM_H_/*********************** 算术和逻辑指令 ***********************/// ### ADD ### 两个寄存器相加 (dest = dest + src)#define ASM_ADD(dest, src) asm volatile ("add %0, %1" : "=r" (dest) : "r" (src))// ### ADC ### 两个寄存器带进位位相加 (dest = dest + src + carry)#define ASM_ADC(dest, src) asm volatile ("adc %0, %1" : "=r" (dest) : "r" (src))// ### ADC_zero ### Add Carry T o Register dest (dest = dest + carry), Special Form Of ADC#define ASM_ADCzero(dest) asm volatile ("adc %0, __zero_reg__" : "=r" (dest) :)// ### ADIW ### 立即数与字相加 (word = word - const)#define ASM_ADIW(word, const) asm volatile ("adiw %0, %1" : "=w" (word) : "I" (const))// ### SUB ### 两个寄存器相减 (dest = dest - src)#define ASM_SUB(dest, src) asm volatile ("sub %0, %1" : "=r" (dest) : "r" (src))// ### SUBI ### 立即数与寄存器相减 (reg = reg - const)#define ASM_SUBI(reg, const) asm volatile ("subi %0, %1" : "=d" (reg) : "M" (const))// ### SBC ### 两个寄存器带进位位相减 (dest = dest - src - carry)#define ASM_SBC(dest, src) asm volatile ("sbc %0, %1" : "=r" (dest) : "r" (src))// ### SBC_zero ### Subtract Carry From Register dest (dest = dest - carry), Special Form Of SBC#define ASM_SBC_zero(dest) asm volatile ("sbc %0, __zero_reg__ " : "=r" (dest) :)// ### SBIW ### 字与立即数相减 (reg = reg - const)#define ASM_SBIW(word, const) asm volatile ("sbiw %0, %1" : "=w" (word) : "I" (const))// ### AND ### 两个寄存器逻辑与 (dest = dest & src)#define ASM_AND(dest, src) asm volatile ("and %0, %1" : "=r" (dest) : "r" (src))// ### ANDI ### 寄存器与常数逻辑与 (reg = reg & const)#define ASM_ANDI(reg, const) asm volatile ("andi %0, %1" : "=d" (reg) : "M" (const))// ### OR ### 两个寄存器逻辑或 (dest = dest | src)#define ASM_OR(dest, src) asm volatile ("or %0, %1" : "=r" (dest) : "r" (src))// ### ORI ### 寄存器与常数逻辑或 (reg = reg | const)#define ASM_ORI(reg, const) asm volatile ("ori %0, %1" : "=d" (reg) : "M" (const))// ### EOR ### 两个寄存器异或 (dest = dest ^ src)#define ASM_EOR(dest, src) asm volatile ("eor %0, %1" : "=r" (dest) : "r" (src))// ### COM ### 1的补码 (reg = 0xFF - reg)#define ASM_COM(reg) asm volatile ("com %0" : "=r" (reg) : "0" (reg))// ### NEG ### 2的补码 (reg = 0x00 - reg)#define ASM_NEG(reg) asm volatile ("neg %0" : "=r" (reg) : "0" (reg))// ### SBR ### 寄存器的某些位置位 (reg = reg | mask)#define ASM_SBR(reg, mask) asm volatile ("sbr %0, %1" : "=d" (reg) : "M" (mask))// ### CBR ### 寄存器的某些位清零 (reg = reg & ~mask)#define ASM_CBR(reg, mask) asm volatile ("sbr %0, %1" : "=d" (reg) : "M" (mask))// ### INC ### 加一 (reg = reg + 1)#define ASM_INC(reg) asm volatile ("inc %0" : "=r" (reg) : "0" (reg))// ### DEC ### 减一Rd ← (reg = reg - 1)#define ASM_DEC(reg) asm volatile ("dec %0" : "=r" (reg) : "0" (reg))// ### TST ### 测试为0或负 (reg = reg & reg)#define ASM_TST(reg) asm volatile ("tst %0" : "=r" (reg) : "0" (reg))// ### CLR ### 清零寄存器 (reg = reg ^ reg)#define ASM_CLR(reg) asm volatile ("clr %0" : "=r" (reg) : "0" (reg))// ### SER ### 置位寄存器 (reg = 0xFF)#define ASM_SER(reg) asm volatile ("ser %0" : "=r" (reg) : "0" (reg))// ### MUL ### 无符号数相乘 (r1:r0 = ureg1 * ureg2)#define ASM_MUL(ureg1, ureg2) asm volatile ("mul %0, %1" :: "r" (ureg1), "r" (ureg2))// ### MULS ### 有符号数相乘 (r1:r2 = sreg1 * sreg2)#define ASM_MULS(sreg1, sreg2) asm volatile ("muls %0, %1" :: "d" (sreg1), "d" (sreg2))// ### MULSU ### 有符号数与无符号数相乘(r1:r2 = sreg * ureg)#define ASM_MULSU(sreg, ureg) asm volatile ("mulsu %0, %1" :: "a" (sreg), "a" (ureg))// ### FMUL ### 无符号小数相乘 (r1:r2 = (ureg1 * ureg2) << 1)#define ASM_FMUL(ureg1, ureg2) asm volatile ("fmul %0, %1" :: "a" (ureg1), "a" (ureg2))// ### FMULS ### 有符号小数相乘 (r1:r2 = (sreg1 * sreg2) << 1)#define ASM_FMULS(sreg1, sreg2) asm volatile ("fmuls %0, %1" :: "a" (sreg1), "a" (sreg2))// ### FMULSU ### 无符号小数与有符号小数相乘(r1:r2 = (sreg * ureg) << 1)#define ASM_FMULSU(sreg, ureg) asm volatile ("fmulsu %0, %1" :: "a" (sreg), "a" (ureg))/****************** 跳转指令 ******************/// ### ICALL ### 相对调用到(Z) (PC = Z)#define ASM_ICALL() asm volatile ("icall" :: )/********************* 数据传输指令 *********************/// ### MOV ### 寄存器之间数据转移 (dest = src)#define ASM_MOV(dest, src) asm volatile ("mov %0, %1" : "=r" (dest) : "r" (src))// ### MOVW ### 拷贝寄存器字 (dest = src)#define ASM_MOVW(dest, src) asm volatile ("movw %0, %1" : "=r" (dest) : "r" (src))// ### LDI ### 加载立即数 (reg = const)#define ASM_LDI(reg, const) asm volatile ("ldi %0, %1" : "=d" (reg) : "M" (const))// ### LD ### 使用 X, Y, Z 指针间接加载 (reg = *ptr)#define ASM_LD(reg, ptr) asm volatile ("ld %0, %a1" : "=r" (reg) : "e" (ptr))// ### LD ### 1.预减X, Y, Z, 2.使用 X 指针间接加载 (ptr = ptr - 1, reg = *ptr)#define ASM_decLD(reg, ptr) asm volatile ("ld %0, -%a1" : "=r" (reg) : "e" (ptr))// ### LD ### 1.使用 X, Y, Z 指针间接加载, 2.指针后加 (reg = *ptr, ptr = ptr + 1)#define ASM_LDinc(reg, ptr) asm volatile ("ld %0, %a1+" : "=r" (reg) : "e" (ptr))// ### STS ### 直接存储到SRAM// 变量存储到SRAM的用法:static uint8_t var; uint8_t value = 123; ASM_STS (&var, value);// 值存储到SFR的用法: uint8_t value = 5;ASM_STS (_SFR_MEM_ADDR (SPMCR), value);#define ASM_STS(addr, reg) asm volatile ("sts %0, %1" : : "i" (addr), "r" (reg))// ### LPM ### 加载程序存储器 (R0 = *Z)#define ASM_LPM() asm volatile ("lpm" ::)// ### LPM ### 加载程序存储器 (reg = *Z)#define ASM_LPM_Z(reg) asm volatile ("lpm %0, Z" : "=r" (reg))// ### LPM ### 加载程序存储器并执行后加操作 (reg = *Z, Z = Z + 1)#define ASM_LPM_Zinc(reg) asm volatile ("lpm %0, Z+" : "=r" (reg))// ### SPM ### 存储程序存储器 (*Z = R1:R0)#define ASM_SPM() asm volatile ("spm" ::)/*********************** 位和位测试指令 ***********************/// ### SBI ### 置位I/O寄存器的某一位#define ASM_SBI(port, pin) asm volatile ("sbi %0, %1" :: "I"(_SFR_IO_ADDR(port)), "I" (pin))// ### CBI ### 清除I/O寄存器的某一位#define ASM_CBI(port, pin) asm volatile ("cbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (pin))// ### LSL ### 逻辑左移 (reg = reg << 1)#define ASM_LSL(reg) asm volatile ("lsl %0" : "=r" (reg) : "0" (reg))// ### LSR ### 逻辑右移 (reg = reg >> 1)#define ASM_LSR(reg) asm volatile ("lsr %0" : "=r" (reg) : "0" (reg))// ### ROL ### 通过进位位向左循环#define ASM_ROL(reg) asm volatile ("rol %0" : "=r" (reg) : "0" (reg))// ### ROR ### 通过进位位向右循环#define ASM_ROR(reg) asm volatile ("ror %0" : "=r" (reg) : "0" (reg))// ### ASR ### 算术右移 (Wie LSR Aber nur mit Bit 6 bis Bit 0)#define ASM_ASR(reg) asm volatile ("asr %0" : "=r" (reg) : "0" (reg))// ### SWAP ### 高4位与低4位交换 (reg(0...3) = reg(4...7), reg(4...7) = reg(0...3))#define ASM_SWAP(reg) asm volatile ("swap %0" : "=r" (reg) :"0" (reg))// ### BSET ### 置位标志位 (SREG(flagnumber) = 1)#define ASM_BSET(flagnumber) asm volatile ("bset %0" :: "I" (flagnumber))// ### BCLR ### 清零标志位 (SREG(flagnumber) = 0)#define ASM_BCLR(flagnumber) asm volatile ("bclr %0" :: "I" (flagnumber))// ### BST ### 将寄存器的某一位保存到T (T = reg(bitnumber)) #define ASM_BST(reg, bitnumber) asm volatile ("bst %0, %1" :: "r" (reg), "I" (bitnumber))// ### BLD ### 将T 加载到寄存器的某一位 (reg(bitnumber) = T)#define ASM_BLD(reg, bitnumber) asm volatile ("bld %0, %1" : "=r" (reg) : "I" (bitnumber))// ### SEC ### 置位进位位 (REG.C = 1)#define ASM_SEC() asm volatile ("sec" :: )// ### CLC ### 清零进位位 (REG.C = 0)#define ASM_CLC() asm volatile ("clc" :: )// ### SEN ### 置位负数标志位 (REG.N = 1)#define ASM_SEN() asm volatile ("sen":: )// ### CLN ### 清零负数标志位 (REG.N = 0)#define ASM_CLN() asm volatile ("cln" :: )// ### SEZ ### 置位0标志位 (REG.Z = 1)#define ASM_SEZ() asm volatile ("sez" :: )// ### CLZ ### 清零0标志位 (REG.Z = 0)#define ASM_CLZ() asm volatile ("clz" :: )// ### SEI ### 全局中断标志使能 (REG.I = 1)#define ASM_SEI() asm volatile ("sei" :: )// ### CLI ### 全局中断标志禁止 (REG.I = 0)#define ASM_CLI() asm volatile ("cli" :: )// ### SES ### 置位符号测试标志位 (REG.S = 1) #define ASM_SES() asm volatile ("ses" :: )// ### CLS ### 清零符号测试标志位 (REG.S = 0) #define ASM_CLS() asm volatile ("cls" :: )// ### SEV ### 置位2的补码溢出标志 (REG.V = 1) #define ASM_SEV() asm volatile ("sev" :: )// ### CLV ### 清零2的补码溢出标志 (REG.V = 0) #define ASM_CLV() asm volatile ("clv" :: )// ### SET ### 置位位拷贝存储标志 (REG.T = 1) #define ASM_SET() asm volatile ("set" :: )// ### CLT ### 清零位拷贝存储标志 (REG.T = 0)#define ASM_CLT() asm volatile ("clt" :: )// ### SEH ### 置位半进位标志 (REG.H = 1) #define ASM_SEH() asm volatile ("seh" :: )// ### CLH ### 清零半进位标志 (REG.H = 0) #define ASM_CLH() asm volatile ("clh" :: )/******************** MCU控制指令 ********************/// ### BREAK ### 只用于片上调试#define ASM_BREAK() asm volatile ("break" :: )// ### NOP ### No 无操作#define ASM_NOP() asm volatile ("nop" :: )// ### SLEEP ### 睡眠#define ASM_SLEEP() asm volatile ("sleep" :: )// ### WDR ### 看门狗复位#define ASM_WDR() asm volatile ("wdr" :: )#endif。
AVR汇编指令
AVR汇编指令AVR指令算术指令:加法(4)ADD Rd,Rr (Rd)<- (Rd)+(Rr);d,r =【0-31】ADC Rd,Rr (Rd)<- (Rd)+ (Rr)+ C ;d,r =【0-31】ADIW Rdl,K (Rdh:Rdl)<- (Rdh:Rdl)+K ;d =【24,26,28,30】K =【0-63】INC Rd (Rd)<- (Rr)+ 1 ;d =【0-31】减法(6)SUB Rd,Rr (Rd)<- (Rd)- (Rr);d,r =【0-31】SUBI Rd,K (Rd)<- (Rd)- K ;d =【16-31】K =【0-255】SBC Rd,Rr (Rd)<- (Rd)- (Rr)- C ;d,r =【0-31】SBCI Rd,K (Rd)<- (Rd)- K - C ;d =【16-31】K =【0-255】SBIW Rdl,K (Rdh:Rdl)<- (Rdh:Rdl)- K ;d =【24,26,28,30】 K =【0-63】DEC Rd (Rd)<- (Rr)- 1 ;d =【0-31】乘法(1)MUL Rd,Rr (R1)<-H(Rd*Rr)(R0)<-L(Rd*Rr);d,r =【2-31】逻辑运算与(4)AND Rd,Rr (Rd)<- (Rd)&(Rr);d,r =【0-31】ANDI Rd,K (Rd)<- (Rd)& K ;d =【16-31】K =【0-255】CBR Rd,K (Rd)<- (Rd)& (FF- K);d =【16-31】K =【0-255】TST Rd (Rd)<- (Rd)&(Rr);d =【16-31】Z标记位或(4)OR Rd,Rr (Rd)<- (Rd)|(Rr);d,r =【0-31】ORI Rd,K (Rd)<- (Rd)| K ;d =【16-31】K =【0-255】SBR Rd,K (Rd)<- (Rd)| K ;d =【16-31】K =【0-255】 SERRd (Rd)<- FF ;d =【16-31】异或(2)EOR Rd,Rr (Rd)<- (Rd)⊕(Rr);d,r =【0-31】CLR Rd (Rd)<- 00 ;d =【0-31】比较(3)CP Rd,Rr (Rd)- (Rr);d,r =【0-31】CPI Rd,K (Rd)- K ;d =【16-31】K =【0-255】CPC Rd,Rr (Rd)- (Rr)- C ;d,r =【0-31】取反(1)COM Rd (Rd)<- FF -(Rd);d =【0-31】取补(1)NEG Rd (Rd)<- 00 -(Rd);d =【0-31】无条件跳转(3)RJMP K (PC)<- (PC)+1+K ;K =【-2k - 2k】IJMP (PC)<- (Z);Z : 16BITJMP K (PC)<- K ;K =【0-4M】条件跳转(20)BRBS S , K BRBC S , K 状态寄存器判断位;S =【0-7】K =【-64,63】BREQ K BRNE K 为零标记不为零BRIE K BRID K 全局中断开关BRTS K BRTC K 标记位为零BRHS K BRHC K 半进位置位为零BRGM K BRLT K 带符号大于等于小于BRSH K BRLO K 无符号大于等于小于BRCS K BRCC K 进位置位为零BRVS K BRVC K 补码溢出置位为零BRMI K BRPL K 负数正数条件跳行(5)CPSE Rd,Rr 相等时跳行;d,r =【0-31】SBRS Rd,b 该为置位时跳行;d =【0-31】S =【0-7】 SBRC Rd,b 该为零时跳行;d =【0-31】S =【0-7】SBIC P,b 该为零时跳行;P =【0-31】S =【0-7】SBIS P,b 该为置位时跳行;P =【0-31】 S =【0-7】调用(5)RCALL K (PC)<- (PC)+1+K ;K =【-2k - 2k】ICALL 跳转到Z指向地址;16 bitCALL K 0-4MRET 子程序返回RETI 中断返回栈(2)PUSH Rd 进入堆栈;d =【0-31】POP Rd 出栈;d =【0-31】直接数据传送(4)MOV Rd,Rr (Rd)<-(Rr);d,r =【0-31】LDS Rd,K (Rd)<-(K);d =【0-31】STS K,Rd (K)<-(Rd);d =【0-31】LDI Rd,K (Rd)<- K ;d =【16-31】K =【0-255】间接数据传送(22)X寄存器:LD Rd,X (Rd)<-((X));d =【0-31】LD Rd,X+ (Rd)<-((X)),(X)+=1 ;d =【0-31】LD Rd,-X (X)- =1,(Rd)<-((X));d =【0-31】ST X,Rd ((X))<-(Rd);d =【0-31】ST X+,Rd ((X))<-(Rd),(X)+=1 ;d =【0-31】ST -X,Rd (X)- =1,((X))<-(Rd);d =【0-31】Y寄存器:LD Rd,YLD Rd,Y+LD Rd,-YLDD Rd,Y+Q (Rd)<-((Y+Q));d =【0-31】Q =【0-63】ST Y,RdST Y+,RdSTD Y+Q,RdZ寄存器:LD Rd,ZLD Rd,Z+LD Rd,-ZLDD Rd,Z+QST Z,RdST Z+,RdST -Z,RdSTD Z+Q,Rd寻址(1)LMP 利用Z寄存的地址寻址(注意lsb位要为0读低8位数1读高8位数)I/O口(2)IN Rd,P (Rd)<- (P);d =【0-31】 P =【0-63】 OUT P,Rd (P)<- (Rd);d =【0-31】 P =【0-63】移位(6)LSL Rd (Rd)<<1, C<-MSB ,LSB<-0 ;d =【0-31】LSR Rd (Rd)>>1, C<-LSB ,MSB<-0 ;d =【0-31】ROL Rd (Rd)<<1 ,LSB<-C , C<-MSB ;d =【0-31】ROR Rd (Rd)>>1 ,MSB<-C , C<-LSB ;d =【0-31】SWAP Rd 半字节交换;d =【0-31】ASR Rd 7位不变,其余右移 , C<-LSB ;d =【0-31】T标记位(2)BLD Rd,b 将位读入T标记;d =【0-31】 b =【0-7】BST Rd,b 将T标记写入位;d =【0-31】 b =【0-7】状态位设置(20)BSET S BCLR S 设置状态寄存器指定位; S =【0-7】SEI CLI 状态标记设置或清除SET CLTSES CLSSEN CLNSEV CLVSEZ CLZSEC CLCSBI P,b CBI P,b 32IO口指定位设置清楚;P =【0-31】 b =【0-7】其他WDR 看门狗复位SLEEP 休眠NOP 空指令。
AVR指令
(31) Z 寄存器(4): ST Z,Rr;ST Z+,Rr;ST –Z,Rr;STD Z+q,Rr
读存储器(1): LPM
ADD Rd,Rr 加法 BRSH k C=1 无符号数 转 SBI P,b 置位I/O 位
ADC Rd,Rr 带进位加 BRLO k C=0无符号数小于转 CBI P,b 清零I/O 位
ADIW Rdl,K 加立即数 BRMI k N=1 负数转移 LSL Rd 左移
I/O指令(2): IN,OUT
栈指令(2): PUSH,POP
算术指令与 加(4): ADD,ADC,ADIW,INC;
(10) 减(6): SUB,SUBI,SBC,SBCI,SBIW,DEC
asr rd 算术右移
andi rd,k 与立即数
brne k 不相等转移
swap rd 半字节交换
or rd,rr 或brcs k c 置位转
bset s 置位sreg
ori rd,k 或立即数
brcc k c 清零转
bclr s 清零sreg
eor rd,rr 异或brsh k 转
Y寄存器(4): LD Rd,Y;LD Rd,Y+;LD Rd,-Y;LDD Rd,Y+q
Z寄存器(4): LD Rd,Z;LD Rd,Z+;LD Rd,-Z;LDD Rd,Z+q
X 寄存器(3): ST X,Rr;ST X+,Rr;ST –X,Rr
(31) BCLR -- CLI,CLT,CLH,CLS,CLV,CLN,CLZ,CLC (CL清0某位)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个avr单片机的汇编程序,注意几个宏
指令
//晶振1MHz
//LED接PB0
//使用定时器1,1024分频,0.5秒中断一次,LED闪烁一次
程序如下:
.include "m8def.inc"
.equ led =0
.equ flash =$60
.org $0000//中断向量表
rest:
rjmp START
INT0addre: ; External Interrupt0 Vector Address reti
INT1addre: ; External Interrupt1 Vector Address reti
OC2addre : ; Output Compare2 Interrupt Vector Address
reti
OVF2addre: ; Overflow2 Interrupt Vector Address
reti
ICP1addre: ; Input Capture1 Interrupt Vector Address reti
OC1Aaddre: ; Output Compare1A Interrupt Vector Address
reti
OC1Baddre: ; Output Compare1B Interrupt Vector Address
reti
OVF1addre: ; Overflow1 Interrupt Vector Address rjmp Timer1_ovf
OVF0addre: ; Overflow0 Interrupt Vector Address reti
SPIaddre : ; SPI Interrupt Vector Address
reti
URXCaddre: ; USART Receive Complete Interrupt Vector Address
reti
UDREaddre: ; USART Data Register Empty Interrupt Vector Address
reti
UTXCaddre: ; USART Transmit Complete Interrupt
Vector Address
reti
ADCCaddre: ; ADC Interrupt Vector Address
reti
ERDYaddre: ; EEPROM Interrupt Vector Address
reti
ACIaddre : ; Analog Comparator Interrupt Vector Address
reti
TWIaddre : ; Irq. vector address for Two-Wire Interface
reti
SPMaddre : ; SPM complete Interrupt Vector Address reti
SPMRaddre: ; SPM complete Interrupt Vector Address reti
.org $20
START:
ldi r16,low(ramend)//设置堆栈指针
out spl,r16
ldi r16,high(ramend)
out sph,r16
clr r16
sts flash,r16
sbi ddrb,led//PB0接led
rcall Timer1_ovf_init//调用初始化函数
MAIN:
lds r16,flash
sbrs r16,0 ;if the flag is set,jump one low rjmp main
ldi r16,0x01//LED取反
in r17,pinb
eor r17,r16
out portb,r17
clr r16
sts flash,r16
rjmp main
Timer1_ovf_init:
ldi r16,0xfe
out tcnt1h,r16
ldi r16,0x17
out tcnt1l,r16
in r16,timsk
sbr r16,1<<2//开溢出中断
out timsk,r16
ldi r16,0x05
out tccr1b,r16//开定时器
sei //开中断
ret
Timer1_ovf://定时器2定时0.5S in r16,sreg
push r16//保存SREG入栈
ldi r16,0xfe
out tcnt1h,r16
ldi r16,0x17
out tcnt1l,r16
clr r16
sbr r16,1<<0//设置标志
sts flash,r16
pop r16
out sreg,r16
reti//中断返回。