汇编语言的伪操作、宏指令与伪指令5.2ARM汇编语言程序设计5.3嵌入式C语言程序设计基础5.4嵌入式C语言程序设计实例5.5嵌入式C语言程序设计技巧5.6C与汇编语言混合编程汇编语言的伪操作、宏指令与伪指令5.1.1两种常见的ARM编译开发环境5.1.2ADS编译环境下的伪操作和宏指令5.1.3GNU编译环境下的伪操作和宏指令5.1.4ARM汇编语言的伪指令开发环境:它由ARM公司开发,使用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境::它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。编译环境下的伪操作可分为以下几类:符号定义(SymbolDefinition)伪操作数据定义(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作信息报告(Reporting)伪操作其他(Miscellaneous)伪操作声明一个全局的算术变量,并将其初始化成0。GBLLGBLLVariable声明一个全局的逻辑变量,并将其初始化成{FALSE}。GBLSGBLSVariable声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLAVariable声明一个局部的算术变量,并将其初始化成0。LCLLLCLLVariable声明一个局部的逻辑变量,并将其初始化成{FALSE}。LCLSLCLSVariable声明一个局部的串变量,并将其初始化成空串“”。SETASETAVariableexpr给一个全局或局部算术变量赋值。SETLSETLVariableexpr给一个全局或局部逻辑变量赋值。SETSSETSVariableexpr给一个全局或局部字符串变量赋值。RLISTnameLIST{listofregisters}为一个通用寄存器列表定义名称。CNnameCNexpr为一个协处理器的寄存器定义名称。CPnameCPexpr为一个协处理器定义名称。DN/SNnameDN/SNexprDN/SN为一个双精度/单精度的VFP寄存器定义名称。FNnameFNexpr为一个FPA浮点寄存器定义名称。声明一个数据缓冲池(也称为文字池)的开始。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用于分配一段半字对齐的半字内存单元。,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能够根据条件重复汇编相同的一段源代码。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}…;宏代码MENDMACRO标识宏定义的开始,MEND标识宏定义的结束。MERIT用于从宏中跳转出去。用MACRO和MEND定义的一段代码,称为宏定义体。通过宏名称来调用宏。对汇编程序的第二遍扫描中,如果其中ASSERT中条件不成立,ASSERT伪操作将报告该错误信息。INFOINFOnumeric-expression,string-expression在汇编处理过程的第一遍扫描或者第二遍扫描时INFO伪操作报告诊断信息。OPTOPTn通过OPT伪操作可以在源程序中设置列表选项。TTLTTLtitle在列表文件的每一页的开头插入一个标题。SUBTSUBTsubtitle在列表文件的每一页的开头插入一个子标题。指令。EQUnameEQUexpr{,type}为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称,类似于C语言中的#define宏定义。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定义局部变量的有效范围。编译环境下的伪操作可分为以下几类:常量编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作常量编译控制伪操作:伪操作语法格式作用.byte.byteexpr{,expr}…分配一段字节内存单元,并用expr初始化。.hword/.short.hwordexpr{,expr}…分配一段半字内存单元,并用expr初始化。.ascii.asciiexpr{,expr}…定义字符串expr(非零结束符)。.asciz/.string.ascizexpr{,expr}…定义字符串expr(以/0为结束符)。.float/.single.floatexpr{,expr}…定义一个32bitIEEE浮点数expr。.double.doubleexpr{,expr}…定义64bitIEEE浮点数expr。word/.long/.int.wordexpr{,expr}…分配一段字内存单元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字节内存单元,用size长度value填充repeat次。.zero.zerosize分配一段字节内存单元,并用0填充内存。.space/.skip.spacesize{,value}分配一段内存单元,用value将内存单元初始化。定义域中包含的段。.text.text{subsection}将操作符开始的代码编译到代码段或代码段子段。.data.data{subsection}将操作符开始的数据编译到数据段或数据段子段。.bss.bss{subsection}将变量存放到.bss段或.bss段的子段。.code16/.thumb.code16.thumb表明当前汇编指令的指令集选择Thumb指令集。.code32/.arm.code32.arm表明当前汇编指令的指令集选择ARM指令集。.end.end标记汇编文件的结束行,即标号后的代码不作处理。.include.include“filename”将一个源文件包含到当前源文件中。.align/.balign.align{alignment}{,fill}{,max}通过添加填充字节使当前位置满足一定的对齐方式。、.exitm及.endm.macroacroname{parameter{,parameter}…}….endm.macro伪操作标识宏定义的开始,.endm标识宏定义的结束。用.macro及.endm定义一段代码,称为宏定义体。.exitm伪操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。其中else可以缺省。在汇编符号列表文件中插入一分页符。.list.list产生汇编列表(从.list到.nolist)。.nolist.nolist表示汇编列表结束处。.title.title“heading”使用“heading”作为标题。.sbttl.sbttl“heading”使用“heading”作为子标题。.ltorg.ltorg在当前段的当前地址(字对齐)产生一个文字池。.req.reqname,expr为一个特定的寄存器定义名称。.err.err使编译时产生错误报告。.print.printstring打印信息到标准输出。.fail.failexpr编译汇编文件时产生警告。{cond}register,expr将基于PC或基于寄存器的地址值读取到寄存器中。小范围的地址读取。ADRLADRL{cond}register,expr将基于PC或基于寄存器的地址值读取到寄存器中。中等范围的地址读取。LDRLDR{cond}register,=[expr|label-expr]将一个32位的立即数或者一个地址值读取到寄存器中。大范围的地址读取。NOPNOP在汇编时将被替换成ARM中的空操作。汇编语言程序设