ARM嵌入式系统原理及应用开发第4章 ARM嵌入式系统程序设计及调试基础新_第1页
ARM嵌入式系统原理及应用开发第4章 ARM嵌入式系统程序设计及调试基础新_第2页
ARM嵌入式系统原理及应用开发第4章 ARM嵌入式系统程序设计及调试基础新_第3页
ARM嵌入式系统原理及应用开发第4章 ARM嵌入式系统程序设计及调试基础新_第4页
ARM嵌入式系统原理及应用开发第4章 ARM嵌入式系统程序设计及调试基础新_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2914.1 ARM嵌入式汇编语言程序设计根底嵌入式汇编语言程序设计根底 4.2 ARM嵌入式嵌入式C语言程序设计根底语言程序设计根底 4.3 ARM汇编语言与汇编语言与C/C+的混合编程的混合编程4.4 ARM ADS集成开发环境的使用集成开发环境的使用 4.5 Embest IDE集成开发环境的使用集成开发环境的使用 第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-292 在在ARM汇编语言程序里,有一些特殊指令助记符,这汇编语言程序里,有一些特殊指令助记符,

2、这些助记符与指令系统的助记符不同,没有相应的操作码,通些助记符与指令系统的助记符不同,没有相应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编语言程序作伪操作。伪指令在源程序中的作用是为完成汇编语言程序作各种准备工作的,这些伪指令仅在汇编过程起作用,一旦汇各种准备工作的,这些伪指令仅在汇编过程起作用,一旦汇编结束,伪指令的使命就完成。编结束,伪指令的使命就完成。 在在ARM得汇编程序中,有符号定义得汇编程序中,有符号定义Symbol Defintion伪指令,数据定义伪指令,数据定义D

3、ata Definition伪指令,地址读取伪伪指令,地址读取伪指令,汇编控制指令,汇编控制Assembly Control伪指令,宏指令以及伪指令,宏指令以及其它伪指令。其它伪指令。41 ARM嵌入式汇编语言程序设计根底嵌入式汇编语言程序设计根底411 ARM汇编器支持的伪指令汇编器支持的伪指令第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-293 1符号定义伪指令符号定义伪指令 1GBLA、GBLL和和GBLS 格式:格式:GBLAGBLL或或GBLS 全局变量名全局变量名 用途:定义一个用途:定义一个ARM程序中的全局变量,并将其初始程序中的全局

4、变量,并将其初始化。其中化。其中GBLA伪指令用于定义一个全局的数字变量,并初伪指令用于定义一个全局的数字变量,并初始化为始化为0;GBLL伪指令用于定义一个全局的逻辑变量,并伪指令用于定义一个全局的逻辑变量,并初始化为初始化为F假;假;GBLS伪指令用于定义一个全局的字符伪指令用于定义一个全局的字符串变量,并初始化为空。串变量,并初始化为空。 由于以上由于以上3条伪指令用于定义全局变量,因此在整个程条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。例如:序范围内变量名必须唯一。例如: GBLA Test1 ;定义一个全局的数字变量,变量名为;定义一个全局的数字变量,变量名为Tes

5、t1Test1 SETA 0 xAA ;将该变量赋值为;将该变量赋值为0 xAAGBLL Test2 ;定义一个全局的逻辑变量,变量名为;定义一个全局的逻辑变量,变量名为Test2Test2 SETL TRUE ;将该变量赋值为真;将该变量赋值为真GBLS Test3 ;定义一个全局的字符串变量,变量名为;定义一个全局的字符串变量,变量名为 Test3Test3 SETS “Testing ;将该变量赋值为;将该变量赋值为“Testing第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-294 2LCLA、LCLL、LCLS 格式:格式:LCLALCLL

6、或或LCLS局部变量名局部变量名 用途:定义一个用途:定义一个ARM程序中的局部变量,并将其初始化。程序中的局部变量,并将其初始化。其中其中LCLA伪指令用于定义一个局部的数字变量,并初始化为伪指令用于定义一个局部的数字变量,并初始化为0;LCLL伪指令用于定义一个局部的逻辑变量,并初始化为伪指令用于定义一个局部的逻辑变量,并初始化为F假;假;LCLS伪指令用于一个局部的字符串变量,并初始化伪指令用于一个局部的字符串变量,并初始化为空。为空。 由于以上由于以上3条伪指令用于声明局部变量,因此在其作用范围条伪指令用于声明局部变量,因此在其作用范围内变量名必须唯一。例如:内变量名必须唯一。例如:L

7、CLA Test4 ;声明一个局部得数字变量,变量名为;声明一个局部得数字变量,变量名为Test4Test4 SETA 0 xAA ;将该变量赋值为;将该变量赋值为0 xAALCLL Test5 ;声明一个局部的逻辑变量,变量名为;声明一个局部的逻辑变量,变量名为Test5Test5 SETL TURE ;将该变量赋值为真;将该变量赋值为真LCLS Test6 ;定义一个局部的字符串变量,变量名为;定义一个局部的字符串变量,变量名为Test6Test6 SETS “Testing ;将该变量赋值为;将该变量赋值为“Testing第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及

8、调试基础2021-12-295 3SETA、SETL、SETS 格式:变量名格式:变量名 SETASETL或或SETS 表达式表达式 用途:给一个已经定义的全局变量或局部变量赋值。用途:给一个已经定义的全局变量或局部变量赋值。 其中变量名为已经定义过的全局变量或局部变量,表达式为将其中变量名为已经定义过的全局变量或局部变量,表达式为将要赋值给变量的值。要赋值给变量的值。SETA伪指令用于给一个数学变量赋值;伪指令用于给一个数学变量赋值;SETL伪指令用于给一个逻辑变量赋值;伪指令用于给一个逻辑变量赋值;SETS伪指令用于给一个伪指令用于给一个字符串变量赋值。例如:字符串变量赋值。例如:LCLA

9、 Test3 ;声明一个局部的数字变量,变量名为;声明一个局部的数字变量,变量名为Test3Test3 SETA 0 xAA ;将该变量赋值为;将该变量赋值为0 xAA LCLL Test4 ;声明一个局部的逻辑变量,变量名为;声明一个局部的逻辑变量,变量名为Test5Test4 SETL TRUE ;将该变量赋值为真;将该变量赋值为真第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-296 4RLIST 格式:名称格式:名称 RLIST存放器列表存放器列表 用途:对一个通用存放器列表定义名称,使用该伪指令定用途:对一个通用存放器列表定义名称,使用该伪指

10、令定义的名称可在义的名称可在ARM指令指令LDM/STM中使用。在中使用。在LDM/STM指令指令中,列表中的存放器访问次序为根据存放器的标号由低到高,中,列表中的存放器访问次序为根据存放器的标号由低到高,而与列表中得存放器排列次序无关。例如:而与列表中得存放器排列次序无关。例如: RegList RLIST R0R5,R8,R10 ;将存放器列表;将存放器列表名称定义为名称定义为RegList,可在,可在ARM指令指令LDM/STM中通过该名称中通过该名称访问存放器列表。访问存放器列表。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-297 2数据定

11、义伪指令数据定义伪指令 1DCB 格式:标号格式:标号 DCB 表达式表达式 用途:分配一片连续的字节存储单元并用伪指令中的表达用途:分配一片连续的字节存储单元并用伪指令中的表达式初始化。其中,表达式可以为式初始化。其中,表达式可以为0255的数字或字符串。的数字或字符串。DCB伪指令也可用伪指令也可用“=代替。例如:代替。例如: Str DCB “This is a test! ;分配一片连续的字节存储单;分配一片连续的字节存储单元并初始化元并初始化 2DCW或或DCWU 格式:标号格式:标号 DCW或或DCWU伪指令伪指令 用途:分配一片连续的半字节存储单元,并用伪指令中指用途:分配一片连

12、续的半字节存储单元,并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达定的表达式初始化。其中,表达式可以为程序标号或数字表达式。式。DCW伪指令和伪指令和DCWU伪指令的区别仅在于用伪指令的区别仅在于用DCW伪指令伪指令分配的字存储单元是半字对齐,而用分配的字存储单元是半字对齐,而用DCWU伪指令分配的字存伪指令分配的字存储单元并不严格半字对齐。例如:储单元并不严格半字对齐。例如: DataTest DCW 1,2,3 ;分配一片连续的半字存储单元;分配一片连续的半字存储单元并初始化并初始化第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-1

13、2-298 3DCD或或DCDU 格式:标号格式:标号 DCD或或DCDU 表达式表达式 用途:分配一片连续的字存储单元并用伪指令指定的表用途:分配一片连续的字存储单元并用伪指令指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。达式初始化。其中,表达式可以为程序标号或数字表达式。DCD伪指令也可用伪指令也可用“&代替。代替。DCD伪指令和伪指令和DCDU伪指令伪指令的区别仅在于用的区别仅在于用DCD伪指令分配的字存储单元是字对齐的,伪指令分配的字存储单元是字对齐的,而用而用DCDU伪指令分配的字存储单元并不严格字对齐。例如:伪指令分配的字存储单元并不严格字对齐。例如: Fda

14、taTest DCD 4,5,6 ;分配一片连续的字存储单;分配一片连续的字存储单元并初始化元并初始化 4DCFD或或DCFDU 格式:标号格式:标号 DCFD或或DCFDU 表达式表达式 用途:为双精度的浮点数分配一片连续的字存储单元并用用途:为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定得表达式初始化。每个双精度的浮点数占据伪指令中指定得表达式初始化。每个双精度的浮点数占据2个个字单元。字单元。DCFD伪指令和伪指令和DCFDU伪指令的区别仅在于用伪指令的区别仅在于用DCFD伪指令分配的字存储单元是字对齐的,而用伪指令分配的字存储单元是字对齐的,而用DCFDU伪伪指令分配的字存储

15、单元并不严格对齐。例如:指令分配的字存储单元并不严格对齐。例如: FdataTest DCFD 2E115,-5E7 ;分配一片连续的字存储;分配一片连续的字存储单元并初始化为指定的双精度数单元并初始化为指定的双精度数第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-299 5DCFS或或DCFSU 格式:标号格式:标号 DCFS或或DCFDU 表达式表达式 用途:为单精度得浮点数分配一片连续的字存储单元并用用途:为单精度得浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据伪指令中指定的表达式初始化。每个单精度的浮点数占

16、据1个个字单元。字单元。DCFS伪指令和伪指令和DCFSU伪指令的区别仅在于用伪指令的区别仅在于用DCFS伪指令分配的字存储单元是字对齐的,而用伪指令分配的字存储单元是字对齐的,而用DCFSU伪指令分伪指令分配的字存储单元并不严格字对齐。例如:配的字存储单元并不严格字对齐。例如: FDataTEST DCFS 2E5,-5E-7 ;分配一片连续的字存;分配一片连续的字存储单元并初始化为指定的单精度数储单元并初始化为指定的单精度数 6DCQ或或DCQU 格式:标号格式:标号 DCQ或或DCQU 表达式表达式 用途:分配一片以用途:分配一片以8个字节为单位的连续存储区域并用伪个字节为单位的连续存储

17、区域并用伪指令中指定的表达式初始化。指令中指定的表达式初始化。DCQ伪指令和伪指令和DCQU伪指令的区伪指令的区别仅在于用别仅在于用DCQ伪指令分配的存储单元是字对齐的,而用伪指令分配的存储单元是字对齐的,而用DCQU伪指令分配的存储单元并不严格字对齐。例如:伪指令分配的存储单元并不严格字对齐。例如: DataTest DCQ 100 ;分配一片连续的字存储单元并初;分配一片连续的字存储单元并初始化为指定的值始化为指定的值第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2910 7SPACE 格式:标号格式:标号 SPACE 表达式表达式 用途:用途:

18、SPACE伪指令用于分配伪指令用于分配1片连续的存储区域并初始片连续的存储区域并初始化为化为0。其中,表达式为要分配的字节数。其中,表达式为要分配的字节数。SPACE也可用也可用“%代替。例如:代替。例如:DataSpace SPACE 100 ;分配连续;分配连续100字节的存储单元并初字节的存储单元并初始化为始化为0 8MAP 格式:格式:MAP 表达式表达式,基址存放器,基址存放器 用途:定义结构化的内存表的首地址。用途:定义结构化的内存表的首地址。MAP伪指令也可用伪指令也可用“代替。表达式可以为程序中的标号或数学表达式,基址代替。表达式可以为程序中的标号或数学表达式,基址存放器为可选

19、项,当基址存放器选项不存在时,表达式的值即存放器为可选项,当基址存放器选项不存在时,表达式的值即是内存表的首地址,当该选项存在时,内存表的首地址为表达是内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址存放器的和。式的值与基址存放器的和。 MAP伪指令仅用于定义数据结构,并不实际分配存储单元,伪指令仅用于定义数据结构,并不实际分配存储单元,通常可与通常可与FIELD伪指令配合使用来定义结构化的内存表。例如:伪指令配合使用来定义结构化的内存表。例如:MAP 0 x100,R0 ;定义结构化的内存表的首地址的值位;定义结构化的内存表的首地址的值位0 x100+R0第第4章章 ARM嵌

20、入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2911 9FILED 格式:标号格式:标号 FIELD 表达式表达式 用途:定义一个结构化内存表中的数据域,其中,表达用途:定义一个结构化内存表中的数据域,其中,表达式的值为当前数据域在内存表中所占的字节数。式的值为当前数据域在内存表中所占的字节数。FIELD伪指伪指令也可用令也可用“#代替。代替。 与与MAP伪指令相同,伪指令相同,FIELD伪指令仅用于定义数据结构,伪指令仅用于定义数据结构,并不实际分配存储单元。并不实际分配存储单元。FIELD伪指令常与伪指令常与MAP伪指令配合伪指令配合使用来定义结构化的内存表。使用

21、来定义结构化的内存表。MAP伪指令定义内存表的首地伪指令定义内存表的首地址,址,FIELD伪指令定义内存表中的各个数据域,并可以为每伪指令定义内存表中的各个数据域,并可以为每个数据指定一个标号供其他的指令引用。个数据指定一个标号供其他的指令引用。 例如:例如: MAP 0 x100 ;定义结构化内存表首地址的值为;定义结构化内存表首地址的值为0 x100 A FIELD 16 ;定义;定义A的长度为的长度为16字节,位置为字节,位置为0 x100 B FIELD 32 ;定义;定义B的长度为的长度为32字节,位置为字节,位置为0 x110 S FIELD 256 ;定义;定义S的长度为的长度为

22、256字节,位置为字节,位置为0 x130第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-29123地址读取伪指令地址读取伪指令第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2913 1ADR伪指令伪指令小范围的地址读取小范围的地址读取 在汇编编译器编译源程序时,在汇编编译器编译源程序时,ADR伪指令被编译器替伪指令被编译器替换成一条适宜的指令。通常,编译器用一条换成一条适宜的指令。通常,编译器用一条ADD指令或指令或SUB指令来实现指令来实现ADR伪指令的功能,假设不能用一条指令伪指令的功能,假设不能用一条

23、指令实现,那么产生错误,编译失败。实现,那么产生错误,编译失败。ADR伪指令中的地址是伪指令中的地址是基于基于PC或存放器的,当或存放器的,当ADR伪指令中的地址是基于伪指令中的地址是基于PC时,时,该地址与该地址与ADR伪指令必须在同一个代码段中。伪指令必须在同一个代码段中。 地址表达式地址表达式expression的取值范围如下:的取值范围如下: 当地址值是字节对齐时,其取值范围为当地址值是字节对齐时,其取值范围为-255B255B;当地址值是字对齐时,其取值范围为当地址值是字对齐时,其取值范围为-1020B1020B。 例如:例如:LOOP MOV R0,#10 ;LOOP 为行标,指示

24、某一行代为行标,指示某一行代码码ADR R4,LOOP ;将;将LOOP地址放入地址放入r4相对地址相对地址,因为因为PC值为当前指令地址值加值为当前指令地址值加8字节,替换成字节,替换成ADR伪伪指伪伪指令将被编译器译为令将被编译器译为;SUB R4,PC,0 xC;NOP (MOV R0,R0)第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2914 2ADRL伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRL比比ADR伪指令可以读取更大范围的地址。在汇编伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,编译器编译源程序时,ADRL伪

25、指令被编译器替换成两条适伪指令被编译器替换成两条适宜的指令。假设不能用两条指令实现,那么产生错误,编译宜的指令。假设不能用两条指令实现,那么产生错误,编译失败。失败。 地址表达式地址表达式expression的取值范围如下:的取值范围如下: 当地址值是字节对齐时,其取值范围为当地址值是字节对齐时,其取值范围为-64KB64KB;当;当地址值是字对齐时,其取值范围为地址值是字对齐时,其取值范围为-256KB256KB。 例如:例如:LOOP MOV R0,#10 ;LOOP 为行标,指示某一行代码为行标,指示某一行代码ADRL R4,LOOP ;将;将LOOP地址放入地址放入R4相对地址相对地址

26、,因为因为PC值为当前指令地址值加值为当前指令地址值加8字节,替换本钱字节,替换本钱ADRL伪伪指伪伪指令将被编译器译为令将被编译器译为;SUB R4,PC,#0 xC;NOP (MOV R0,R0)第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2915 3LDR伪指令伪指令大范围的地址读取大范围的地址读取 在汇编编译源程序时,在汇编编译源程序时,LDR伪指令被编译器替换成一条适伪指令被编译器替换成一条适宜的指令。假设加载的常数未超出宜的指令。假设加载的常数未超出MOV或或MVN的范围,那么的范围,那么使用使用MOV或或MVN指令代替该指令代替该LD

27、R伪指令,否那么汇编器将常伪指令,否那么汇编器将常量放入文字池,并使用一条程序相对偏移的量放入文字池,并使用一条程序相对偏移的LDR指令从文字池指令从文字池读出常量。读出常量。 例如:例如: LDR R1,=0 xFF ;将;将0 xFF读取到读取到R1中,编译后得到中,编译后得到 MOV R1,0 xFF 例如:例如: LDR R1,=ADDR ;将外部地址;将外部地址ADDR读取到读取到R1中,中,汇编后将得到:汇编后将得到: ;LDR R1,PC,OFFSET_TO_LPOOL ; ;LPOOL DCD ADDR第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2

28、021-12-2916 4汇编控制伪指令汇编控制伪指令 汇编控制伪指令用于控制汇编程序的执行流程。汇编控制伪指令用于控制汇编程序的执行流程。 1IF、ELSE、ENDIF 格式:格式:IF 逻辑表达式逻辑表达式 指令序列指令序列1 ELSE 指令序列指令序列2 ENDIF IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执伪指令能根据条件的成立与否决定是否执行某个指令序列。当行某个指令序列。当IF后面的逻辑表达式为真,那么执行指令序后面的逻辑表达式为真,那么执行指令序列列1,否那么执行指令序列,否那么执行指令序列2。其中,。其中,ELSE及指令序列及指令序列2可以没有,可以没有,此

29、时,当此时,当IF后面的逻辑表达式为真,那么执行指令序列后面的逻辑表达式为真,那么执行指令序列1,否那么,否那么继续执行后面的指令。继续执行后面的指令。IF、ELSE、ENDIF伪指令可以嵌套使用。伪指令可以嵌套使用。 例如:例如: GBLL Test ;声明一个全局的逻辑变量,变量名为;声明一个全局的逻辑变量,变量名为Test IF Test=TRUE 指令序列指令序列1 ELSE 指令序列指令序列2 ENDIF第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2917 2WHILE、WEND 格式:格式:WHILE 逻辑表达式逻辑表达式 指令序列指令

30、序列 WEND WHILE、WEND伪指令能根据条件的成立与否决定是否伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当循环执行某个指令序列。当WHILE后面的逻辑表达式为真,后面的逻辑表达式为真,那么执行指令序列,该指令序列执行完毕后,再判断逻辑表达那么执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,假设为真那么继续执行,一直到逻辑表达式的值为假。式的值,假设为真那么继续执行,一直到逻辑表达式的值为假。 WHILE、WEND伪指令可以嵌套使用。例如:伪指令可以嵌套使用。例如:GBLA Counter ;声明一个全局的数学变量,变量名为;声明一个全局的数学变量,变量名为Cou

31、nter Couter SETA 3 ;由变量;由变量Counter控制循环次数控制循环次数 WHILE Counter、“=、“=、“/=、“运算符。以运算符。以X和和Y表示两个逻辑表达式,以上的运算表示两个逻辑表达式,以上的运算符代表的运算如下:符代表的运算如下:X=Y表示表示X等于等于Y;XY表示表示X大于大于Y;X=Y表示表示X大于等于大于等于Y;X=Y表示表示X小小于等于于等于Y;X/=Y表示表示X不等于不等于Y;XY表示表示X不等于不等于Y。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2937 2 “LAND、“LOR“、“LNOT及及

32、“LEOR运运算符。以算符。以X和和Y表示两个逻辑表达式,以上的逻辑运算符代表示两个逻辑表达式,以上的逻辑运算符代表的运算如下:表的运算如下:X:LAND:Y表示将表示将X和和Y作逻辑与的操作;作逻辑与的操作;X:LOR:Y表示将表示将X和和Y作逻辑或的操作;:作逻辑或的操作;:LNOT:Y表表示将示将Y作逻辑非的操作;作逻辑非的操作;X:LEOR:Y表示将表示将X和和Y作逻辑作逻辑异或的操作。异或的操作。 3字符串表达式及运算符字符串表达式及运算符 字符串表达式一般由字符串常量、字符串变量、运算符字符串表达式一般由字符串常量、字符串变量、运算符和括号组成。编译器所支持的字符串的最大长度为和括

33、号组成。编译器所支持的字符串的最大长度为512字节。字节。常用的与字符串表达式相关的运算符如下。常用的与字符串表达式相关的运算符如下。 1LEN运算符。运算符。LEN运算符返回字符串的长度字符运算符返回字符串的长度字符数,以数,以X表示字符串表达式,其语法格式如下:表示字符串表达式,其语法格式如下:LEN:X 2CHR运算符。运算符。CHR运算符将运算符将0255之间的整数转换之间的整数转换为一个字符,以为一个字符,以M表示某一个整数,其语法格式如下:表示某一个整数,其语法格式如下: :CHR:M第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2938

34、 3STR运算符。运算符。STR运算符将一个数字表达式或逻辑运算符将一个数字表达式或逻辑表达式转换为一个字符串。对于数字表达式,表达式转换为一个字符串。对于数字表达式,STR运算符将运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串运算符将其转换为字符串T或或F,其语法格式如下:,其语法格式如下:STR:X其中其中X为一个数字表达式或逻辑表达式。为一个数字表达式或逻辑表达式。 4LEFT运算符。运算符。LEFT运算符返回某个字符串左端的运算符返回某个字符串左端的一个字串,其语法格式如下:一个字串,其语法格

35、式如下:X:LEFT:Y其中其中X为源字符串,为源字符串,Y为一个整数,表示要返回的字符个为一个整数,表示要返回的字符个数。数。 5RIGHT运算符。与运算符。与LEFT运算符相对应,运算符相对应,RIGHT运运算符返回某个字符串右端的一个字串,其语法格式如下:算符返回某个字符串右端的一个字串,其语法格式如下:X:RIGHT:Y其中其中X为源字符串,为源字符串,Y为一个整数,表示要返回的字符个为一个整数,表示要返回的字符个数。数。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2939 6CC运算。运算。CC运算符用于将两个字符串连接成一个字运算符用于

36、将两个字符串连接成一个字符串,其语法格式如下:符串,其语法格式如下:X:CC:Y其中其中X为源字符串为源字符串1,Y为源字符串为源字符串2,CC运算符将运算符将Y 连接到连接到X后面。后面。 4与存放器和程序计数器与存放器和程序计数器PC相关的表达式及运算符相关的表达式及运算符 常用的与存放器和程序计数器相关的表达式及运算符如下:常用的与存放器和程序计数器相关的表达式及运算符如下: 1BASE运算符。运算符。BASE运算符返回基于存放器的表达式运算符返回基于存放器的表达式中存放器的编号,其语法格式如下:中存放器的编号,其语法格式如下:BASE:X其中其中X为与存放器相关的表达式为与存放器相关的

37、表达式 2INDEX运算符。运算符。INDEX运算符返回基于存放器的表达运算符返回基于存放器的表达式中相对于其基址存放器的偏移量,其语法格式如下:式中相对于其基址存放器的偏移量,其语法格式如下:INDEX:X 其中,其中,X为与存放器相关的表达式为与存放器相关的表达式 5其他常用运算符其他常用运算符 1?运算符。?运算符返回某代码行所生成的可执行代码?运算符。?运算符返回某代码行所生成的可执行代码的长度,如的长度,如“?X表示返回定义符号表示返回定义符号X的代码行所生成的可的代码行所生成的可执行代码的字节数。执行代码的字节数。2DEF运算符。运算符。DEF运算符判断是否认义某个符号,如:运算符

38、判断是否认义某个符号,如:DEF:X:表示当符号:表示当符号X已经定义,结果为真;否那么为假。已经定义,结果为真;否那么为假。 第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2940 1汇编语言的程序结构汇编语言的程序结构 在在ARMThumb汇编语言程序中,以程序段位单位组汇编语言程序中,以程序段位单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放运行时需要用到的数据。一个

39、汇编程序至少要有一个代段存放运行时需要用到的数据。一个汇编程序至少要有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。段在程序编译链接时最终形成一个可执行的映象文件。 可执行映象文件通常由以下几局部构成。可执行映象文件通常由以下几局部构成。1一个或多个代码段,代码段的属性为只读。一个或多个代码段,代码段的属性为只读。2零个或多个包含初始化数据的数据段,其属性为可读零个或多个包含初始化数据的数据段,其属性为可读写。写。3零个或多个不包含初始化数据的数据段,其属性为可零个或多个不包含初

40、始化数据的数据段,其属性为可读写。读写。 链接器根据系统默认或用户设定的规那么,将各个段安排链接器根据系统默认或用户设定的规那么,将各个段安排在存储器中的相应位置。因此源程序中段之间的相对位置与可在存储器中的相应位置。因此源程序中段之间的相对位置与可执行的映象文件中段的相对位置一般不会相同。执行的映象文件中段的相对位置一般不会相同。413 ARM汇编语言的程序结构汇编语言的程序结构第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2941 以下是一个汇编语言的程序根本结构:以下是一个汇编语言的程序根本结构: AREA Init, CODE, READON

41、LY ENTRY START LDR R0, =0 x3FF5000 LDR R1, #0 xFF STR R1, R0 LDR R0,=0 x3FF5008 LDR R1,0 x01 STR R1,R0 END。 在汇编语言程序中,用在汇编语言程序中,用AREA伪指令定义一个段,并说明所定伪指令定义一个段,并说明所定义段的相关属性,以上程序段中定义了一个名为义段的相关属性,以上程序段中定义了一个名为Init的代码段,属的代码段,属性为只读。性为只读。ENTRY伪指令标识程序的入口点,接下来为指令序列,伪指令标识程序的入口点,接下来为指令序列,程序的末尾为程序的末尾为END伪指令。伪指令。第第

42、4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2942 2汇编语言的子程序调用汇编语言的子程序调用 在在ARM汇编语言程序中,子程序的调用一般是通过汇编语言程序中,子程序的调用一般是通过BL指令来指令来实现的,其格式如下:实现的,其格式如下: BL 子程序名子程序名 该指令在执行时完成如下操作:将子程序的返回地址存放在该指令在执行时完成如下操作:将子程序的返回地址存放在连接存放器连接存放器LR中,同时将程序计数器中,同时将程序计数器PC指向子程序的入指向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在口点,当子程序执行完毕需要返回调用处时

43、,只需要将存放在LR中的返回地址重新拷贝给中的返回地址重新拷贝给PC即可。在调用子程序的同时,即可。在调用子程序的同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使也可以完成参数的传递和从子程序返回运算的结果,通常可以使用存放器用存放器R0至至R3完成。完成。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2943 C语言是一种结构化的程序设计语言,它的优点是运行速度语言是一种结构化的程序设计语言,它的优点是运行速度快、编译效率高、移植性好和可读性强。快、编译效率高、移植性好和可读性强。C语言具有简单的语法语言具有简单的语法结构和强大的处理

44、功能,并可方便的实现对硬件的直接操作。结构和强大的处理功能,并可方便的实现对硬件的直接操作。C语言支持模块化程序设计结构,支持自顶向下的结构化程序设计语言支持模块化程序设计结构,支持自顶向下的结构化程序设计方法。因此方法。因此C语言编写的应用软件,可大大提高软件的可读性,语言编写的应用软件,可大大提高软件的可读性,缩短开发周期,便于系统的改进和扩充,这为开发大规模、高性缩短开发周期,便于系统的改进和扩充,这为开发大规模、高性能和高可靠性的应用系统提供了根本保证。能和高可靠性的应用系统提供了根本保证。 嵌入式嵌入式C语言程序设计是利用根本的语言程序设计是利用根本的C语言知识,面向嵌入式语言知识,

45、面向嵌入式工程实际应用进行程序设计。嵌入式工程实际应用进行程序设计。嵌入式C语言程序设计首先是语言程序设计首先是C语言语言程序设计,必须符合程序设计,必须符合C语言根本语法。嵌入式语言根本语法。嵌入式C语言程序设计又是语言程序设计又是面向嵌入式的应用,因此就要利用面向嵌入式的应用,因此就要利用C语言根本知识开发出面向嵌语言根本知识开发出面向嵌入式的应用程序。如何能够在嵌入式系统开发中熟练、正确的运入式的应用程序。如何能够在嵌入式系统开发中熟练、正确的运用用C语言开发出高质量的应用程序,是学习嵌入式程序设计的根语言开发出高质量的应用程序,是学习嵌入式程序设计的根底。底。42 ARM嵌入式嵌入式C

46、语言程序设计根底语言程序设计根底第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2944 1C语言的语言的“预处理伪指令在嵌入式程序设计中的应用预处理伪指令在嵌入式程序设计中的应用 在在C语言源程序中常常参加一些语言源程序中常常参加一些“预处理命令,可以改预处理命令,可以改进程序设计环境,提高编程效率,它虽然写在源程序中,但不产进程序设计环境,提高编程效率,它虽然写在源程序中,但不产生程序代码,因此称为预处理伪指令。生程序代码,因此称为预处理伪指令。 C语言所有预处理伪指令都是以语言所有预处理伪指令都是以#号开头,以区别于源文件号开头,以区别于源文件中

47、的语句行与说明行。预处理伪指令有以下三种:文件包含、宏中的语句行与说明行。预处理伪指令有以下三种:文件包含、宏定义和条件编译。定义和条件编译。 预处理伪指令有以下特点:把文件的正文替换进来,如标预处理伪指令有以下特点:把文件的正文替换进来,如标准头文件和自定义头文件;对宏定义进行宏扩展,减少了编程量,准头文件和自定义头文件;对宏定义进行宏扩展,减少了编程量,改进源程序的可读性;条件编译改善了编程的灵活性,也改善了改进源程序的可读性;条件编译改善了编程的灵活性,也改善了可移植性。可移植性。 421 嵌入式嵌入式C语言程序设计根底语言程序设计根底第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式

48、系统程序设计及调试基础2021-12-2945 1文件包含伪指令文件包含伪指令 文件包含伪指令可将头文件包含到程序中,头文件中定文件包含伪指令可将头文件包含到程序中,头文件中定义的内容包括符号常量、复合变量原型、用户定义的变量类义的内容包括符号常量、复合变量原型、用户定义的变量类型原型和函数的原型说明等。型原型和函数的原型说明等。 指令格式如下:指令格式如下: #include ;标准头文件;标准头文件 #include“头文件名头文件名 ;用户自定义头文件;用户自定义头文件 #include 宏标识符宏标识符 文件包含伪指令举例如下:文件包含伪指令举例如下: #include ;标准头文件;

49、标准头文件 #include ;标准头文件;标准头文件 本例中本例中string和和stdio是标准头文件,按环境变量是标准头文件,按环境变量include 指定的目录顺序搜索指定的目录顺序搜索string和和stdio。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2946 2 宏定义伪指令宏定义伪指令 1简单宏。定义格式为:简单宏。定义格式为:# define 宏标识符宏标识符 宏体。在定义宏体。在定义宏时应尽量防止使用宏时应尽量防止使用C语言的关键字和预处理器的预定义宏。语言的关键字和预处理器的预定义宏。 2参数宏。定义格式为:参数宏。定义格式

50、为:# define 宏标识符形式参数表宏标识符形式参数表 宏体。使用参数宏时,形式参数表应换为同样个十的实参数表,宏体。使用参数宏时,形式参数表应换为同样个十的实参数表,这一点类似函数的调用。这一点类似函数的调用。 3条件宏定义。先测试是否认义过某个宏标识符,然后决条件宏定义。先测试是否认义过某个宏标识符,然后决定如何处理。其定义格式如表定如何处理。其定义格式如表42所示。所示。 4宏释放。用于释放原先定义的宏标识符。经释放后的宏宏释放。用于释放原先定义的宏标识符。经释放后的宏标示符可再次用于定义其它宏体。其定义格式为:标示符可再次用于定义其它宏体。其定义格式为:# undef 宏标宏标识符

51、。识符。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2947第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2948 3条件编译伪指令条件编译伪指令 条件编译伪指令是写给编译器的,指示编译器在满足某条件编译伪指令是写给编译器的,指示编译器在满足某一条件时仅编译源文件中与之相应的比分。其格式如下:一条件时仅编译源文件中与之相应的比分。其格式如下: #if条件表达式条件表达式1 #elif条件表达式条件表达式 #elif条件表达式条件表达式 #else #endif第第4章章 ARM嵌入式系统程序设计及调试基础

52、嵌入式系统程序设计及调试基础2021-12-2949 2嵌入式程序设计中的函数及函数库嵌入式程序设计中的函数及函数库 1函数的定义格式函数的定义格式 存储格式说明符存储格式说明符 类型说明符类型说明符 修饰符修饰符 标识符参数标识符参数表表 函数体函数体 其中:其中: 存储格式说明符有:存储格式说明符有:static静态存储类型,静态存储类型,extern外外部存储类型全局两种。部存储类型全局两种。 类型说明符有:类型说明符有:char,unsigned char、int、unsigned、long、unsigned long、float、double、long double、struct、u

53、nion、void等几种。假设函数返回的是指针,在函数名前等几种。假设函数返回的是指针,在函数名前加加“*。 标识符有:函数名、标识符有:函数名、*函数名函数名返回值是指针、返回值是指针、*函数函数名名函数指针、函数指针、*函数名函数名标识符是指针,返回值标识符是指针,返回值是指针等几种。是指针等几种。 修饰符有:修饰符有:interrupt为中断函数,其返回类型和参数为中断函数,其返回类型和参数均必须为均必须为void、near近调用近调用16位段内地址、位段内地址、far远调远调用用32位段间地址、位段间地址、huge标准化调用标准化调用32位段间标准地位段间标准地址等几种。址等几种。第第

54、4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2950 4 处理器存放器到协处理器存放器的数据传送指令处理器存放器到协处理器存放器的数据传送指令 格式:格式:MCR条件条件协处理器编号,操作码协处理器编号,操作码1,源存放器,源存放器,目的存放器目的存放器1,目的存放器,目的存放器2,操作码,操作码2 用途:将用途:将ARM处理器存放器中的数据传送到协处理器处理器存放器中的数据传送到协处理器存放器中,假设协处理器不能成功完成操作,那么产生未定存放器中,假设协处理器不能成功完成操作,那么产生未定义指令异常。其中协处理器操作码义指令异常。其中协处理器操作码1

55、和协处理器操作码和协处理器操作码2为协为协处理器将要执行的操作,源存放器为处理器将要执行的操作,源存放器为ARM处理器的存放器,处理器的存放器,目的存放器目的存放器1和目的存放器和目的存放器2均为协处理器的存放器。均为协处理器的存放器。 例如:例如:MCR P3,3,R0,C4 ,C5 ,6 ;该指令将;该指令将ARM处理器存放器处理器存放器R0中的数据传送到协处理器中的数据传送到协处理器P3的存放器的存放器C4和和C5中。中。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2951 2函数库介绍函数库介绍 以前面已提到的用户自定义头文件以前面已提到的

56、用户自定义头文件“44blibh为例进为例进行说明。该头文件对程序开发中所用到的函数进行了声明,行说明。该头文件对程序开发中所用到的函数进行了声明,这些函数构成了一个根本函数库这些函数构成了一个根本函数库44blib. C,用于用户的程序,用于用户的程序开发,它不属于标准的开发,它不属于标准的C语言。图语言。图41 是是44blib. c 文件的代文件的代码结构图。从该图可以看出,用户如何根据自己开发板的硬码结构图。从该图可以看出,用户如何根据自己开发板的硬件及功能模块来编写自定义函数库。件及功能模块来编写自定义函数库。第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础

57、2021-12-2952图图4 41 1 44blib. c 44blib. c 文件的代码结构图文件的代码结构图第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2953 3嵌入式程序设计中常用的嵌入式程序设计中常用的C语言语句语言语句 1if条件语句条件语句 1两重选择两重选择 if 条件表达式语句条件表达式语句1; else 语句语句2; 2多重选择多重选择 if 条件表达式条件表达式1 语句语句1; else if 条件表达式条件表达式2 语句语句2; else if 条件表达式条件表达式3 语句语句3; else if 条件表达式条件表达式n

58、语句语句n;第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2954 2switch/case语句语句 switch开关表达式开关表达式 case 常量表达式常量表达式1:语句语句1; case 常量表达式常量表达式2:语句语句2; case 常量表达式常量表达式n:语句语句n; default :语句语句n+1; 3循环语句循环语句 1for循环语句。循环语句。 for表达式表达式1;表达式;表达式2;表达式;表达式3语句;语句; 2while语句。语句。 whlie 条件表达式语句;条件表达式语句; 3do while语句。语句。 do 语句;语句

59、; whlie 条件表达式;条件表达式;第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2955 4嵌入式程序设计中嵌入式程序设计中C语言的变量、数组、结构和联语言的变量、数组、结构和联合合 1变量变量 定义格式为:定义格式为:存储类型存储类型 类型说明符类型说明符 修饰符修饰符 标识符标识符 =初值初值 ,标识符,标识符=初值初值; 其中:其中: 类型说明符:对于数字与字符,其类型共有类型说明符:对于数字与字符,其类型共有9种:种:char,unsigned char、int、unsigned、long、unsigned long、float、dou

60、ble、long double。通过。通过typedef来定义类型的别名。来定义类型的别名。 标识符:变量,是不带标识符:变量,是不带“*的标识符。指针,是带有的标识符。指针,是带有“*的标识符。的标识符。 存储类型:存储类型:auto-自动储存的类型,是局部变量。自动储存的类型,是局部变量。register存放器储存类型。存放器储存类型。extern外部储存类型。外部储存类型。static静态储存类型静态储存类型 第第4章章 ARM嵌入式系统程序设计及调试基础嵌入式系统程序设计及调试基础2021-12-2956 赋初值局部:假设初值缺省,那么赋初值局部:假设初值缺省,那么auto-储存类型和储存类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论