ARM汇编语言程序设计基础
通过OPT伪操作可以在源程序中设置列表选项。
TTL
TTL title
在列表文件的每一页的开头插入一个标题。
SUBT SUBT subtitle
2022/3/22
在列表文件的每一页的开头插入一个子标题。
8
伪操作
CODE16
CODE32 EQU AREA ENTRY END ALIGN
EXPORT/ GLOBAL
当满足某条件时对一组语句进行编 译,而当条件不满足时则编译另一 组语句。其中else可以缺省。
14
其他伪操作
伪操作 语法格式
.eject .eject
.list
.list
.nolist .nolist
.title .title “heading”
.sbttl .sbttl “heading”
.ltorg .ltorg
{$label} macroname {$parameter{,
MEND标识宏定义的结束。MERIT 用于从宏中跳转出去。用MACRO
$parameter}…}
和MEND定义的一段代码,称为宏
…
;宏代码
定义体。通过宏名称来调用宏。
MEND
信息报告伪操作
伪操作
语法格式
作用
ASSERT
INFO OPT
2022/3/22
4
符号定义伪操作
伪操作
语法格式
作用
GBLA
GBLA Variable
声明一个全局的算术变量,并将其初始化成0。
GBLL
GBLL Variable
声明一个全局的逻辑变量,并将其初始化成{FALSE}。
GBLS
GBLS Variable
声明一个全局的字符串变量,并将其初始化成空串“”。
数 据 定 义 伪 操 作
在ARM代码中分配一段字对齐的内存单元; 在Thumb代码中, 分配一段半字对齐的半字内存单元。
分配一段以双字(8个字节)为单位的内存
DCW用于分配一段半字对齐的半字内存单元。
汇编控制伪操作
伪操作
语法格式
作用
IF,ELSE IF logical expression 及ENDIF …
IMPORT
EXTERN
GET/ INCLUDE
INCBIN KEEP NOFP
REQUIRE
RN ROUT
CODE16语法格式C NhomakorabeaDE32
name EQU expr{,type}
AREA attr}…
ENTRY
sectionname { , attr } { ,
END
ALIGN {expr{,offset}}
EXPORT symbol {[WEAK]}
IMPORT symbol {[WEAK]}
EXTERN symbol {〔WEAK〕}
GET filename
INCBIN filename KEEP{symbol} NOFP REQUIRE lable name RN expr {name} ROUT
ARM汇编语言程序设计基础
1 ARM汇编语言的伪操作、宏指令与伪指 令 2 ARM汇编语言程序设计 3 嵌入式C语言程序设计基础 4 嵌入式C语言程序设计技巧 5 C与汇编语言混合编程
2022/3/22
1
1 ARM汇编语言的伪操作、宏指令与伪指令
两种常见的ARM编译开发环境 ADS编译环境下的伪操作和宏指令 GNU编译环境下的伪操作和宏指令 ARM汇编语言的伪指令
DCFD/ DCFDU DCFS/ DCFSU
DCI
DCQ/ DCQU DCW/ DCWU
语法格式
LTORG
MAP expr{,base-register}
{label} FIELD expr
{label} SPACE expr
{label} DCB expr{,expr}
{label} DCD expr {,expr}…
2022/3/22
分配一段内存单元,用value将内存单元初始化。
12
汇编程序代码控制伪操作
伪操作
语法格式
作用
.section
.section expr
定义域中包含的段。
.text
.text {subsection} 将操作符开始的代码编译到代码段或代码段子段。
.data
.data {subsection} 将操作符开始的数据编译到数据段或数据段子段。
.req
.req name,expr
.err
.err
.print .print string
.fail
.fail expr
作用
在汇编符号列表文件中插入一分页符。 产生汇编列表(从 .list 到 .nolist)。 表示汇编列表结束处。 使用“heading ”作为标题。 使用“heading”作为子标题。 在当前段的当前地址(字对齐)产生一个文字池。 为一个特定的寄存器定义名称。 使编译时产生错误报告。 打印信息到标准输出。 编译汇编文件时产生警告。
作用
告诉汇编编译器后面的指令序列为16位的Thumb指令
告诉汇编编译器后面的指令序列为32位的ARM指令。
为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。
定义一个代码段或者数据段。
指定程序的入口点。 告诉编译器已经到了源程序结尾。 通过添加补丁字节使当前位置满足一定的对齐方式。 声明一个符号可以被其他文件引用,相当于声明了一个全局变量。
CP
name CP expr
为一个协处理器定义名称。
DN/SN
name DN/SN expr
2022/3/22
FN
name FN expr
DN/SN为一个双精度/单精度的VFP寄存器定义名称。 5
为一个FPA浮点寄存器定义名称。
伪操作
LTORG
MAP
FIELD
SPACE
DCB
DCD/ DCDU
DCDO
伪操作
语法格式
.macro、.exitm 及.endm
.macro acroname {parameter{, parameter}…}
…
.endm
. ifdef,.else 及.endif
.ifdef condition … .else … .endif
2022/3/22
作用
.macro伪操作标识宏定义的开 始,.endm标识宏定义的结束。 用.macro及.endm定义一段代码,称 为宏定义体。.exitm伪操作用于提前 退出宏。
SETL
SETL Variable expr
给一个全局或局部逻辑变量赋值。
SETS
SETS Variable expr
给一个全局或局部字符串变量赋值。
RLIST
Name RLIST{list of registers} 为一个通用寄存器列表定义名称。
CN
name CN expr
为一个协处理器的寄存器定义名称。
ADS汇编的语法规则
所有标号必须在一行的顶格书写,后 面不要加冒号(:) 所有的指令均不能顶格书写 大小写敏感(可以全部大写或全部小 写,但不能大小写混合使用) 注释使用分号(;)
2022/3/22
10
GNU编译环境下的伪操作和宏指令(重点)
GNU编译环境下的伪操作可分为以下几类: 常量编译控制伪操作 汇编程序代码控制伪操作 宏及条件编译控制伪操作 其他伪操作
分配一段字节内存单元,并用expr初始化。 分配一段半字内存单元,并用expr初始化。 定义字符串expr(非零结束符)。 定义字符串expr(以/0为结束符)。 定义一个32bit IEEE 浮点数expr。 定义64bit IEEE浮点数expr。
.word/.long /.int
.fill
.zero
其 他
告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在 本源文件中可能引用该符号。
告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在 本源文件中可能引用该符号。
将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。
将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。 告诉编译器将局部符号包含在目标文件的符号表中。 禁止源程序中包含浮点运算指令。 指定段之间的相互依赖关系。 为一个特定的寄存器定义名称。 定义局部变量的有效范围。
{ELSE …}
ENDIF WHILE 及 WHILE logical expression WEND …
WEND
能够根据条件把一段源代码包括在 汇编语言程序内或者将其排除在程 序之外。
能够根据条件重复汇编相同的一段 源代码。
MACRO 、MACRO
MACRO 标 识 宏 定 义 的 开 始 ,
MEND 及 MEXIT
{ label } DCDO expr { , expr}… {label} DCFD {U}fpliteral {,fpliteral}… {label} DCFS {U} fpliteral {,fpliteral}… {label} DCI expr { , expr}…
{label} DCQ{U}{﹣} literal{,{﹣}literal}…
标记汇编文件的结束行,即标号后的代码不作处理。
.include
.include “filename” 将一个源文件包含到当前源文件中。
.align/.balign
Align {alignment} 通过添加填充字节使当前位置满足一定的对齐方式。 {,fill} {,max}