字节对齐 ALIGN
ALIGN; 声明4字节对齐
定义一个数字常量定义 EQU
NAME EQU expr {type}
PLLCON EQU 0xE01FC080;定义PLLCON,类似于C的宏或C++的常量
包含文件 GET和INCLUDE
INCLUDE lpc2106.inc
NOP 空指令
在汇编时会被ARM的空操作代替,比如MOV R0,R0,一般用于延时与占位。
声明一个外部符符号 IMPORT,EXTERN
IMPORT,EXTERN 向外部导入一个符号,一般是外部程序全局变量
条件编译:[]。类似于C的#ifdef 之类定义。
格式 :[ 条件表达式
满足条件分支
|
不满足条件分支
]
示例1:
[ ENTRY_BUS_WIDTH=32 ;类似#if ENTRY_BUS_WIDTH=32
b ChangeBigEndian ;DCD 0xea000007
] ; 类似#endif
示例2: [ CLKDIV_VAL>1 ; 类似#if CLKDIV_VAL>1
bl MMU_SetAsyncBusMode
|;类似#else
bl MMU_SetFastBusMode ; default value.
]; 类似#endif
示例3 [ THUMBCODE 类似#ifdef THUMBCODE
bx lr
| ;类似#else
mov pc,lr
] ;类似#endif
段定义 AREA
指令集定义 CODE16和CODE32
指示是Thumb 指令集(压缩指令集,每个指令16位)。还是普通32位指令集
汇编结束:END
程序入口ENTRY
一个基本ARM程序结构
源代码由文本文件组成.按照汇编的编译器不同,分为两大量,一类是ADS的汇编程序,一类是GNU汇编格式,两者在指令集是完成一样,但是在伪指令.程序结构等方法各不同相同.本节主要是讲解ADS汇编格式.
ADS汇编程序,主要包含如下几类程序:
- 汇编源程序,后缀名是.S
- 汇编包含文件,后缀名是.inc
- 如果是与C混和编程..C,.h也能识别
ARM 汇编语句格式
[标号] <指令|条件|S> <操作数> [;注释]
- 所有标号顶格写,而指令和伪指令不能顶格写
- 标识符(标号,指令)大小写敏感,所以要在标号和指令时书写一致,一般伪指令,指令,寄存器名可以全部为大写
- 注释以;开头,可以顶格写
- 可以使用\来分行写太长语句
- 变量,常量的定义必须在一行顶格写
常量的书写
数字常量
在程序中直接写数字 ,十进制 12,256,十六进制 0x1228,
字符常量
类似于C的定义,用SETS来定义字符常量
HELLO SETS “hello,the world!”
逻辑常量
逻辑真为{TRUE},逻辑假为{FLASE}
Testno SETS {TURE}
汇编程序的段定义
任何一个程序都要分段,C语言一般由编译器自动分段,(分成.Text,.Data段之类),但在汇编程序这样的底层程序中,由开发者自行分段. 它包含如下段
- 至少一个代码段,并且代码段是只读的,对应(.Text)
- 数据段可以没有,也可以有多个.
- 每一个段用END结束
AREA 定义一个段
AREA 段名 属性1, 属性2,
例子:AREA Init,CODE,READONLY
ENTRY 指明一个段的入口
END结束一个段
ABC EQU 0x12 AREA Example,CODE,READONLY ENTRY START MOV R7,#10 MOV R6,#5 ADD R6,R6,R7 B END
ADS ARM汇编程序格式要求:
- 所有标号要顶格写.
- 所有指令不能顶格写,一般插入Tab键在行首
- ADS ARM中,是大小写敏感的.建议标号,指令,伪指令,寄存器名全部为大写
- 注释采用;打头
- 每个程序至少有一个AREA在代码里(READONLY)
- 每个段都要用END结束(不能顶格)
最常见几个伪指令 AREA,EQU,DCB,END ,ENTRY,EXPORT,GOBEL,IMPORT
常见伪定义:
- DCB 定义字符中
Str DCB "hello, world"