汇编语言语句格式
汇编语言程序是由一系列汇编语句组成的。AVR的汇编语句的标准格式有以下4种:
- [标号:]伪指令[操作数][;注释]
- [标号:]指令[操作数][;注释]
- [;注释]
- 空行
括号部分表示可以缺省
标号。标号是语句地址的标记符号,用于引导对该语句的访问和定位。使用标号的目的是为了跳转和分支指令,以及在程序存储器、数据存储器SRAM和EEPROM中定义变量名。
- 标号一般由ASCII字符组成,第一个字符为字母;
- 同一标号在一个独立的程序中只能定义一次;
- 不能使用汇编语言中已定义的符号(保留字),如指令字、寄存器名、伪指令等等。
- 伪指令。伪指令不属于CPU指令集,编译时并不产生实际的目标机器操作代码,只是用于在汇编程序中对地址、寄存器、数据、常量等进行定义说明,以及对编译过程进行某种控制。
- 指令。指令是汇编程序中主要的部分,汇编程序中使用AVR指令集中的全部指令。
- 操作数。集指令操作时所需要的数据或地址。就是指令。操作时所需要的数据和地址。汇编程序完全支持指令系统所定义的操作数格式。但指令系统采用的操作数格式通常为数字形式,在编写程序时使用起来不太方便,因此,在编译器的支持下,可以使用多种形式的操作数,如数字、标识符、表达式等。
- 注释。注释部分仅用于对程序和语句进行说明,帮助程序设计人员阅读、理解和修改程序。注释内容长度不限,换行时也需要分号。
- 其他字符。在汇编语句中,“;”用于标号之后;空格用于指令字和操作数的分隔;指令有两个操作数时用“,”分隔两个操作数;“;”用于注释之前;“[]”中的内容表示可选项。
汇编器伪指令
AVR汇编系统使用的伪指令有18条:
序号 | 伪指令 | 说明 |
---|---|---|
1 | BYTE | 在RAM中定义预留存储单元 |
2 | CSEG | 声明代码段 |
3 | DB | 定义字节常数 |
4 | DEF | 定义寄存器富符号名 |
5 | DEVICE | 指定为何器件生成汇编代码 |
6 | DSEG | 声明数据段 |
7 | DW | 定义字常数 |
8 | EQU | 定义标识符常量 |
9 | ESEG | 声明EEPROM段 |
10 | EXIT | 退出文件 |
11 | INCLUDE | 包含指定的文件 |
12 | MACRO | 宏定义开始 |
13 | ENDMACRO | 宏定义结束 |
14 | LISTMAC | 列表宏表达式 |
15 | LIST | 列表文件生成允许器 |
16 | NOLIST | 关闭列表文件生成 |
17 | ORG | 设置程序起始位置 |
18 | SET | 赋值给标识符 |
表达式
操作数
- 用户定义的标号,该标号给出了放置标号位置的定位计数器的值。
- 用户用SET伪指令定义的变量
- 用户用EQU伪指令定义的常数
- 整数常数(比如十进制、十六进制、二进制数)
- PC——程序存储器定位计数器当前的值
函数
- LOW(表达式) 返回一个表达式值的最低字节
- HIGH(表达式) 返回一个表达式值的第2个字节
- BYTE2(表达式) 与HIGH函数相同
- BYTE3(表达式) 返回一个表达式值的第3个字节
- BYTE4(表达式) 返回一个表达式值的第4个字节
- LWRD(表达式) 返回一个表达式值的0~15位
- HWRD(表达式) 返回一个表达式值的16~31位
- PAGE(表达式) 返回一个表达式值的16~21位
- EXP2(表达式) 返回一个表达式值2次幂的值
- LOG2(表达式) 返回log2(表达式值)的整数部分
- 运算符
部分运算符如下表,优先级数越高的运算符,其优先级也越高,表达式可以用小括号括起来,并且与括号外其他任意的表达式再组合成表达式。
序号 | 运算符 | 名称 | 优先级 | 说明 |
---|---|---|---|---|
1 | ! | 逻辑非 | 14 | 一元运算符,表达式是0返回1;表达式是返回0 |
2 | ~ | 逐位非 | 14 | 一元运算符,将表达式的值按位取反 |
3 | - | 负号 | 14 | 一元运算符,使表达式为算术负 |
4 | * | 乘法 | 13 | 二进制运算符,两个表达式相乘 |
5 | / | 除法 | 13 | 二进制运算符,左边表达式除以右边表达式,得整数的商值 |
6 | + | 加法 | 12 | 二进制运算符,两个表达式相加 |
7 | - | 减法 | 12 | 二进制运算符,左边表达式减去右边表达式 |
8 | << | 左移 | 11 | 二进制运算符,左边表达式值左移右边表达式所给出的次数 |
9 | >> | 右移 | 11 | 二进制运算符,左边表达式值右移右边表达式所给出的次数 |
10 | < | 小于 | 10 | 二进制运算符,左边带符号表达式值小于右边带符号表达式值,则为1;否则为0 |
11 | <= | 小于等于 | 10 | 二进制运算符,左边带符号表达式值小于或等于右边带符号表达式值,则为1;否则为0 |
12 | > | 大于 | 10 | 二进制运算符,左边带符号表达式值大于右边带符号表达式值,则为1;否则为0 |
13 | >= | 大于等于 | 10 | 二进制运算符,左边带符号表达式值大于或等于右边带符号表达式值,则为1;否则为0 |
14 | == | 等于 | 9 | 二进制运算符,左边带符号表达式值等于右边带符号表达式值,则为1;否则为0 |
15 | != | 不等于 | 9 | 二进制运算符,左边带符号表达式值不等于右边带符号表达式值,则为1;否则为0 |
16 | & | 逐位与 | 8 | 二进制运算符,两个表达式之间逐位与 |
17 | ^ | 逐位异或 | 7 | 二进制运算符,两个表达式之间逐位异或 |
18 | | | 逐位或 | 6 | 二进制运算符,两个表达式之间逐位或 |
19 | && | 逻辑与 | 5 | 二进制运算符,两个表达式之间逻辑与,全非0则为1;否则为0 |
20 | || | 逻辑或 | 4 | 二进制运算符,两个表达式之间逻辑或,非0则为1;全0则为0 |
器件定义头文件m16def.inc
略...