第四章
AVR
单片机指令系统
4
1
第四章 AVR 单片机指令系统
说明:
为了½读者和用户迅速掌握 AVR 指令系统的功½,边学习,边实践,希望大家
先学习<<第三章 AVR 开发工具>> 根据我们的实际教学经验,有的书籍是根据英文
原
文翻译,程序及说明可½不合中½人习惯 ,又由于印刷等多种原因 ,内容有出入,学起
来较难 我们是参考有关资料,并在实际工½中验证,并编写有关测试程序(含中文注
释),在模拟调试½件窗口观察通过,或在实时仿真器或在 SL-AVR 下½½开发下½½实验
器上验证通过,把测试实验程序刻在光盘上,保证用户学习 实验时少走弯路 所以我
们先学习系统½件的½用,然后学指令系统,用户一边学习 AVR 指令系统,
一边学习系
统½件编程调试,这样½指令功½流向看得见摸得着,学习起来有声有色,达到事半功
倍的效果 ½学完所有指令,½也学会了用½件编程开发调试 我们的想法希望½½
去边学边实践,并得到½的认可,我们就谢谢了
AVR 单片机每条指令对应的实验源程序见文件夹<<指令 ASM>>
计算机的指令系统是一套控制计算机操½的代码 称之为机器语言 计算机只½识别和执行
机器语言的指令 为了便于人们理解 记忆和½用 通常用汇编语言指令来描述计算机的指令系
统 汇编语言指令可通过汇编器翻译成计算机½识别的机器语言
AVR 单片机指令系统是 RISC 结构的精简指令集 是一种简明易掌握﹑效率高的指令系统
AVR 单片机指令系统速查表,不同器件½用不同的指令表,见附½ 3:
(1) 89
条指令器件:AT90S1200,最基本指令;
(2) 90
条指令器件(
):Attiny11/12/15/22; 90
条指令=
+89
条基本指令
(3) 118
条指令器件(
):AT90S2313/2323/2343/2333,/4414/4433/4434/8515/90S8534/8535
;118
条指令=
+ 90
条;
(4) 121
条指令器件(
)ATmega603/103; 121
条指令=
+ 118
条;
(5) 130
条指令器件(
)ATmega161;
130
条指令=
+121
条
AVR 大多数执行时间为单个时钟周期 这一章主要分析 AVR 单片机指令系统的功½和½用方法
下表为常用 AVR 器件指令表:
广州天河双龙电子有限公司
http://WWW.SL.COM.CN
第四章
AVR
单片机指令系统
4
2
AVR 器件(指令速查表) 118 条指令器件
AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/8515,AT90S8534/8535
算术和逻辑指令
ADD Rd,Rr
加法
ADC Rd,Rr
带进½加
ADIW Rdl,K
加立即数
SUB Rd,Rr
减法
SUBI Rd,Rr
减立即数
SBC Rd,Rr
带进½减
SBCI Rd,K
带
C
减立即数
减立即数
SBIW Rdl,K
AND Rd,Rr
与
ANDI Rd,K
与立即数
OR Rd,Rr
或
ORI Rd,K
或立即数
EOR Rd,Rr
异或
COM Rd
取反
NEG Rd
取补
SBR Rd,K
寄存器½½½
CBR Rd,K
寄存器½清零
INC Rd
加
1
DEC Rd
减
1
TST Rd
测试零或负
CLR Rd
寄存器清零
SER Rd
寄存器½
FF
条件½移指令
RJMP k
相对½移
IJMP
间接½移(Z)
RCALL k
相对调用
ICALL
间接调用(Z)
RET
子程序返回
RETI
中断返回
CPSE Rd,Rr
比较相等跳行
CP Rd,Rr
比较
CPC Rd,Rr
带进½比较
CPI Rd,K
与立即数比较
SBRC Rr,b
½清零跳行
SBRS Rr,b
½½½跳行
SBIC P,b
I/O
½清零跳行
SBIS P,b
I/O
½½½跳行
BRBS s,k
SREG
½½½½
BRBC s,k
SREG
½清零½
BREQ k
相等½移
BRNE k
不相等½移
BRCS k
C
½½½
BRCC k
C
清零½
BRSH k
½
BRLO k
小于½(无符号)
BRMI k
负数½移
BRPL k
正数½移
BRGE k
½(带符号)
BRLT k
小于½
(
带符号
)
BRHS k
H
½½½移
BRHC k
H
清零½移
BRTS k
T
½½½移
BRTC k
T
清零½移
BRVS k
V
½½½移
BRVC k
V
清零½移
BRIE k
中断½½½½移
BRID k
中断½清零½移
数据传送指令
MOV Rd,Rr
寄存器传送
LDI Rd,Rr
装入立即数
LD Rd, X
X
间接取数
LD Rd, X+
X
间接取数后
LD Rd,-X
X
间接取数先
LD Rd,Y
Y
间接取数
LD Rd,Y+
Y
间接取数后
LD Rd,–Y
Y
间接取数先
LDD Rd,Y+q Y
间接取数
q
LD Rd, Z
Z
间接取数
LD Rd, Z+
Z
间接取数后
LD Rd,–Z
Z
间接取数先
LDD Rd, Z+q Z
间接取数
q
LDS Rd,K
从
SRAM
装入
ST X ,Rr
X
间接存数
ST X+ ,Rr
X
间接存数后
ST –X ,Rr
X
间接存数先
ST Y ,Rr
Y
间接存数
ST Y+ ,Rr
Y
间接存数后
ST –Y ,Rr
Y
间接存数先
STD Y+q ,Rr
Y
间接存数
q
ST Z ,Rr
Z
间接存数
ST Z+ ,Rr
Z
间接存数后+
ST –Z ,Rr
Z
间接存数先-
STD Z+q ,Rr Z
间接存数+q
STS k,,Rr
数据送
SRAM
LPM
从程序区取数
IN Rd,P
从/O 口取数
OUT P, Rdr
存数
I/O
口
PUSH Rr
压栈
POP Rd,
出栈
½指令和½测试指令
SBI P,b
½½
I/O
½
CBI P,b
清零
I/O
½
LSL Rd
左移
LSR Rd
右移
ROL Rd
带进½左循环
ROR Rd
带进½右循环
ASR Rd
算术右移
SWAP Rd
半字节交换
BSET s
½½
SREG
BCLR s
清零
SREG
BST Rr,b
Rr
的
b
½送
T
BLD Rd
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/22=
+89
条基本指令是
AT90S1200
118
条指令器件=
+ 90
条指令器件
广州天河双龙电子有限公司
http://WWW.SL.COM.CN
第四章
AVR
单片机指令系统
4
3
4.1 指令格式
4 . 1 . 1 汇编指令
汇编语言源文件是由汇编语言代码和汇编程序指令所组成的 ASCII 字符文件
一
汇编语言源文件
汇编语言源文件包括指令助记符 标号和伪指令 指令助记符和伪指令常带操½数
每条程序输入行首先是标号,标号为字母数字串 并带一个冒号 ½用标号的目的是为了跳
½和½移指令及在程序存储器和 SRAM 中定义变量名
程序输入行有下列四种½式
1) 标号 伪指令 操½数 注释义
2 标号 指令 操½数 注释
(3)注释
4 空行
注释有下列½式 文字
括号内的项是任选的 用于注释的分号
及到行结尾的文字 汇编器是½略的 标号
指令和伪指令在后面有详细说明
例子
L½½½½ .EQU V½½1=100 ½ V½½1 等于 100 伪指令
.EQU V½½2=200 ½ V½½2 等于 200
½½½½: ½½½½ ½½½½ 无限循环 指令
纯注释行
另一个注释行
注意 不限制有关标号 伪指令 注释或指令的列½½
二 指令助记符
汇编器认可指令集中的指令助记符 指令集中综合了助记符并给出了参数
操½数有下列½式
R½ RO R31 或 R16 R31 取决于指令
R½ RO R31
½ 常数 0 7 可½是常数表达式
S 常数 0 7 可½是常数表达式
½ 常数(0 31 63 可½是常数表达式
K 常数 0 255 可½是常数表达式
½ 常数 值范围取决于指令 可½是常数表达式
½ 常数 0 63 可½是常数表达式
4 . 1 . 2 汇编器伪指令
汇编器提供一些伪指令 伪指令并不直接½换成操½数 而是用于调整存储器中程序的½½
定义宏 初始化存储器等 全部伪指令在表 4.2 中给出
1 BYTE
保存字节到变量
BYTE 伪指令保存存储的内容到 SRAM 中 为了½提供所要保存的½½ BYTE 伪指令前应有
标号 该伪指令带一个表征被保存字节数的参数 该伪指令仅用在数据段内 见伪指令 CSEG DSEG
和 ESEG 注意 必须带一个参数 字节数的½½不需要初始化
语法 LABEL BYTE 表达式
广州天河双龙电子有限公司
http://WWW.SL.COM.CN
第四章
AVR
单片机指令系统
4
4
2 CSEG 一代码段
CSEG 伪指令定义代码段的开始½½ 一个汇编文件包含几个代码段 这些代码段在汇 编时
被连接成一个代码段 在代码段中不½½用 BYTE 伪指令 典型的缺省段为代码段 代码段有一个
字定½计数器 ORG 伪指令用于放½代码段和放½程序存储器指定½½的常数
CSEG 伪指令不带参数
语法 CSEG
表 4.2 伪指令表
序号 伪指令
说 明
序号 伪指令 说 明
1
BYTE
保存字节到变量
10 ESEG
E2PROM 段
2
CSEG
代码段
11 EXIT
退出文件
3
DB
定义字节常数
12 INCLUDE 从指定文件开始读
4
DEF
设½寄存器的符号名 13 LIST
打开列表文件
5
DEVICE
定义被汇编的器件 14 LISTMAC 打开宏表达式
6
DSEG
数据段
15 MACRO 宏开始
7
DW
定义字常数
16 NOLIST 关闭列表文件
8
ENDMACRO 宏结束
17 ORG
设½程序起始½½
9
EQU
符号相等于表达式 18 SET
赋值给一个标号
3 DB
在程序存储器或 E2PROM 存储器中定义字节常数
DB 伪指令保存数据到程序存储器或 E2PROM 存储器中 为了提供被保存的½½ 在 DB 伪指令
前必须有标号 DB 伪指令可带一个表达式表 至少有一个表达式 DB 伪指令必须放在代码段或
E2PROM 段 表达式表是一系列表达式 用逗号分隔 每个表达式必须是一 128 255 之间的有效值
如果表达式有效值是负数 则用 8 ½ 2 的补码放在程序存储器或 E2PROM 存储器中 如果 DB 伪指
令用在代码段 并且表达式表多于一个表达式 则以两个字节组合成一个字放在程序存储器中
如果表达式表是奇数 那么最后一个表达式将独自以字格式放在程序存储器中 而不管下一行汇
编代码是否是单个 DB 伪指令
语法 LABEL DB 表达式
4 DEF
设½寄存器的符号名
DEF 伪指令允许寄存器用符号代替 一个定义的符号用在程序中 并指定一个寄存器,一个寄
存器可以赋几个符号 符号在后面程序中½再定义
语法 DEF 符号一寄存器
5 DEVICE
定义被汇编的器件
DEVICE 伪指令允许用户告知汇编器被执行的代码½用那种器件 如果½用该伪指令 若在代
码中有指定的器件不提供的指令 则提示一个警告 如果代码段或 E2PROM 段的尺寸大于被指定器
件的尺寸 也提示警告 如果不½用 DEVICE 伪指令 则假定器件提供所有的指令 也不限制存储
器尺寸
语法 .DEVICE AT90S1200 AT90S2313 AT90S4414 AT9OS8515
6 DSEG 一数据段
DSEG 伪指令定义数据段的开始 一个汇编文件½包含几个数据段 这些数据段在汇编时
被连接成一个数据段 一个数据段正常仅由 BYTE 伪指令 和标号 组成 数据段有自己的定
½字节计数器 ORG 伪指令被用于在 SRAM 指定½½放½变量 DSEG 伪指令不带参数
语法 .DSEG
7 DW——在程序存储器和 E2PROM 存储器中定义字常数
DW 伪指令保存代码到程序存储器或 E2PROM 存储器 为了提供被保存的½½ 在 DW 伪指
令前必须有标号 DW 伪指令可带一个表达式表 至少有一个表达式 DW 伪指令必须放在
代码段或 E2PROM 段 表达式表是一系列表达式 用逗号分隔 每个表达式必须是一 32 768
65 535 之间的有效值 如果表达式有效值是负数 则用 16 ½ 2 的补码放在程序存储器中
广州天河双龙电子有限公司
http://WWW.SL.COM.CN
第四章
AVR
单片机指令系统
4
5
语法 LABEL .DW 表达式表
8·ENDMACRO 一宏结束
ENDMACRO 伪指令定义宏定义的结束 该伪指令并不带参数 参见 MACRO 宏定义伪指令
语法 .ENDMACRO
9 EQU
——
设½一个符号相等于一个表达式
EQU 伪指令赋一个值到标号 该标号用于后面的表达式 用 EQU 伪指令赋值的标号是一个
常数 不½改变或重定义
语法 .EQU 标号= 表达式
10 ESEG - E2PROM 段
ESEG 伪指令定义 E2PROM 段的开始½½ 一个汇编文件包含几个 E2PROM 段 这些 E2PROM
段在汇编时被连接成一个 E2PROM 段 在 E2PROM 段中不½½用 BYTE 伪指令 E2PROM 段有一
个字节定½计数器 ORG 伪指令用于放½ E2PROM 存储器指定½½的常数 ESEG 伪指令不带参数
语法 .ESEG
11 EXIT——退出文件
EXIT 伪指令告诉汇编器停止汇编该文件 正常情况下 汇编器汇编到文件的结束 如果
EXIT 出现在包括文件中 则汇编器从文件中 INCLUDE 伪指令行继续汇编
语法 .EXIT
12·INCLUDE——包括另外的文件
INCLUDE 伪指令告诉汇编器从指定的文件开始读 然后汇编器汇编指定的文件 直到文件
结束或遇到 EXIT 伪指令 一个包括文件也可½自己用 INCLUDE 伪指令来表示
语法 .INCLUDE“文件名”
13 LIST——打开列表文件生成器
LIST 伪指令告诉汇编器打开列表文件生成器 汇编器生成一个汇编源代码 地址和操½
代码的文件列表 列表文件生成器缺省值是打开 该伪指令总是与 NOLIST 伪指令一起出现
用于生成列表或汇编源文件有选择的列表
语法 .LIST
14 LISTMAC——打开宏表达式
LISTMAC 伪指令告诉汇编器 ½调用宏时 用列表生成器在列表文件中显示宏表达式
缺省值仅是在列表文件中显示宏调用参数
语法 .LISTMAC
15 MACRCO 一宏开始
MACRO 伪指令告诉汇编器这是宏开始 MACRO 伪指令带宏名和参数 ½后面的程序中写
了宏名 被表达的宏程序在指定½½被调用 一个宏可带 10 个参数 这些参数在宏定义中
用 0
9 代表 ½调用一个宏时 参数用逗号分隔 宏定义用 ENDMACRO 伪指令结束
缺省值为汇编器的列表生成器 仅列表宏调用 为了在列表文件中包括宏表达式 必须½
用 LISTMAC 伪指令 在列表文件的操½代码域内宏用 ½+ ½记号
语法 .MACRO 宏名
16 NOLIST--关闭列表文件生成器
NOLIST 伪指令告诉汇编器关闭列表文件生成器 正常情况下 汇编器生成一个汇编源
代码 地址和操½代码文件列表 缺省时为打开列表文件 ½是可用该伪指令禁止列表 为
了½被选择的汇编源文件部分产生列表文件 该伪指令可以与 LIST 伪指令一起½用
语法 .NOLIST
17 ORG 一设½程序起始½½
ORG 伪指令设½定½计数器一个绝对值 设½的值为一个参数 如果 ORG 伪指令放在数
据段 则设½ SRAM 定½计数器 如果该伪指令放在代码段 则设½程序存储器计数器 如
果该伪指令放在 E2PROM 段 则设½ E2PROM 定½计数器 如果该伪指令前带标号 在相同
的源代码行 则标号由参数值给出 代码和 E2PROM 定½计数器的缺省值是零 而½汇编启
广州天河双龙电子有限公司
http://WWW.SL.COM.CN
评论