汇编语言的程序格式:
以段(section)为单位组织源文件
分为代码段, 数据段, 段之间相互独立
一个ARM汇编程序至少需要一个代码段, 使用AREA伪操作标识一个段的开始, 段的名字和属性
使用伪操作ENTRY标识程序执行的第一条命令
使用伪操作END标识汇编程序结束
标号
注释
汇编语言实例:数据块复制
AREA COPY, CODE, READONLY
ENTRY
START
LDR RO, =SRC
LDR R1, =DST
MOV R2, #10
LOOP
LDR R3, [R0], #4
STR R3, [R1]. #4
SUBS R2, R2, #1
BNE LOOP
AREA COPYDATA, DATA, READWRITE
SRC DCD 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
DST DCD 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
END
符号与标号:
符号的定义:
在ARM汇编中, 使用符号表示地址, 标量和数字常量
当符号用来标识地址时, 又称为标号
符号的命名:
由字母, 数字和下划线组成, 开头不能使用数字, 但局部标号除外
符号在其作用域内必须唯一
不能与系统内部或系统预定义的符号同名
不能与指令助记符, 伪指令同名
局部标号:
通过数字0-99而不是使用名称(字符)进行地址引用
作用域为当前段
引用格式: %{F/B/A/T} N{routname}
F: 指示编译器向前搜索
B: 指示编译器向后搜索
A: 指示编译器搜索宏的所有嵌套层次
T: 指示编译器搜索宏的当前层
routname: 局部标号作用范围名称, 使用ROUT伪指令定义
若B, F没有指定, 编译器先向后搜索, 再向前搜索
伪操作:
伪操作时ARM汇编语言中一些特殊的指令助记符
主要目的是对汇编源程序指令做各种处理, 组装成一个完整的汇编程序
伪操作是为汇编器服务的, 汇编之后, 伪操作消失, 类型于C语言中的宏为编译器服务, 预处理之后, 宏消失
不同的编译环境, 伪操作格式可能不一样
常用伪操作:
符号定义伪操作: GBLA, LCLA
数据定义伪操作: DCD, DCB, SPACE
汇编控制伪操作: AREA, ENTRY, MACRO, MEND
符号定义常用伪操作:
|------------------------------------------------------------------------------|
| 伪操作 | 使用示例 | 说明 |
|------------------------------------------------------------------------------|
| GBLA | GBLA a | 声明一个全局算术变量a, 并初始化为0 |
|----------|-------------------|-----------------------------------------------|
| GBLL | GBLL a | 声明一个全局逻辑变量a, 并初始化为{FALSE} |
|----------|-------------------|-----------------------------------------------|
| GBLS | GBLS str | 声明一个全局字符串变量str, 并初始化为空串 |
|----------|-------------------|-----------------------------------------------|
| LCLA/L/S | LCLA/L/S a | 声明一个局部的算术/逻辑/字符串变量a |
|----------|-------------------|-----------------------------------------------|
| SETA | num SETA 20 | 给算术变量num赋值20 |
|----------|-------------------|-----------------------------------------------|
| SETL | bool SETL {TRUE} | 给逻辑变量bool赋值{TRUE} |
|----------|-------------------|-----------------------------------------------|
| SETS | str SETS "hello" | 给字符串变量str赋值"hello" |
|----------|-------------------|-----------------------------------------------|
| RLIST | ArReg RLIST {R0} | 给寄存器列表定义名称ArReg, 可通过LDM/STM访问 |
|----------|-------------------|-----------------------------------------------|
| CN | Cache CN 7 | 将协处理器的寄存器7命名为Cache |
|----------|-------------------|-----------------------------------------------|
| CP | memory CP 15 | 将协处理器P15命名为(ARM支持16个协处理器) |
|----------|-------------------|-----------------------------------------------|
| DN | name DN rgname | 给一个双精度VFP寄存器命名 |
|----------|-------------------|-----------------------------------------------|
| SN | name SN rgname | 给一个单精度VFP寄存器命名 |
|----------|-------------------|-----------------------------------------------|
| FN | name FN rgname | 给一个浮点寄存器命名 |
|------------------------------------------------------------------------------|
数据定义常用伪操作:
|------------------------------------------------------------------------------|
| 伪操作 | 使用示例 | 说明 |
|------------------------------------------------------------------------------|
| DCD或& |num DCD 0xffffffff | 指定编译器分配一个或多个字, 4字节对齐 |
|----------|-------------------|-----------------------------------------------|
| DCDU | DCDU 0xffffffff | 指定编译器分配一个或多个字, 不需要对齐 |
|----------|-------------------|-----------------------------------------------|
| DCB或= | DCB "A" | 指定编译器分配一个或多个字节空间 |
|----------|-------------------|-----------------------------------------------|
| SPACE或% | Buf SPACE 100 | 指定编译器分配一块连续空间, 并初始化为0 |
|----------|-------------------|-----------------------------------------------|
| MAP或^ | MAP 0xffffffff | 定义一个结构化内存表的首地址 |
|----------|-------------------|-----------------------------------------------|
| FIELD或# | a/str FIELD 4/8 | 定义一个结构化内存表中的数据域 |
|----------|-------------------|-----------------------------------------------|
|DCFD/DCFDU| - | 给双精度浮点数分配存储空间 |
|----------|-------------------|-----------------------------------------------|
|DCFS/DCFSU| - | 给单精度浮点数分配存储空间 |
|----------|-------------------|-----------------------------------------------|
| DCQ/DCQU | - | 分配双字(8 byte)存储空间 |
|----------|-------------------|-----------------------------------------------|
| DCW/DCWU | - | 分配半字(2 byte)存储空间 |
|----------|-------------------|-----------------------------------------------|
| DATA | - | 表示代码段数据的标号, 一般后跟DCD或DCB |
|----------|-------------------|-----------------------------------------------|
| LTORG | - | 声明一个文字池(数据缓冲池) |
|------------------------------------------------------------------------------|
汇编控制伪操作:
|------------------------------------------------------------------------------|
| 伪操作 | 使用示例 | 说明 |
|------------------------------------------------------------------------------|
| IF, ELSE, ENDIF | - | 条件汇编 |
|-------------------|----------|-----------------------------------------------|
| WHILE, WEND | - | 重复汇编中一段相同的源代码 |
|-------------------|----------|-----------------------------------------------|
| MACRO, MEND, MEXIT| - | 宏定义 |
|------------------------------------------------------------------------------|
其他常用伪操作:
|------------------------------------------------------------------------------|
| 伪操作 | 使用示例 | 说明 |
|------------------------------------------------------------------------------|
| ALIGN | - | 使用当前位置满足一字节的对齐 |
|-------------------|----------|-----------------------------------------------|
| AREA | - | 指示汇编器代码段或数据段的开始 |
|-------------------|----------|-----------------------------------------------|
| CODE16 | - | 指示编译器后面的指令为Thumb指令 |
|-------------------|----------|-----------------------------------------------|
| CODE32 | - | 指示编译器后面的指令为ARM指令 |
|-------------------|----------|-----------------------------------------------|
| ENTRY | - | 指定程序的入口点 |
|-------------------|----------|-----------------------------------------------|
| EQU | - | 给常量定义一个符号名, 类似于宏 |
|-------------------|----------|-----------------------------------------------|
| END | - | 表示汇编源程序结束 |
|-------------------|----------|-----------------------------------------------|
| EXPORT, GLOBAL | - | 声明一个符号可以被其他文件引用 |
|-------------------|----------|-----------------------------------------------|
| IMPORT, EXTERN | - | 引用其他文件的符号, 需要先IMPORT |
|-------------------|----------|-----------------------------------------------|
| GET, INCLUDE | - | 包含一个文件 |
|------------------------------------------------------------------------------|