基于ARM的嵌入式程序设计.ppt

上传人:牧羊曲112 文档编号:5951670 上传时间:2023-09-07 格式:PPT 页数:230 大小:11.56MB
返回 下载 相关 举报
基于ARM的嵌入式程序设计.ppt_第1页
第1页 / 共230页
基于ARM的嵌入式程序设计.ppt_第2页
第2页 / 共230页
基于ARM的嵌入式程序设计.ppt_第3页
第3页 / 共230页
基于ARM的嵌入式程序设计.ppt_第4页
第4页 / 共230页
基于ARM的嵌入式程序设计.ppt_第5页
第5页 / 共230页
点击查看更多>>
资源描述

《基于ARM的嵌入式程序设计.ppt》由会员分享,可在线阅读,更多相关《基于ARM的嵌入式程序设计.ppt(230页珍藏版)》请在三一办公上搜索。

1、第五章基于ARM的嵌入式程序设计,5.1 ARM汇编语言的伪操作、宏指令与伪指令5.2 ARM汇编语言程序设计5.3 嵌入式C语言程序设计基础5.4 嵌入式C语言程序设计实例5.5 嵌入式C语言程序设计技巧5.6 C与汇编语言混合编程5.7 基于Embest IDE for ARM 环境的软件开发实例,5.1 ARM汇编语言的伪操作、宏指令与伪指令,5.1.1 两种常见的ARM编译开发环境5.1.2 ADS编译环境下的伪操作和宏指令5.1.3 GNU编译环境下的伪操作和宏指令5.1.4 ARM汇编语言的伪指令,两种常见的ARM编译开发环境,ADS/SDT IDE开发环境:它由ARM公司开发,使

2、用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境:它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。,编译环境下的伪操作和宏指令,ADS编译环境下的伪操作可分为以下几类:符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作,符号定义伪操作,数据定义伪操作,汇编控制伪操作,信息报告伪操作,其他伪操作,符号定义伪操作,1、GBLA、GBLL和GBLS说明:声明一个ARM程序中的全

3、局变量,并在默认情况下将其初始化 GBLA:声明一个全局算术变量,初始化为0 GBLL:声明一个全局逻辑变量,初始化为FALSE GBLS:声明一个全局字符串变量,初始化为空串“”语法格式:Variable,符号定义伪操作,举例:GBLA arithmaticArithmatic SETA 0 xEFSPACE arithmaticGBLL logicalLogical SETL TRUE,符号定义伪操作,2、LCLA、LCLL和LCLS说明:声明一个ARM程序中的局部变量,并在默认情况下将其初始化 LCLA:声明一个局部 算术变量,初始化为0 LCLL:声明一个局部逻辑变量,初始化为FALS

4、E LCLS:声明一个局部字符串变量,初始化为空串“”语法格式:Variable,符号定义伪操作,举例:MACRO$label message$aLCLS stringstring SETS“error”$labelINFO 0,”string”:CC:STR:$aMEND,符号定义伪操作,3、SETA、SETL和SETS说明:给ARM程序中的全局或局部变量赋值。SETA:给一个全局或局部算术变量赋值 SETL:给一个全局或局部逻辑变量赋值 SETS:给一个全局或局部字符串变量赋值语法格式:Variable expr,符号定义伪操作,举例:GBLA arithmaticArithmatic S

5、ETA 0 xEFSPACE arithmaticGBLL logicalLogical SETL TRUE,符号定义伪操作,4、RLIST说明:为一个通用寄存器列表定义名称语法格式:name RLIST list of registers举例:List RLIST R0-R3 STMDF SP!List,符号定义伪操作,5、CN说明:为一个协处理器的寄存器定义名称语法格式:name CN expr举例:Power CN 6,符号定义伪操作,6、CP说明:为一个协处理器定义名称语法格式:name CP expr举例:Dzx CP 6,符号定义伪操作,7、DN和SN说明:DN为一个双精度的VFP

6、寄存器定义名称 SN为一个单精度的VFP寄存器定义名称语法格式:name DN expr name SN expr举例:height DN 6 width SN 20,符号定义伪操作,8、FN说明:FN为一个FPA浮点寄存器定义名称语法格式:name FN expr举例:length FN 6,数据定义伪操作,1、LTORG说明:用于声明一个数据缓冲池的开始。当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTORG伪操作定义数据缓冲池。通常大的代码段可使用多哥数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面。语法格式:LTORG举例:AREA E

7、xample,CODE,READONLY start BL funel.funel LDR R1,=0 x8000 MOV PC,LR LTORG Data SPACE 40 END,数据定义伪操作,2、MAP说明:用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器设置成该地址值。MAP也可以用”代替语法格式:MAP expr,base-register举例:MAP fun MAP 0 x100,R9,数据定义伪操作,3、FIELD说明:用于定义一个结构化的内存表的数据域。FIELD也可以用”#”代替语法格式:label FIELD expr 使用说明:MAP和FIELD配合使用来定

8、义结构化的内存表结构。MAP定义内存表的首地址;FIELD定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号。MAP中的base-register寄存器值对于其后所有的FIELD定义的数据域是默认使用的,直到遇到新的包含base-register的MAP操作。需要注意的是,MAP和FIELD仅仅是定义数据结构,它们并不实际分配内存单元。由MAP和FIELD定义的内存表有3种:基于绝对地址的内存表、基于相对地址的内存表和基于PC的内存表,数据定义伪操作,例1:基于绝对地址的内存表 定义一个内存表,其首地址为固定地址8192(0 x2000),该内存表中包含5个数

9、据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。MAP 8192 consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 16 在指令中这样引用内存表中的数据域:LDR R0,consta,数据定义伪操作,例2:基于相对地址的内存表 定义一个内存表,其首地址为0与R9寄存器的和,该内存表中包含5个数据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。MAP 0,R9 consta FIELD

10、 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 16 在指令中这样引用内存表中的数据域:ADR R9,FIELD LDR R5,constb,数据定义伪操作,例3:基于PC的内存表 定义一个内存表,其首地址为PC的值,该内存表中包含5个数据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。Data SPACE 100 MAP Data consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 16 在指令中这

11、样引用内存表中的数据域:LDR R5,constb,数据定义伪操作,说明:当FIELD中的操作数为0时,其中的标号即为当前内存单元的地址。由于其中操作数为0,汇编器处理了该操作后,内存表的位置计数器的值并不改变。可利用这项技术来判断当前内存的使用没有超过程序分配的可用内存。例4:特殊内存表 定义一个内存表,其首地址为PC的值,该内存表中包含5个数据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为 maxlen字节。start EQU 0 x1000 end EQU 0 x2000 MAP start consta FIELD 4 con

12、stb FIELD 4 x FIELD 8 y FIELD 8 string FIELD maxlen endalert FIELD 0 ASSERT endalert=end end,数据定义伪操作,4、SPACE说明:用于分配一块连续内存单元,并用0初始化。可用“%”代替。语法格式:label SPACE expr举例:Data SPACE 100,数据定义伪操作,5、DCB:说明:DCB用于分配一块字节单元,并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0255的数字,DCB可用“=”代替。语法格式:label DCB expr 举例:string DCB“s

13、tudent”,数据定义伪操作,6、DCD/DCDU 说明:DCD伪指令用于分配一块字存储单元,并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。而DCDU并不严格字对齐。语法格式:label DCD expr label DCDU expr 举例:Data1 DCD 1,5,10 Data2 DCD addr+4,数据定义伪操作,7、DCDO 说明:DCD伪指令用于分配一块字对齐的字存储单元,并将每个字单元的内容初始化为该单元相对于R9内容的偏移量。语法格式:label DCDO expr 举例:IMPORT sign DCDO sign,数据定义伪操作,8

14、、DCFD/DCFDU 说明:DCFD伪指令用于为双精度的浮点数分配字存储单元,并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。而DCFDU并不严格字对齐。语法格式:label DCFD expr label DCFDU expr 举例:DCFD 1E308,-4E-100 DCFDU 10000,-0.1,3.1E26,数据定义伪操作,9、DCFS/DCFSU 说明:DCFS伪指令用于为单精度的浮点数分配字存储单元,并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。而DCFSU并不严格字对齐。语法格式:label DCFS expr label DCFSU expr 举

15、例:DCFS E3,-4E-9 DCFSU 1.0,-1.3,3.1E6,数据定义伪操作,10、DCI 说明:在ARM代码中,DCI伪指令用于分配字对齐的字存储单元,并用伪指令中指定的表达式初始化。在THUMB代码中,DCI伪指令用于分配半字对齐的半字存储单元,并用伪指令中指定的表达式初始化。语法格式:label DCI expr 举例:MACRO Newinstr$Rd,$Rm DCI 0 xE16F0F10:OR:($Rd:SHL:12):OR:$Rm MEND,数据定义伪操作,11、DCQ/DCQU 说明:DCQ伪指令用于分配一块双字存储单元,并用伪指令中指定的表达式初始化,它定义的存储

16、空间是字对齐的。而DCQU并不严格字对齐。语法格式:label DCQ-literal label DCQU-literal 举例:Data1 DCQ-100,2_101 Data2 DCQU 1000,数据定义伪操作,12、DCW/DCWU 说明:DCW伪指令用于分配一块半字存储单元,并用伪指令中指定的表达式初始化,它定义的存储空间是半字对齐的。而DCWU并不严格半字对齐。语法格式:label DCW expr label DCWU expr 举例:Data1 DCW-235,748 Data2 DCWU 1000,汇编控制伪操作,1、IF、ELSE、ENDIF IF逻辑表达式 代码段1 E

17、LSE 代码段2 ENDIF 说明:IF、ELSE、ENDIF伪操作能根据逻辑表达式的成立与否决定是否在编译时加入某个指令序列。IF、ELSE、ENDIF可以分别用“”、“|”、“”代替。IF、ELSE、ENDIF伪指令可以嵌套使用。,汇编控制伪操作,举例:IF Variable=16 BNE SUB1 LDR R0.=SUB0 BX R0 ELSE BNE SUB0.ENDIF,汇编控制伪操作,2、WHILE、WEND:WHILE 逻辑表达式 代码段 WEND 说明:WHILE和WEND伪指令能根据逻辑表达式的成立与否决定是否循环执行这个代码段。WHILE、WEND伪指令可以嵌套使用。,汇编

18、控制伪操作,举例:count SETA 1 WHILE count=4 count SETA count+1 WEND,汇编控制伪操作,3、MACRO、MEND MACRO$标号宏名$参数1,$参数2,指令序列 MEND 说明:MACRO 表明一个宏定义的开始,MEND则表示一个宏的结束,MACRO、MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后就可以在程序中通过宏的名称及参数调用该段代码。MACRO和MEND之间的代码称为宏定义体,在宏定义体的第一行声明宏的原型,宏的原型包含宏名、所需的参数。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参

19、数的值传递给宏定义中的参数。注意:宏操作可以嵌套使用,并可以在编译时用选项加以控制。,汇编控制伪操作,4、MEXIT:MEXIT 说明:MEXIT用于从宏中退出。,汇编控制伪操作,举例:1、编程实现宏定义体包括2个循环操作和1个子程序调用 MACRO$label jump$a1,$a2$label loop1.BGE$label loop1$label loop2 BL$a1 BGT$label loop2 ADR$a2.MEND 在程序中调用该宏:exam jump sub,det,汇编控制伪操作,举例:2、编程实现宏定义体完成测试-跳转 MACRO$label TestAndBranch$

20、ds,$re,$aa$label CMP$re,#0 BL$aa$ds MEND 在程序中调用该宏:test TestAndBranch nzero,R0,NE,信息报告伪操作,1、ASSERT:语法格式:ASSERT logical expression 说明:ASSERT用来表示程序的编译必须满足一定的条件,如果逻辑表达式不满足,则编译器会报错。举例:ASSERT Top Temp,信息报告伪操作,2、INFO 语法格式:INFO numeric-expression,string-expression 说明:汇编诊断信息显示伪操作。显示用户自定义的错误信息。举例:INFO 0,“Vers

21、ion 1.0”IF label1=label2 INFO 4,”Data overrun”ENDIF,信息报告伪操作,3、OPT 语法格式:OPT n 说明:使用编译选项-list将使编译器产生常规的列表文件。举例:在fun前插入OPT 4,fun将在新的一页中显示 AREA Example,CODE,READONLY start BL func OPT 4 func,信息报告伪操作,4、TTL及SUBT 语法格式:TTL title SUBT subtitle 说明:TTL在列表文件的页顶部显示一个标题;SUBT在列表文件页标题的下面显示一个子标题。举例:TTL title SUBT su

22、btitle,其他伪操作,1、CODE16、CODE32:语法格式:CODE16/CODE32 说明:CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。,其他伪操作,举例:编程实现程序先在ARM状态下执行,通过 BX指令切换到Thumb状态。AERA ChangeState,CODE,READONLY CODE 32 LDR R0,=START+1 BX R0 CODE16 Start MOV R1,#10,其他伪操作,2、EQU 语法格式:名称 EQU 表达式,类型 说明:EQU用于将程序中的数字常量、标号、基于寄存器

23、的值赋予一个等效的名称,这一点类似于C语言中的define,可用“*”代替EQU。如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:CODE16/CODE32/DATA,其他伪操作,举例:X EQU 10 Y EQU label+100 Z EQU 0 x10,CODE32 reg EQU 0 xE01FC080,其他伪操作,3、AREA 语法格式:AREA 段名 属性,说明:AREA用于定义一个代码段、数据段或者特定属性的段。如果段名以数字开头,那么该段名需用“|”字符括起来,如|7wolf|,用C的编译器产生的代码一般也用“|”括起来。属性部分表示该代码段/数据

24、段的相关属性,多个属性可以用“,”分隔。常见属性如下:DATA:定义数据段。CODE:定义代码段。READONLY:表示本段为只读。READWRITE:表示本段可读写。ALIGN=表达式:对齐方式为2表达式次方,例如:表达式=3,则对齐方式为8字节对齐。表达式的取值范围为031。COMMON属性:定义一个通用段,这个段不包含用户代码和数据。COMDEF属性:定义一个通用段,这个段可包含用户代码和数据。ASSOC=section.指定与本段相连的ELF段。NOINIT指定本数据段仅保留内存单元,而没有将各初始值写入内存单元,或者将各内存单元值初始化伪。,其他伪操作,4、ENTRY:语法格式:EN

25、TRY 说明:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定,但在一个源文件里最多只能有一个ENTRY或者没有ENTRY。,其他伪操作,5、END 语法格式:END 说明:“END”告诉编译器已经到了 源程序的结尾。,其他伪操作,6、ALIGN:语法格式:ALIGN 表达式,偏移量 说明:ALIGN伪操作可以通过填充字节使当前的位置满足一定的对齐方式。其中,表达式的值为2的幂,如1、2、4、8、16等,用于指定对齐方式。如果伪操作中没有指定表达式,则编译器会将当前位置对齐到下一个字的位置。偏移量也是个数字

26、表达式,如果存在偏移量,则当前位置的自动对齐到:2的表达式值次方偏移量。如:“ALIGN 8”表示将当前位置以2个字的方式对齐。又如“ALIGN 4,3”,则当原始位置在0 x0001时,当前位置转到0 x0007(0 x0004+3)。,其他伪操作,注意:(1)Thumb的伪指令ADR要求地址是字对齐的,而Thumb代码中地址标号可能不是字对齐的。这时就要使用“ALIGN 4”使Thumb代码中地址标号是字对齐的。(2)LDRD及STRD指令要求内存单元是8字节对齐的。这样在LDRD及STRD分配内存单元前,要使用ALIGN 8实现8字节对齐方式。(3)地址标号通常自身没有对齐要求,而在AR

27、M代码中要求地址标号是字对齐的,在Thumb中要求半字对齐。这样就要采用ALIGN指令调整对齐方式。,其他伪操作,举例:1、AREA cache,CODE,ALIGN=3;指定该代码;段的指令是8字节对齐的。MOV PC,LR ALIGN 8;指定下面的指令是8字节对齐的,其他伪操作,2、将2字节数据放在同一个字的第1字节和第4字节中。AREA Example,CODE,READONLY DCB 0 x11 ALIGN 4,3 DCB 0 x243、通过ALIGN指令使程序中地址标号字对齐。AREA Example,CODE,READONLY start LDR R6,=label MOV P

28、C,LR label DCB 0 x48 ALIGN,其他伪操作,7、EXPORT/GLOBAL EXPORT/GLOBAL 标号,WEAK 说明:EXPORT在程序中声明一个全局标号,该标号可以被其他的文件中的代码引用。用户也可以用GLOBAL代替EXPORT。,WEAK可选项声明其他文件有同名的标号,则该同名标号优先于该标号被引用。8、IMPORT:IMPORT 标号,WEAK 说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。,WEAK选项表示如果所有的源文件都没有找到这个标号

29、的定义,编译器也不会提示错误信息。编译器在多数情况下将该标号置为0,如果这个标号被B或BL指令引用,则将B或BL指令替换为NOP操作。,其他伪操作,9、EXTERN:EXTERN 标号,WEAK 说明:EXTERN告诉编译器所使用的标号要在当前源文件中引用,但该标号是在其他的源文件中定义的。与IMPORT不同的是,如果当前源文件实际上没有引用该标号,该标号就不会被加入到当前文件的符号表中。,WEAK选项意义同IMPORT。,其他伪操作,10、GET/INCLUDE:GET文件名 说明:GET将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置展开进行汇编处理。INCLUDE和GET作

30、用等效的。我们通常这样使用这个伪指令:在某源文件中定义一些宏指令,用MAP和FIELD定义结构化的数据类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他的源文件中。GET/INCLUDE只能用于包含源文件,包含其他文件则需要使用INCBIN伪指令。,其他伪操作,注意:通常可在一个源文件中定义宏,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,这样的源文件类似于C语言中的.h文件。然后用GET伪操作将这个源文件包含到它们的源文件中,类似于“include*.h”举例:AREA Example,CODE,READONLY GET file1.

31、s GET C:PROJECTfile2.s,其他伪操作,11、INCBIN:INCBIN 文件名 说明:INCBIN将一个数据文件或者目标文件包含到当前的源文件中,编译时被包含的文件不作任何变动的存放在当前文件中,编译器从后面开始继续处理。,其他伪操作,12、KEEP KEEP symbol 说明:告诉编译器将局部符号包含在目标文件的符号表中。默认情况下,编译器仅将下面的符号包含到目标文件的符号表中:被输出的符号;将会被重定位的符号。使用该指令可将局部符号包含在目标文件的符号表中。举例:Label CMP R0,R1 KEEP label,其他伪操作,13、NOFP NOFP 说明:禁止源程

32、序中包含浮点运算指令。,其他伪操作,14、REQUIRE REQUIRE label 说明:用于指定段之间的相互依赖关系。,其他伪操作,15、REQUIRE8和PRESEERVE8 REQUIRE8 PRESEERVE8 说明:REQUIRE8指示当前代码中要求数据栈8字节对齐。PRESEERVE8指示当前代码中数据栈是8字节对齐。LDRD和STRD指令要求内存单元地址是8字节对齐的。当在程序中使用这些指令在数据栈中传送数据时,要求数据栈是8字节对齐的,这时需要用REQUIRE8。,其他伪操作,16、RN name RN expr 说明:用于给一个寄存器定义名称,以方便记忆该寄存器的功能。举例

33、:COUNT RN 6 CHOOSE RN 9,其他伪操作,17、ROUT:名称 ROUT 说明:ROUT可以给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作用范围为当前ROUT和下一个ROUT之间。,5.1.3 GNU编译环境下的伪操作和宏指令,GNU编译环境下的伪操作可分为以下几类:常量编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作,常量编译控制伪操作,汇编程序代码控制伪操作,宏及条件编译控制伪操作,其他伪操作,常量编译控制伪操作,1、.byte 语法格式:.byte expr 说明:用于分配一段

34、字节对齐的字节内存单元,并用expr初始化。举例:.byte 21,48,89,0 x13,常量编译控制伪操作,2、.hwod及.short 语法格式:.hwod/.short expr 说明:用于分配一段半字对齐的半字内存单元,并用expr初始化。举例:.hwod/.short 21,25,89,0 x43,常量编译控制伪操作,3、.ascii 语法格式:.ascii expr 说明:用于定义字符串,并用expr(非0结束符)初始化。举例:.ascii“How are you”,常量编译控制伪操作,4、.asciz及.string 语法格式:.asciz.string expr 说明:用于定

35、义字符串,并用expr(以”/0”为结束符)初始化。举例:.asciz“How are you”,常量编译控制伪操作,5、.float及.single 语法格式:.float.single expr 说明:用于定义一个32位IEEE浮点数。举例:.float 0F3.14,0F359.2E11,常量编译控制伪操作,6、.double 语法格式:.double expr 说明:用于定义一个64位IEEE浮点数。举例:.double 0F2E1,常量编译控制伪操作,7、.word,.long,.int 语法格式:op expr 说明:用于分配一段字内存单元.举例:.word 21,0 x11003

36、3,常量编译控制伪操作,8、.fill 语法格式:.fill repeat,size,value 说明:用于分配一段字内存单元,用size长度value填充repeat次。举例:.fill 8,4,0 xFFFFFFFF,常量编译控制伪操作,9、.zero 语法格式:.zero size 说明:用于分配一段字节内存单元,用0填充内存。举例:.zero 400,常量编译控制伪操作,10、.space,.skip 语法格式:op size,value 说明:用于分配一段内存单元,用value初始化内存。举例:.space 10,0BFF,字符编译控制伪操作,1、.equ,.set 语法格式:op

37、symbol,expr 说明:用于为数字常量、基于寄存器的值和程序中的标号定义一个字符名称。举例:.equ num,20.set zheng,”STUDENT”,字符编译控制伪操作,2、.global,.globl 语法格式:op symbol 说明:声明一个符号被其他文件引用,相当于声明一个全局变量。举例:.Global _start,字符编译控制伪操作,3、.extern 语法格式:extern 说明:声明一个符号可被其他文件引用,相当于声明一个全局变量。举例:.Extern Image_RO_Limit,汇编程序代码控制伪操作,1、.section 语法格式:.section expr

38、说明:用于定义域中包含的段.举例:.section.bss,汇编程序代码控制伪操作,2、.text 语法格式:.text subsection 说明:将操作符开始的代码编译到代码段或代码段子段。举例:.text,汇编程序代码控制伪操作,3、.data 语法格式:.data subsection 说明:将操作符开始的代码编译到数据段或数据段子段。举例:.data,汇编程序代码控制伪操作,4、.bss 语法格式:.bss subsection 说明:将变量存放到.bss段或bss段的子段。举例:.bss,汇编程序代码控制伪操作,5、.code16|32 语法格式:.code16|32 说明:用于选

39、择当前汇编指令的指令集.code16选择Thumb指令集,.code32选择ARM指令集。.code16等同于.thumb.code32等同于.arm,汇编程序代码控制伪操作,6、.end 语法格式:.end 说明:标记汇编文件的结束行。,汇编程序代码控制伪操作,7、.include 语法格式:.include“filename”说明:用于将一个源文件包含到当前源文件中。举例:.Include“44b0.h”,汇编程序代码控制伪操作,8、.align,.balign 语法格式:.align alignment,fill.max 说明:用于表示对齐方式:通过添加填充字节使当前位置满足一定的对齐方

40、式。举例:.align 4,宏编译控制伪操作,1、.macro,.endm 语法格式:.macro macroname parameter endm 说明:.macro标识宏定义的开始,.endm标识宏定义的结束。,宏编译控制伪操作,举例:1、.macro HANDLER Label SUB SP,SP,#4 STMFD SP!,R0 LDR R0,=Label LDR R0,R0 STR R0,SP,#4 LDMFD SP!,R0,PC.endm,宏编译控制伪操作,2、.macro HANDLER_irq Label STMDB SP!,R0-R11,IP,LR LDR R0,=Label

41、LDR R0,R0 MOV LR,PC BX R0 LDMIA SP!,R0-R11,IP,LR SUBS PC,R14,#4.endm,宏编译控制伪操作,2、.exitm 语法格式:.exitm 说明:用于提前退出宏,条件编译控制伪操作,.ifdef,.else,.endif 语法格式:.ifdef condition instructions or derectives.else.endif,反汇编代码控制伪操作,1、.eject 语法格式:.eject 说明:用于在汇编符号列表文件中插入一分页符.,反汇编代码控制伪操作,2、.List,.nolist 语法格式:.List.nolist

42、说明:.list 用于产生汇编列表。.nolist用于表示汇编列表结束。,反汇编代码控制伪操作,3、.title 语法格式:.title“heading”说明:使用“heading”作为标题。举例:title“PART 1”,反汇编代码控制伪操作,4、.sbttl 语法格式:.sbttl“heading”说明:使用“heading”作为子标题。举例:sbttl“PART 2”,其他常用伪操作,1、.ltorg 语法格式:.ltorg 说明:用于在当前段的当前地址产生一个文字池。举例:LDR R0,=REFRESH STR R3,R0 MOV PC,LR.ltorg,其他常用伪操作,2、.req

43、 语法格式:.Req name,expr 说明:为一个特定的寄存器定义名称。举例:.req COUNT,7,其他常用伪操作,3、.err 语法格式:.err 说明:用于使编译时产生错误报告4、.print 语法格式:.Print string 说明:用于打印信息到标准输出。,其他常用伪操作,5、.fail 语法格式:.Fail expr 说明:用于汇编文件时产生警告。当expr小于500时产生错误信息,否则产生警告信息。,5.1.4 ARM汇编语言的伪指令,小范围的地址读取伪指令ADR,语法格式:.ADR cond register,expr 说明:(1)功能是将基于PC的地址值或基于寄存器的

44、地址值读取到寄存器中。(2)cond是可选的指令执行的条件。Register为目标寄存器。Expr为基于PC或寄存器的地址表达式,其取值范围为:1)当地址值不是字对齐时,其取值范围为-255-255字节。2)当地址值是字对齐时,其取值范围为-1020-1020字节。3)当地址值是16字节对齐时,其取值范围更大。,小范围的地址读取伪指令ADR,(3)在处理源程序时,ADR伪指令通常被编译器替换成一条ADD指令或SUB指令来实现该功能。因为ADR指令中的地址是基于PC或寄存器的相对偏移,所以ADR读取到的地址为与位置无关的地址。举例:start MOV R0,#10 ADR R1,start;因为

45、PC值为当前指令地址;值加8字节,所以本ADR指令将被编译器;替换成“SUB R1,PC,0 xC”,中等范围的地址读取伪指令ADRL,语法格式:.ADRL cond register,expr 说明:(1)功能是将基于PC的地址值或基于寄存器的地址值读取到寄存器中。(2)cond是可选的指令执行的条件。Register为目标寄存器。Expr为基于PC或寄存器的地址表达式,其取值范围为:1)当地址值不是字对齐时,其取值范围为-64KB。2)当地址值是字对齐时,其取值范围为-256KB-256KB。3)当地址值是16字节对齐时,其取值范围更大。,中等范围的地址读取伪指令ADRL,(3)在处理源程

46、序时,ADRL伪指令通常被编译器替换成2条合适的数据处理指令来实现该功能。因为ADRL指令中的地址是基于PC或寄存器的相对偏移,所以ADRL读取到的地址为与位置无关的地址。举例:start MOV R0,#10 ADRL R1,start+60000;因为PC值为当前指令地址值加8字节,所以本ADRL指令将被编译器替换成“ADD R4,PC,#84”和”ADD R4,R4,#59904”,大范围的地址读取伪指令LDR,语法格式:.LDR cond register,=expr|label-expr 说明:(1)功能是将一个32位的立即数或者一个地址值读取到寄存器中。(2)cond是可选的指令执

47、行的条件。Register为目标寄存器。Expr为32位的常量.1)当地址值在MOV/MVN指令中地址的取值范围内,编译器用合适的MOV/MVN指令替代.2)当地址值超出MOV/MVN指令中地址的取值范围,编译器用一般将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数.3)label-expr为基于PC的地址表达式或者外部表达式;4)当label-expr为基于PC的地址表达式时,编译器将label-expr表示的 数值放在数据缓冲区中,同时用一条LDR指令读取该数值。5)当label-expr为外部表达式时,或者非当前段的表达式时,汇编编译器将在目标文件中插入链接重定位操作,

48、这样链接器将在链接时生成该地址.,大范围的地址读取伪指令LDR,(3)主要有2种用途:1)当需要读取到寄存器中的数据超过了MOV或者MVN指令可操作的范围时,可使用LDR指令将该数据读取到寄存器中.2)将一个基于PC的地址值或者外部的地址值读取到寄存器中。注意,LDR指令处的PC值到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB,还必须确保在指令范围内有一个文字池。,大范围的地址读取伪指令LDR,举例:将0 xFF读取到R1中 LDR R1,=0 xFF;MOV R1,0 xFF 将0 xFFF读取到R1中;LDR R1,PC,OFFSET_TO_LPOOL;.;LTORG;LPOOL

49、DCD 0 xFFF 将外部地址ADDR1读取到R1中 LDR R1,=ADDR1;LDR R1,PC,OFFSET_TO_LPOOL;.;LTORG;LPOOL DCD ADDR1,空操作伪指令,NOP 语法格式:NOP 说明:在汇编时被替换成ARM中的空操作;不影响CPSR中的条件标志位.,5.2 ARM汇编语言程序设计,5.2.1 ARM汇编中的文件格式5.2.2 ARM汇编语言语句格式5.2.3 ARM汇编语言编程的重点5.2.4 ARM汇编程序实例,汇编中的文件格式,ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在ARM程序设计中,常用的

50、源文件可简单分为以下几种:,汇编语言语句格式,ARM汇编语言语句格式如下所示:symbol instruction|directive|pseudo-instruction;comment 其中:instruction为指令。directive为伪操作。pseudo-instruction为伪指令。symbol为符号。comment为语句的注释。,ARM汇编语言中的符号,在ARM汇编语言中,符号(symbols)可以代表地址(addresse)、变量(variables)和数字常量(numeric constants)。当符号代表地址时,又称为标号(lable)。当标号以数字开头时,其作用范围

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号