第三章 AVR汇编指令
1、指令系统
2、汇编程序
问题
� 城市路灯控制
� 某公司接到一个城市路灯控制的项目,要求
实现路灯的开关控制
� 时间:1个月
� 成本控制
� 安全可靠
编程语言
� 汇编语言
� IAR AVR C编译器
� ICC AVR C 编译器
� Code Vision AVR C编译器
� GNU C编译器
� BASCOM-AVR
AVR指令系统
� ATmega16 共有131 条指令,按功能可
分为五大类,
� 算术和逻辑运算指令(28 条)
� 比较和跳转指令(36 条)
� 数据传送指令(35 条)
� 位操作和位测试指令(28 条)
� MCU 控制指令(4 条)
AVR指令系统
� AVR 指令的寻址方式和寻址空间
� 单寄存器直接寻址
� 双寄存器直接寻址方式
� I/O 寄存器直接寻址
� 数据存储器空间
� 数据空间直接寻址 数据空间的寄存器间接寻址
� 后增量数据空间寄存器间接寻址 预减量数据空间寄存器间接寻址
� 带位移的数据空间寄存器间接寻址 数据空间堆栈寄存器SP 间接寻址
� 程序存储器空间
� 程序空间取常量寻址 程序空间直接寻址
� 程序空间写数据寻址 程序空间Z 寄存器间接寻址
� 程序空间相对寻址 后增量程序空间取常量寻址
AVR指令系统-算术和逻辑运算指令
� 加法指令
� 不带进位位加法 ADD Rd,Rr
� 带进位位加法 ADC Rd,Rr
� 字加立即数 ADIW Rdl, K
� 增1 指令 INC Rd
AVR指令系统-算术和逻辑运算指令
� 减法指令
� 不带进位位减法 SUB Rd,Rr
� 减立即数(字节) SUBI Rd,K
� 带进位位减法 SBC Rd,Rr
� 带进位位减立即数(字节) SBCI Rd,K
� 减立即数(字) SBIW Rdl,K
� 减1 指令 DEC Rd
AVR指令系统-算术和逻辑运算指令
� 取反码指令 COM Rd
� 取补码指令 NEG Rd
� 比较指令
� 寄存器比较 CP Rd,Rr
� 带进位比较 CPC Rd,Rr
� 与立即数(字节)比较 CPI Rd,K
AVR指令系统-算术和逻辑运算指令
� 逻辑与指令
� 寄存器逻辑与 AND Rd,Rr
� 与立即数(字节) ANDI Rd,K
� 寄存器位清零 CBR Rd,K
� 测试寄存器为零或负 TST Rd
� 逻辑或指令
� 寄存器逻辑或 OR Rd,Rr
� 或立即数(字节) ORI Rd,K
� 置寄存器位 SBR Rd,K
� 置寄存器为$FF SER Rd
AVR指令系统-算术和逻辑运算指令
� 逻辑异或指令
� 寄存器异或 EOR Rd,Rr
� 寄存器清零 CLR Rd
� 乘法指令
� 无符号数乘法 MUL Rd,Rr
� 有符号数乘法 MULS Rd,Rr
� 有符号数与无符号数乘法 MULSU Rd,Rr
� 无符号定点小数乘法 FMUL Rd,Rr
� 有符号定点小数乘法 FMULS Rd,Rr
� 有符号定点小数和无符号定点小数乘
FMULSU Rd ,Rr
AVR指令系统-比较和跳转指令
� 无条件跳转指令
� 相对跳转 RJMP k
� 间接跳转 IJMP
� 直接跳转 JMP k
� 条件跳转指令
� 测试条件符合跳转指令
� 状态寄存器中位为 “1”跳转 BRBS s, k
� 状态寄存器中位为 “0”跳转 BRBC s, k
� 相等跳转 BREQ k
� 不相等跳转 BRNE k
� 进位标志位C 为“1”跳转 BRCS k
� 进位标志位C 为“0”跳转 BRCC k
AVR指令系统-比较和跳转指令
� 大于或等于跳转(对无符号数) BRSH k
� 小于跳转(对无符号数) BRLO k
� 结果为负跳转 BRMI k
� 结果为正跳转 BRPL k
� 大于或等于跳转(带符号数) BRGE k
� 小于跳转(带符号数) BRLT k
� 半进位标志为 “1”跳转 BRHS k
� 半进位标志为 “0”跳转 BRHC k
� T 标志为“1”跳转 BRTS k
� T 标志为“0”跳转 BRTC k
� 溢出标志为 “1”跳转 BRVS k
� 溢出标志为 “0”跳转 BRVC k
� 中断标志为 “1”跳转 BRIE k
� 中断标志为 “0”跳转 BRID k
AVR指令系统-比较和跳转指令
� 测试条件符合跳行跳转指令
� 相等跳行 CPSE Rd,Rr
� 寄存器位为“0”跳行 SBRC Rr,b
� 寄存器位为“1”跳行 SBRS Rr,b
� I/O 寄存器位为“0”跳行 SBIC P,b
� I/O 寄存器位为“1”跳行 SBIS P,b
AVR指令系统-比较和跳转指令
� 子程序调用和返回指令
� 相对调用 RCALL k
� 间接调用 ICALL
� 直接调用 CALL k
� 从子程序返回 RET
� 从中断程序返回 RETI
AVR指令系统-数据传送指令
� 直接寻址数据传送指令
� 工作寄存器间传送数据 MOV Rd,Rr
� SRAM 数据直接送寄存器 LDS Rd, k
� 寄存器数据直接送SRAM STS k, Rr
� 立即数送寄存器 LDI Rd, K
AVR指令系统-数据传送指令
� 间接寻址数据传送指令
� 使用X 指针寄存器间接寻址传送数据
� 使用地址指针寄存器 X 间接寻址将SRAM 内容装入到指定寄存器
� LD Rd,X 将指针为X 的SRAM 中的数送寄存器,指针不变。
� LD Rd,X+ 先将指针为X 的SRAM 中的数送寄存器,X 指针加1。
� LD Rd,-X X 指针减1,将指针为X 的SRAM 中的数送寄存器。
� 使用地址指针寄存器 X 间接寻址将寄存器内容存储到 SRAM
� ST X,Rr 将寄存器内容送X 为指针的SRAM 中,X 指针不改变。
� ST X,Rr 先将寄存器内容送X 为指针的SRAM 中,后X 指针加1。
� ST -X,Rr 先将X 指针减1,然后将寄存器内容送X 为指针的SRAM
中。
AVR指令系统-数据传送指令
� 使用Y 指针寄存器间接寻址传送数据
� 使用地址指针寄存器Y 间接寻址将SRAM 中的内容装入寄存器
� LD Rd,Y将指针为Y 的SRAM 中的数送寄存器,Y 指针不变。
� LD Rd,Y+ 先将指针为Y 的SRAM 中的数送寄存器,然后Y 指针加1。
� LD Rd,-Y 先将Y 指针减1,将指针为Y 的SRAM 中的数送寄存器。
� LDD Rd,Y+q 将指针为Y+q 的SRAM 中的数送寄存器,而Y 指针不改变。
� 使用地址指针寄存器Y 间接寻址将寄存器内容存储到 SRAM
� ST Y,Rr将寄存器内容送Y 为指针的SRAM 中,Y 指针不改变。
� ST Y+,Rr 先将寄存器内容送Y 为指针的SRAM 中,然后Y 指针加1。
� ST –Y,Rr 先将Y 指针减1,然后将寄存器内容送Y 为指针的SRAM 中。
� STD Y+q,Rr将寄存器内容送Y+q 为指针的SRAM 中。
AVR指令系统-数据传送指令
� 使用Z 指针寄存器间接寻址传送数据
� 使用地址指针寄存器 Z 间接寻址将SRAM 中的内容装入到指定寄存器
� LD Rd,Z 将指针为Z 的SRAM 中的数送寄存器,Z 指针不变。
� LD Rd,Z+先将指针为Z 的SRAM 中的数送寄存器,然后Z 指针加1。
� LD Rd,-Z先将Z 指针减1,然后将指针为Z 的SRAM 中的数送寄存器。
� LDD Rd,Z+q 将指针为Z+q 的SRAM 中的数送寄存器,而Z 指针不改变。
� 使用地址指针寄存器 Z 间接寻址将寄存器内容存储到 SRAM
� ST Z,Rr 将寄存器内容送Z 为指针的SRAM 中,Z 指针不改变。
� ST Z+,Rr 先将寄存器内容送Z 为指针的SRAM 中,然后Z 指针加1。
� ST -Z,Rr 先将Z 指针减1,然后将寄存器内容送Z 为指针的SRAM 中。
� STD Z+q,Rr 将寄存器内容送Z+q 为指针的SRAM 中。
AVR指令系统-数据传送指令
� 从程序存储器中取数装入寄存器指令
� 从程序中取数装入寄存器R0 LPM
� 从程序存中取数装入寄存器 LPM Rd,Z
� 带后增量的从程序中取数装入寄存器Rd LPM Rd,Z+
� 从程序中取数装入寄存器R0(扩展) ELPM
� 从程序中取数装入寄存器(扩展) ELPM Rd,Z
� 带后增量的从程序中取数装入寄存器Rd(扩展)
LPM Rd,Z+
AVR指令系统-数据传送指令
� 写程序存储器指令 SPM
� I/O 口数据传送
� I/O 口数据装入寄存器 IN Rd,P
� 寄存器数据送I/O 口 OUT P, Rr
� 堆栈操作指令
� 进栈指令 PUSH Rr
� 出栈指令 POP Rd
AVR指令系统-位操作和位测试指令
� 带进位逻辑操作指令
� 寄存器逻辑左移 LSL Rd
� 寄存器逻辑右移 LSR Rd
� 带进位位的寄存器逻辑循环左移 ROL Rd
� 带进位位的寄存器逻辑循环右移 ROR Rd
� 寄存器算术右移 ASR Rd
� 寄存器半字节交换 SWAP Rd
AVR指令系统-位操作和位测试指令
� 位变量传送指令
� 寄存器中的位存储到SREG 中的T 标志
BST Rr,b
� SREG 中的T 标志位值装入寄存器Rd 中的某一位
BLD Rd,d
� 位变量修改指令
� 状态寄存器SREG 的指定位置“1” BSET s
� 状态寄存器SREG 的指定位清“0” BCLR s
� I/O 寄存器的指定位置“1” SBI P,b
� I/O 寄存器的指定位置“0” CBI P,b
AVR指令系统-位操作和位测试指令
� 置进位位 SEC
� 清进位位 CLC
� 置位负标志位 SEN
� 清负标志位 CLN
� 置零标志位 SEZ
� 清零标志位 CLZ
� 触发全局中断位 SEI
� 置S 标志位 SES
� 清S 标志位 CLS
AVR指令系统-位操作和位测试指令
� 置溢出标志位 SEV
� 清溢出标志位 CLV
� 置T 标志位 SET
� 清T 标志位 CLT
� 置半进位标志 SHE
� 清半进位标志 CLH
AVR指令系统-MCU 控制指令
� 空操作指令 NOP
� 进入休眠方式指令 SLEEP
� 清零看门狗计数器 WDR
AVR 汇编语言系统
� 编译调试环境 AVR Studio 4.12 460
� 汇编语言语句
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
� [标号:] 伪指令 [操作数][;注释]
� [标号:] 指令 [操作数][;注释]
� [;注释]
� 空行
AVR 汇编语言系统
� 18条汇编器伪指令
� BYTE 在RAM 中定义预留存储单元
� CSEG 声明代码段
� DB 定义字节常数
� DEF 定义寄存器符号名
� DEVICE 指定为何器件生成汇编代码
� DSEG 声明数据段
� DW 定义字常数
� EQU 定义标识符常量
� ESEG 声名E2PROM段
AVR 汇编语言系统
� 18条汇编器伪指令
� EXIT 退出文件
� INCLUDE 包含指定的文件
� MACRO 宏定义开始
� ENDMACRO 宏定义结束
� LISTMAC 列表宏表达式
� LIST 列表文件生成允许器
� NOLIST 关闭列表文件生成
� ORG 设置程序起始位置
� SET 赋值给标识符
AVR 汇编语言系统
� 器件定义文件“m16def.inc”
� 函数
� LOW(表达式) 返回一个表达式值的最低字节。
� HIGH(表达式) 返回一个表达式值的第二个字节。
� BYTE2(表达式) 与HIGH 函数相同。
� BYTE3(表达式) 返回一个表达式值的第三个字节。
� BYTE4(表达式) 返回一个表达式值的第四个字节。
� LWRD(表达式) 返回一个表达式值的 0~15 位。
� HWRD(表达式) 返回一个表达式值的 16~31 位。
� PAGE(表达式) 返回一个表达式值的16~21 位。
� EXP2(表达式) 返回(表达式值)2 次幂的值。
� LOG2(表达式) 返回Log2(表达式值)的整数部分。
AVR 汇编语言程序实例分析
� ;My Very First AVR Project
� .include “m16def.inc"
; Includes the m16 definitions file
� .def Temp = R16
; Gives "Defines" RegisterR16 the name Temp
� .org 0x0000
; Places the following code from address 0x0000
� rjmp RESET
; Take a Relative Jump to the RESET Label
� RESET: ;Reset Label
� ldi Temp, 0xFF
; Ftore 255 in R16 (Since we have defined R16 = Temp)
� out DDRB, Temp
;Store this value in The PORTB Data direction Register
� Loop: ;Loop Label
� out PORTB, Temp
;Write all highs (255 decimal) to PORTB
� dec Temp
;Decrement R16 (Temp)
� rjmp Loop
;Take a relative jump to the Loop label
第三章 完