版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统开发与应用第三部分基于ARM的嵌入式软件开发基础基于ARM的嵌入式软件开发基础ARM汇编语言的伪操作、宏指令与伪指令ARM汇编语言程序设计嵌入式C语言程序设计基础嵌入式C语言程序设计实例嵌入式C语言程序设计技巧C与汇编语言混合编程第一讲
ARM汇编语言的伪操作、宏指令与伪指令ARM汇编语言的伪操作宏指令与伪指令伪操作、宏指令及伪指令概念两种常见的ARM编译环境ADS编译环境下的伪操作GNU编译环境下的伪操作ARM汇编语言的伪指令一、伪操作、宏指令及伪指令概念伪操作是ARM汇编语言程序里的一些特殊指令助记符,主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。宏指令是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。二、两种常见的ARM编译开发环境ADS/SDTIDE开发环境:它由ARM公司开发,使用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境::它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。三、ADS环境下的伪操作和宏指令
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定义局部变量的有效范围。四、GNU环境下的伪操作和宏指令
GNU编译环境下的伪操作可分为以下几类:常量编译控制伪操作字符编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作常量编译控制伪操作
伪操作语法格式作用.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将内存单元初始化。常量编译控制伪操作.byte.byteexpr{,expr}…..分配一段字节内存单元(字节对齐),并用expr初始化.byte21,48,89,0x13,0xff常量编译控制伪操作.hword和.short.hwordexpr{,expr}…...shortexpr{,expr}…..分配一段半字的单元,并用expr初始化.hword21,25,89,0x1133,0x77FF.short236,0xF4F常量编译控制伪操作.ascii.asciiexpr{,expr}…..定义字符串expr(非零结束符).ascii“Howareyou”/*不是以“/0”结束*/常量编译控制伪操作.ascii和.string.asciiexpr{,expr}…...stringexpr{,expr}…..定义字符串expr,以“/0”结束.ascii“howareyou”.string“howareyou”常量编译控制伪操作.float和.single.floatexpr{,expr}…...singleexpr{,expr}…..定义一个32位的IEEE浮点数expr.floatexpr.singleexpr.float0F3.14,0F359.3E11.single0F12341234.14E2常量编译控制伪操作.double.doubleexpr{,expr}…..定义64位浮点数.double0F2E1常量编译控制伪操作.word和.long和.int.wordexpr{,expr}…...longexpr{,expr}…...intexpr{,expr}…..分配一段字内存单元,并用expr初始化.word21,0x110033,0x77ff2255Src:.long1,2,3,4,5,6,7,8/*定义一个数据区,以Src为起始地址*/常量编译控制伪操作.fill.fillrepeat{,size}{,value}分配一段字节的内存单元,用size长度value填充repeat次size缺省为1,value缺省为0.fill8,4,0xffffffff/*分配8个4字节的内存单元,用0xffffffff初始化*/常量编译控制伪操作.zero.zerosize分配一段字节内存单元,并用0初始化.zero400/*分配400个内存单元并用0初始化*/常量编译控制伪操作.space和.skip.spacesize{,value}.skipsize{,value}分配一段内存单元,并用value初始化,value缺省为0.space10,0xff/*分配10字节内存单元,用0xff初始化*/.skip22/*分配22字节内存单元,用0初始化*/字符编译控制伪操作伪操作语法格式应用举例.equ.set.equsymbol,expr.setsymbol,expr.equnum,20.equPCON,0x0123.global.globl.globalsymbol.globlsymbol.globalFunc.globl__start.extern.externsymbol.externFunc.externnum汇编程序代码控制伪操作伪操作语法格式作用.section.sectionexpr定义域中包含的段。.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}通过添加填充字节使当前位置满足一定的对齐方式。汇编程序代码控制伪操作.section.sectionexpr定义域中包含的段,expr可以是.text、.data、.bss.section.bss.section.text汇编程序代码控制伪操作.text.text表示代码段或代码子段.text_start:MOVR0,#10MOVR1,#5ADDR0,R0,R1.end汇编程序代码控制伪操作.data.data定义数据段或数据子段.dataSrc:.long1,2,3,4,5,6,7,8,9,0Dst:.long0,1,2,3,4,5,6,7,8,9汇编程序代码控制伪操作.bss.bss将变量存放到.bss段汇编程序代码控制伪操作.code16|32(.thumb和.arm)选择是ARM指令集还是Thumb指令集.code32Header:ADRR0,Start+1BXR0.code16Start:MOVR0,#10MOVR1,#3BLdoadd汇编程序代码控制伪操作.end汇编文件结束,后面的代码不做处理汇编程序代码控制伪操作.include将一个源文件包含到当前源文件中.include“44b0.h”汇编程序代码控制伪操作.align和.balign.align{alignment}{,fill}{,max}
通过填充一定的字节,满足一定的对齐方式,alignment对齐方式,可以是2的次幂,缺省是4,fill是填充内容,max填充的最大字节,如果填充字节数超过max就不进行对齐.align4宏及条件编译控制伪操作
伪操作语法格式作用.macro、.exitm及.endm.macroacroname{parameter{,
parameter}…}….endm.macro伪操作标识宏定义的开始,.endm标识宏定义的结束。用.macro及.endm定义一段代码,称为宏定义体。.exitm伪操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。其中else可以缺省。宏及条件编译控制伪操作.macro和.endm.macromacroname{param{,param}….}……..endm宏及条件编译控制伪操作.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,{R0}LDRR0,=\LabelLDRR0,[R0]STRR0,[SP,#4]LDMFDSP!,{R0,PC}.endmHANDLERFunc宏及条件编译控制伪操作.exitm提前推出宏.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,{R0}LDRR0,=\Label.exitmLDRR0,[R0]STRR0,[SP,#4]LDMFDSP!,{R0,PC}.endm宏及条件编译控制伪操作.ifdef、.else、.endif.ifdefPLLONSTARTLDRR0,=PLLCONSTRR1,[R0]endif其他伪操作伪操作语法格式作用.eject.eject在汇编符号列表文件中插入一分页符。.list.list产生汇编列表(从.list到.nolist)。.nolist.nolist表示汇编列表结束处。.title.title“headin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常见危重疾病抢救流程(脊柱外科)
- 《家具与室内透视》课件
- 百万医疗险销售
- 鸿门宴课件统编版
- 手指骨折的手术护理查房
- 二零二四年度股权激励合同标的及激励方案
- 锅炉执行标准课件
- 《酒店客人的类型》课件
- 二零二四年度化工企业并购合同3篇
- 2024年度知识产权许可合同模板:新型专利技术使用授权2篇
- 发电公司二十五项反措对照检查项目表
- 伙食费用收支明细表-1
- 个人防护用品PPE培训资料ppt课件
- 班会课感恩同学PPT.ppt
- 浙江省初二数学竞赛试卷与答案华
- 优秀管理者的高效沟通
- 慢阻肺的防治PPT课件
- 部编版三年级上语文《读不完的大书》教案+反思
- 百分数的认识1018
- 临床教学方法与技巧(课堂PPT)
- 【发酵工程】余龙江版 第11章 发酵产物的分离纯化
评论
0/150
提交评论