ARM程序设计基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0; GBLA Test1 ;定义一个全局的数字变量,变量名为
Test1 Test1 SETA 0xaa;将该变量赋值为0xaa
符号定义伪指令
2、LCLA 语法格式:LCLA (LCLL 或LCLS )局部变量名 LCLA伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。 LCLA伪指令用于定义一个局部的数字变量,并初始化为0 ; 由于是用于声明局部变量,在其作用范围内变量名必须唯一。 LCLA Test4 ;声明一个局部的数字变量,变量名为Test4 Test4 SETA 0xaa ;将该变量赋值为0xaa
若指令中包含此项时,expr+base-register的和为结构 首地址。(基于相对地址的数据结构)
例:
MAP 0xC0008
;数据结构存放的起始地址是0xC0008
^ datalabel+64
;数据结构存放的起始地址是datalabel+64
;(datalabel已定义过)
MAP 0x10,R9
data1 SPACE 256 ;定义大小为256字节的数据区
MAP、FIELD 使用MAP和FIELD伪操作描述数据结构。 MAP用于定义数据结构的起始地址; FIELD用于定义结构中的字段(各数据域的字
节长度),并可为每一个数据域指定一个标 号,其它指令可引用此标号。
注:
MAP和FIELD伪操作只是定义数据结构并不实 际分配内存单元。
符号定义伪指令
3、SETA 语法格式:变量名 SETA (SETL 或SETS )表达式 SETA伪指令用于给一个数学变量赋值;
LCLA Test3 ;声明一个局部的数字变量,变量名为 Test3
Test3 SETA 0xaa ;将该变量赋值为0xaa
数据定义伪操作
SPACE:分配一块内存单元,并用0初始化。 MAP:定义一个结构化的内存表的首地址。 FIELD:定义结构化内存表中的一个数据域。 DCB:分配一段字节内存单元,并初始化。 DCD:分配一段字内存单元,并初始化。
PC+0x3C
……
使用ADR将程序标号
=0x20+0x08+0x3C =0x64
Delay所表示的地址存入R1。
四、NOP——空操作伪指令
NOP伪指令功能实现方法:在汇编时将被替代 成ARM中的空操作,比如可能是“MOV R0,R0” 指令等。
用途:NOP可用于延时操作。 语法格式: NOP
例:延时子程序
(1)MAP ——也可以用符号”^”表示
语法格式:
MAP expr {,base-register}
或 ^ expr {,base-register}
其中:
expr:数据表达式或程序中的标号(使用MAP之 前已定义)。
base-register:基址寄存器
若指令中没有此项时,expr为结构的首地址。(基于 绝对地址的数据结构)
宏指令——通过伪操作定义的一段独立的代码。 在调用它时将宏体插入到源程序中。也就是常说的 宏。
说明:所有的伪指令、伪操作和宏指令,均与 具体的开发工具中的编译器有关,当前主要采用 ARM公司的“ADS/SDT IDE”开发工具,所以后 面的讨论,均是基于ARM公司的开发工具。
2 ARM汇编伪指令
;数据结构存放的起始地址是R9中存放的数值加上 0x10
(2)FIELD ——也可以用符号”#”表示 用户定义数据结构中的字段。 语法格式:
{label} FIELD expr
或 {label} # expr
其中:
ARM程序设计基础
ARM程序设计基础
1.伪操作和伪指令 2.ARM汇编语言语句格式 3.ARM汇编语言的程序格式 4.相关的程序示例
1 伪指令、伪操作和宏指令概念
伪指令——是汇编语言程序里的特殊指令助记符, 在汇编时被合适的机器指令替代。
伪操作——为汇编程序所用,在源程序进行汇编 时由汇编程序处理,只在汇编过程起作用,不参与 程序运行。
SPACE——也可以用符号“%”表示
用于分配一块连续的内存单元供程序使用,并且将 这个内存单元的内容初始化为0。
语法格式:
{label} SPACE expr
或 {label} % expr
其中:
{label} :是一个标号,可选项。
expr:数值表达式,用来规定内存单元的字节数。
例:
-用于定义局部变量的LCLA 、LCLL 和LCLS 。 -用于对变量赋值的SETA 、SETL 、SETS 。
符号定义伪指令
1、GBLA 语法格式:GBLA (GBLL 或GBLS )全局变量名 GBLA伪指令用于定义一个ARM程序中的全局变量,并将其
初始化。 GBLA伪指令用于定义一个全局的数字变量,并初始化为
ARM伪指令不属于ARM指令集中的指令, 是为了编程方便而定义的。伪指令可以像其 它ARM指令一样使用,但在编译时这些指令 将被等效的ARM指令代替。
ADR——小范围的地址读取
ADR伪指令功能:将基于PC相对偏移的地址值或 基于寄存器相对偏移的地址值读取到寄存器中。
ADR伪指令功能的实现方法:在汇编编译器编译 源程序时,ADR伪指令被编译器替换成一条合适的 指令。通常,编译器用一条ADD指令或SUB指令来 实现此ADR伪指令的功能,若不能用一条指令实现, 则产生错误,编译失败。
语法格式:
ADR{cond} register,expr
其中:
register:加载的目标寄存器。 expr:地址表达式。
பைடு நூலகம் 例1: ……
编译后的反汇编代码:
……
(0x20) ADR R1,Delay
……
ADD R1,PC,#0x3C ……
Delay
MOV R0,R14
(0x64) MOV
R0,R14
Delay NOP NOP NOP SUBS BNE MOV
;空操作
R1,R1,#1 Delay PC,LR
;循环次数减1
符号定义伪指令
符号定义(Symbol Definition)伪指令用于定义ARM 汇编程序中 的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令 -用于定义全局变量的GBLA 、GBLL 和GBLS 。
Test1 Test1 SETA 0xaa;将该变量赋值为0xaa
符号定义伪指令
2、LCLA 语法格式:LCLA (LCLL 或LCLS )局部变量名 LCLA伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。 LCLA伪指令用于定义一个局部的数字变量,并初始化为0 ; 由于是用于声明局部变量,在其作用范围内变量名必须唯一。 LCLA Test4 ;声明一个局部的数字变量,变量名为Test4 Test4 SETA 0xaa ;将该变量赋值为0xaa
若指令中包含此项时,expr+base-register的和为结构 首地址。(基于相对地址的数据结构)
例:
MAP 0xC0008
;数据结构存放的起始地址是0xC0008
^ datalabel+64
;数据结构存放的起始地址是datalabel+64
;(datalabel已定义过)
MAP 0x10,R9
data1 SPACE 256 ;定义大小为256字节的数据区
MAP、FIELD 使用MAP和FIELD伪操作描述数据结构。 MAP用于定义数据结构的起始地址; FIELD用于定义结构中的字段(各数据域的字
节长度),并可为每一个数据域指定一个标 号,其它指令可引用此标号。
注:
MAP和FIELD伪操作只是定义数据结构并不实 际分配内存单元。
符号定义伪指令
3、SETA 语法格式:变量名 SETA (SETL 或SETS )表达式 SETA伪指令用于给一个数学变量赋值;
LCLA Test3 ;声明一个局部的数字变量,变量名为 Test3
Test3 SETA 0xaa ;将该变量赋值为0xaa
数据定义伪操作
SPACE:分配一块内存单元,并用0初始化。 MAP:定义一个结构化的内存表的首地址。 FIELD:定义结构化内存表中的一个数据域。 DCB:分配一段字节内存单元,并初始化。 DCD:分配一段字内存单元,并初始化。
PC+0x3C
……
使用ADR将程序标号
=0x20+0x08+0x3C =0x64
Delay所表示的地址存入R1。
四、NOP——空操作伪指令
NOP伪指令功能实现方法:在汇编时将被替代 成ARM中的空操作,比如可能是“MOV R0,R0” 指令等。
用途:NOP可用于延时操作。 语法格式: NOP
例:延时子程序
(1)MAP ——也可以用符号”^”表示
语法格式:
MAP expr {,base-register}
或 ^ expr {,base-register}
其中:
expr:数据表达式或程序中的标号(使用MAP之 前已定义)。
base-register:基址寄存器
若指令中没有此项时,expr为结构的首地址。(基于 绝对地址的数据结构)
宏指令——通过伪操作定义的一段独立的代码。 在调用它时将宏体插入到源程序中。也就是常说的 宏。
说明:所有的伪指令、伪操作和宏指令,均与 具体的开发工具中的编译器有关,当前主要采用 ARM公司的“ADS/SDT IDE”开发工具,所以后 面的讨论,均是基于ARM公司的开发工具。
2 ARM汇编伪指令
;数据结构存放的起始地址是R9中存放的数值加上 0x10
(2)FIELD ——也可以用符号”#”表示 用户定义数据结构中的字段。 语法格式:
{label} FIELD expr
或 {label} # expr
其中:
ARM程序设计基础
ARM程序设计基础
1.伪操作和伪指令 2.ARM汇编语言语句格式 3.ARM汇编语言的程序格式 4.相关的程序示例
1 伪指令、伪操作和宏指令概念
伪指令——是汇编语言程序里的特殊指令助记符, 在汇编时被合适的机器指令替代。
伪操作——为汇编程序所用,在源程序进行汇编 时由汇编程序处理,只在汇编过程起作用,不参与 程序运行。
SPACE——也可以用符号“%”表示
用于分配一块连续的内存单元供程序使用,并且将 这个内存单元的内容初始化为0。
语法格式:
{label} SPACE expr
或 {label} % expr
其中:
{label} :是一个标号,可选项。
expr:数值表达式,用来规定内存单元的字节数。
例:
-用于定义局部变量的LCLA 、LCLL 和LCLS 。 -用于对变量赋值的SETA 、SETL 、SETS 。
符号定义伪指令
1、GBLA 语法格式:GBLA (GBLL 或GBLS )全局变量名 GBLA伪指令用于定义一个ARM程序中的全局变量,并将其
初始化。 GBLA伪指令用于定义一个全局的数字变量,并初始化为
ARM伪指令不属于ARM指令集中的指令, 是为了编程方便而定义的。伪指令可以像其 它ARM指令一样使用,但在编译时这些指令 将被等效的ARM指令代替。
ADR——小范围的地址读取
ADR伪指令功能:将基于PC相对偏移的地址值或 基于寄存器相对偏移的地址值读取到寄存器中。
ADR伪指令功能的实现方法:在汇编编译器编译 源程序时,ADR伪指令被编译器替换成一条合适的 指令。通常,编译器用一条ADD指令或SUB指令来 实现此ADR伪指令的功能,若不能用一条指令实现, 则产生错误,编译失败。
语法格式:
ADR{cond} register,expr
其中:
register:加载的目标寄存器。 expr:地址表达式。
பைடு நூலகம் 例1: ……
编译后的反汇编代码:
……
(0x20) ADR R1,Delay
……
ADD R1,PC,#0x3C ……
Delay
MOV R0,R14
(0x64) MOV
R0,R14
Delay NOP NOP NOP SUBS BNE MOV
;空操作
R1,R1,#1 Delay PC,LR
;循环次数减1
符号定义伪指令
符号定义(Symbol Definition)伪指令用于定义ARM 汇编程序中 的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令 -用于定义全局变量的GBLA 、GBLL 和GBLS 。