第五章基于ARM的嵌入式程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章基于ARM的嵌入式程序设计5.1ARM汇编语言的伪操作、宏指令与伪指令5.2ARM汇编语言程序设计5.3嵌入式C语言程序设计基础5.4嵌入式C语言程序设计实例5.5嵌入式C语言程序设计技巧5.6C与汇编语言混合编程5.7基于EmbestIDEforARM环境的软件开发实例5.1ARM汇编语言的伪操作、宏指令与伪指令5.1.1两种常见的ARM编译开发环境5.1.2ADS编译环境下的伪操作和宏指令5.1.3GNU编译环境下的伪操作和宏指令5.1.4ARM汇编语言的伪指令5.1.1两种常见的ARM编译开发环境ADS/SDTIDE开发环境:它由ARM公司开发,使用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境:它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。5.1.2ADS编译环境下的伪操作和宏指令ADS编译环境下的伪操作可分为以下几类:符号定义(SymbolDefinition)伪操作数据定义(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作信息报告(Reporting)伪操作其他(Miscellaneous)伪操作符号定义伪操作伪操作语法格式作用GBLAGBLAVariable声明一个全局的算术变量,并将其初始化成0。GBLLGBLLVariable声明一个全局的逻辑变量,并将其初始化成{FALSE}。GBLSGBLSVariable声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLAVariable声明一个局部的算术变量,并将其初始化成0。LCLLLCLLVariable声明一个局部的逻辑变量,并将其初始化成{FALSE}。LCLSLCLSVariable声明一个局部的串变量,并将其初始化成空串“”。SETASETAVariableexpr给一个全局或局部算术变量赋值。SETLSETLVariableexpr给一个全局或局部逻辑变量赋值。SETSSETSVariableexpr给一个全局或局部字符串变量赋值。RLISTnameLIST{listofregisters}为一个通用寄存器列表定义名称。CNnameCNexpr为一个协处理器的寄存器定义名称。CPnameCPexpr为一个协处理器定义名称。DN/SNnameDN/SNexprDN/SN为一个双精度/单精度的VFP寄存器定义名称。FNnameFNexpr为一个FPA浮点寄存器定义名称。数据定义伪操作伪操作语法格式作用LTORGLTORG声明一个数据缓冲池(也称为文字池)的开始。MAPMAPexpr{,base-register}定义一个结构化的内存表(StorageMap)的首地址。FIELD{label}FIELDexpr定义一个结构化内存表中的数据域。SPACE{label}SPACEexpr分配一块连续内存单元,并用0初始化。DCB{label}DCBexpr{,expr}分配一段字节内存单元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字内存单元。DCDO{label}DCDOexpr{,expr}…分配一段字对齐的字内存单元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…为单精度的浮点数分配字对齐的内存单元。DCI{label}DCIexpr{,expr}…在ARM代码中分配一段字对齐的内存单元;在Thumb代码中,分配一段半字对齐的半字内存单元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以双字(8个字节)为单位的内存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字对齐的半字内存单元。汇编控制伪操作伪操作语法格式作用IF,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能够根据条件重复汇编相同的一段源代码。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}…;宏代码MENDMACRO标识宏定义的开始,MEND标识宏定义的结束。MERIT用于从宏中跳转出去。用MACRO和MEND定义的一段代码,称为宏定义体。通过宏名称来调用宏。信息报告伪操作伪操作语法格式作用ASSERTASSERTlogicalexpression对汇编程序的第二遍扫描中,如果其中ASSERT中条件不成立,ASSERT伪操作将报告该错误信息。INFOINFOnumeric-expression,string-expression在汇编处理过程的第一遍扫描或者第二遍扫描时INFO伪操作报告诊断信息。OPTOPTn通过OPT伪操作可以在源程序中设置列表选项。TTLTTLtitle在列表文件的每一页的开头插入一个标题。SUBTSUBTsubtitle在列表文件的每一页的开头插入一个子标题。其他伪操作伪操作语法格式作用CODE16CODE16告诉汇编编译器后面的指令序列为16位的Thumb指令CODE32CODE32告诉汇编编译器后面的指令序列为32位的ARM指令。EQUnameEQUexpr{,type}为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。AREAAREAsectionname{,attr}{,attr}…定义一个代码段或者数据段。ENTRYENTRY指定程序的入口点。ENDEND告诉编译器已经到了源程序结尾。ALIGNALIGN{expr{,offset}}通过添加补丁字节使当前位置满足一定的对齐方式。EXPORT/GLOBALEXPORTsymbol{[WEAK]}声明一个符号可以被其他文件引用,相当于声明了一个全局变量。IMPORTIMPORTsymbol{[WEAK]}告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。EXTERNEXTERNsymbol{〔WEAK〕}告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。GET/INCLUDEGETfilename将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。INCBININCBINfilename将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。KEEPKEEP{symbol}告诉编译器将局部符号包含在目标文件的符号表中。NOFPNOFP禁止源程序中包含浮点运算指令。REQUIREREQUIRElable指定段之间的相互依赖关系。RNnameRNexpr为一个特定的寄存器定义名称。ROUT{name}ROUT定义局部变量的有效范围。符号定义伪操作1、GBLA、GBLL和GBLS说明:声明一个ARM程序中的全局变量,并在默认情况下将其初始化GBLA:声明一个全局算术变量,初始化为0GBLL:声明一个全局逻辑变量,初始化为FALSEGBLS:声明一个全局字符串变量,初始化为空串“”语法格式:GBLXVariable符号定义伪操作举例:GBLAarithmaticArithmaticSETA0xEFSPACEarithmaticGBLLlogicalLogicalSETL{TRUE}符号定义伪操作2、LCLA、LCLL和LCLS说明:声明一个ARM程序中的局部变量,并在默认情况下将其初始化LCLA:声明一个局部算术变量,初始化为0LCLL:声明一个局部逻辑变量,初始化为FALSELCLS:声明一个局部字符串变量,初始化为空串“”语法格式:LCLXVariable符号定义伪操作举例:MACRO$labelmessage$aLCLSstringstringSETS“error”$labelINFO0,”string”:CC::STR:$aMEND符号定义伪操作3、SETA、SETL和SETS说明:给ARM程序中的全局或局部变量赋值。SETA:给一个全局或局部算术变量赋值SETL:给一个全局或局部逻辑变量赋值SETS:给一个全局或局部字符串变量赋值语法格式:SETXVariableexpr符号定义伪操作举例:GBLAarithmaticArithmaticSETA0xEFSPACEarithmaticGBLLlogicalLogicalSETL{TRUE}符号定义伪操作4、RLIST说明:为一个通用寄存器列表定义名称语法格式:nameRLIST{listofregisters}举例:ListRLIST{R0-R3}STMDFSP!List符号定义伪操作5、CN说明:为一个协处理器的寄存器定义名称语法格式:nameCNexpr举例:PowerCN6符号定义伪操作6、CP说明:为一个协处理器定义名称语法格式:nameCPexpr举例:DzxCP6符号定义伪操作7、DN和SN说明:DN为一个双精度的VFP寄存器定义名称SN为一个单精度的VFP寄存器定义名称语法格式:nameDNexprnameSNexpr举例:heightDN6widthSN20符号定义伪操作8、FN说明:FN为一个FPA浮点寄存器定义名称语法格式:nameFNexpr举例:lengthFN6数据定义伪操作1、LTORG说明:用于声明一个数据缓冲池的开始。当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTORG伪操作定义数据缓冲池。通常大的代码段可使用多哥数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面。语法格式:LTORG举例:AREAExample,CODE,READONLYstartBLfunel……..funelLDRR1,=0x8000MOVPC,LRLTORGDataSPACE40END数据定义伪操作2、MAP说明:用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器设置成该地址值。MAP也可以用”^”代替语法格式:MAPexpr{,base-register}举例:MAPfunMAP0x100,R9数据定义伪操作3、FIELD说明:用于定义一个结构化的内存表的数据域。FIELD也可以用”#”代替语法格式:labelFIELDexpr使用说明:MAP和FIELD配合使用来定义结构化的内存表结构。MAP定义内存表的首地址;FIELD定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号。MAP中的base-register寄存器值对于其后所有的FIELD定义的数据域是默认使用的,直到遇到新的包含base-register的MAP操作。需要注意的是,MAP和FIELD仅仅是定义数据结构,它们并不实际分配内存单元。由MAP和FIELD定义的内存表有3种:基于绝对地址的内存表、基于相对地址的内存表和基于PC的内存表数据定义伪操作例1:基于绝对地址的内存表定义一个内存表,其首地址为固定地址8192(0x2000),该内存表中包含5个数据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。MAP8192constaFIELD4constbFIELD4xFIELD8yFIELD8stringFIELD16在指令中这样引用内存表中的数据域:LDRR0,consta数据定义伪操作例2:基于相对地址的内存表定义一个内存表,其首地址为0与R9寄存器的和,该内存表中包含5个数据域;consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。MAP0,R9c

1 / 230
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功