[工学]zz-ARM汇编伪指令课件_第1页
[工学]zz-ARM汇编伪指令课件_第2页
[工学]zz-ARM汇编伪指令课件_第3页
[工学]zz-ARM汇编伪指令课件_第4页
[工学]zz-ARM汇编伪指令课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、zhaiQYARM伪指令ARM汇编语言的伪操作ARM汇编语言的宏指令ARM汇编语言的伪指令ARM汇编语言程序设计主要内容两种常见的ARM编译开发环境ADS/SDT、RealView MDK等ARM公司推出的开发工具ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种ARM 开发工具的能力。 以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。两种常见的ARM编译开发环境ADS/SDT、RealView MDK等ARM公司推出的开发工具ARM 将Keil 公司收购

2、之后,正式推出了针对ARM 微控制器的开发工具Real View MDK 或者MDK,它将ARM 开发工具RealView Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM 微控制器开发工具。两种常见的ARM编译开发环境GNU ARM开发工具GNU是“GNUs Not Unix”的递归缩写。在1983年9月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。 GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基

3、于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器gcc和连接器ld组成。ADS编译环境下的伪操作和宏指令 ADS编译环境下的伪操作可分为以下几类:符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作 符号定义伪操作 伪操作语法格式作 用GBLAGBLA Variable声明一个全局的算术变量,并将其初始化成0。GBLLGBLL Variable声明一个全局的逻辑变量,并将其初始化成FALSE。GBLSG

4、BLS Variable声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLA Variable声明一个局部的算术变量,并将其初始化成0。LCLLLCLL Variable声明一个局部的逻辑变量,并将其初始化成FALSE。LCLSLCLS Variable声明一个局部的串变量,并将其初始化成空串“”。SETASETA Variable expr给一个全局或局部算术变量赋值。SETLSETL Variable expr给一个全局或局部逻辑变量赋值。SETSSETS Variable expr给一个全局或局部字符串变量赋值。RLISTname LISTlist of registers

5、为一个通用寄存器列表定义名称。CNname CN expr为一个协处理器的寄存器定义名称。CPname CP expr为一个协处理器定义名称。DN/SNname DN/SN exprDN/SN为一个双精度/单精度的VFP寄存器定义名称。FNname FN expr为一个FPA浮点寄存器定义名称。数据定义伪操作 伪操作语法格式作 用LTORGLTORG声明一个数据缓冲池(也称为文字池)的开始。MAPMAP expr,base-register定义一个结构化的内存表(Storage Map)的首地址。FIELDlabel FIELD expr定义一个结构化内存表中的数据域。SPACElabel S

6、PACE expr分配一块连续内存单元,并用0初始化。DCBlabel DCB expr,expr分配一段字节内存单元,并用expr初始化。DCD/ DCDUlabel DCD expr ,expr分配一段字内存单元。DCDOlabel DCDO expr,expr分配一段字对齐的字内存单元。DCFD/ DCFDUlabel DCFD Ufpliteral,fpliteral为双精度的浮点数分配字对齐的内存单元。 DCFS/ DCFSUlabel DCFS U fpliteral ,fpliteral为单精度的浮点数分配字对齐的内存单元。DCIlabel DCI expr,expr在ARM代码

7、中分配一段字对齐的内存单元; 在Thumb代码中,分配一段半字对齐的半字内存单元。DCQ/ DCQUlabel DCQUliteral,literal分配一段以双字(8个字节)为单位的内存DCW/ DCWUlabel DCWUexpr,exprDCW用于分配一段半字对齐的半字内存单元。汇编控制伪操作 伪操作语法格式作 用IF,ELSE及ENDIFIF logical expressionELSEENDIF能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。WHILE及WENDWHILE logical expressionWEND能够根据条件重复汇编相同的一段源代码。MACRO

8、 、MEND及MEXITMACRO$label macroname $parameter,$parameter;宏代码MENDMACRO标识宏定义的开始,MEND标识宏定义的结束。MERIT用于从宏中跳转出去。用MACRO和MEND定义的一段代码,称为宏定义体。通过宏名称来调用宏。信息报告伪操作 伪操作语法格式作 用ASSERTASSERT logical expression对汇编程序的第二遍扫描中,如果其中ASSERT中条件不成立,ASSERT伪操作将报告该错误信息。INFOINFO numeric-expression,string-expression在汇编处理过程的第一遍扫描或者第二

9、遍扫描时INFO伪操作报告诊断信息。OPTOPT n通过OPT伪操作可以在源程序中设置列表选项。TTL TTL title在列表文件的每一页的开头插入一个标题。SUBTSUBT subtitle在列表文件的每一页的开头插入一个子标题。伪操作语法格式作 用CODE16CODE16说明后面的指令序列为16位的Thumb指令CODE32CODE32说明后面的指令序列为32位的ARM指令。EQUname EQU expr,type定义一个字符名称,类似于C语言中的define宏定义。AREAAREA sectionname,attr,attr定义一个代码段或者数据段。ENTRYENTRY指定程序的入口

10、点。ENDEND说明到了源程序结尾。ALIGNALIGN expr,offset通过添加补丁字节使当前位置满足一定的对齐方式。EXPORT/ GLOBALEXPORT symbol WEAK声明一个符号可以被其他文件引用.IMPORTIMPORT symbol WEAK说明当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。EXTERNEXTERN symbol WEAK说明当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。GET/ INCLUDEGET filename将一个源文件包含到当前源文件中,并将被包含的文件在

11、其当前位置进行汇编处理。INCBININCBIN filename将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。KEEPKEEPsymbol说明将局部符号包含在目标文件的符号表中。NOFPNOFP禁止源程序中包含浮点运算指令。REQUIREREQUIRE lable指定段之间的相互依赖关系。RNname RN expr为一个特定的寄存器定义名称。ROUTname ROUT定义局部变量的有效范围。其他伪操作GNU编译环境下的伪操作和宏指令 GNU编译环境下的伪操作可分为以下几类:常量编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作常量编译控制伪操作伪操作语法格式作

12、 用.byte.byte expr ,expr 分配一段字节内存单元,并用expr初始化。.hword/.short.hword expr ,expr 分配一段半字内存单元,并用expr初始化。.ascii.ascii expr ,expr 定义字符串expr(非零结束符)。.asciz /.string.asciz expr ,expr 定义字符串expr(以/0为结束符)。.float/.single.float expr ,expr 定义一个32bit IEEE 浮点数expr。.double.double expr ,expr 定义64bit IEEE浮点数expr。word/.lon

13、g /.int.word expr ,expr 分配一段字内存单元,并用expr初始化。.fill.fill repeat ,size,value分配一段字节内存单元,用size长度value填充repeat次。.zero.zero size分配一段字节内存单元,并用0填充内存。.space/.skip.space size , value分配一段内存单元,用value将内存单元初始化。汇编程序代码控制伪操作 伪操作语法格式作 用.section.section expr定义域中包含的段。.text.text subsection将操作符开始的代码编译到代码段或代码段子段。.data.data

14、 subsection将操作符开始的数据编译到数据段或数据段子段。.bss.bss subsection将变量存放到.bss段或.bss段的子段。.code 16/.thumb.code 16.thumb表明当前汇编指令的指令集选择Thumb指令集。.code 32/.arm.code 32.arm表明当前汇编指令的指令集选择ARM指令集。.end.end标记汇编文件的结束行,即标号后的代码不作处理。.include.include “filename”将一个源文件包含到当前源文件中。.align/.balign.align alignment ,fill ,max通过添加填充字节使当前位置满

15、足一定的对齐方式。宏及条件编译控制伪操作 伪操作语法格式作 用.macro、.exitm及.endm.macro acronameparameter, parameter.endm.macro伪操作标识宏定义的开始,.endm标识宏定义的结束。用.macro及.endm定义一段代码,称为宏定义体。.exitm伪操作用于提前退出宏。. ifdef,.else及.endif.ifdef condition.else.endif当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。其中else可以缺省。其他伪操作 伪操作语法格式作 用.eject.eject在汇编符号列表文件中插入一分

16、页符。.list.list产生汇编列表(从 .list 到 .nolist)。.nolist.nolist表示汇编列表结束处。.title.title “heading”使用“heading ”作为标题。.sbttl.sbttl “heading”使用“heading”作为子标题。.ltorg.ltorg在当前段的当前地址(字对齐)产生一个文字池。.req.req name,expr为一个特定的寄存器定义名称。.err.err使编译时产生错误报告。.print.print string打印信息到标准输出。.fail.fail expr编译汇编文件时产生警告。汇编语言伪指令伪指令是ARM处理器支

17、持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。 ARM汇编语言语句格式 ARM汇编语言语句格式如下所示:symbol instruction | directive | pseudo-instruction ;comment 其中:instruction为指令。 directive为伪操作。 pseudo-instruction为伪指令。 symbol为符号。 comment为语句的注释。 ARM汇编语言的伪指令 伪指令语法格式作 用ADRADRcond register , expr将基于P

18、C或基于寄存器的地址值读取到寄存器中。小范围的地址读取。ADRLADRL cond register,expr将基于PC或基于寄存器的地址值读取到寄存器中。中等范围的地址读取。LDRLDR cond register,=expr | label-expr将一个32位的立即数或者一个地址值读取到寄存器中。大范围的地址读取。NOPNOP在汇编时将被替换成ARM中的空操作。ARM汇编语言伪指令 1大范围地址读取伪指令LDRLDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。LDRcond register , = expression 如果加载的常数符合MOV或M

19、VN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。如果加载的常数不符合MOV或MVN指令立即数的要求,汇编器将常量放入内存文字池,并使用一条程序相对偏移的LDR指令从内存文字池读出常量。 伪指令语句:LDRR0,=0 x0AA00;R00 x0AA00汇编后:MOV R0,#435202中等范围地址读取伪指令ADRL它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 ADRLcond register , = expression汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用两条指令实现A

20、DRL伪指令的功能,则编译器报告错误,编译失败。 以下指令存放在0 x8000起始的地址单元,分析汇编后的结果。.global _start.text_start:MOVR0,#0 x0FADRL R0,_start.end解:汇编后的结果为:0 x00008000MOV R0, #0 x0F0 x00008004SUB R0, PC, #120 x00008008NOP (MOV R0,R0)3小范围地址读取伪指令ADR它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址是字节对齐时,取值范围为-255+255 ADRcond register , = expres

21、sion下列指令存放在0 x8000起始的地址单元,分析汇编后的结果。.global _start.text_start:MOVR0,#0 x0FADRR0,_start.end解:汇编后的结果为:0 x00008000MOV R0, #0 x0F0 x00008004SUB R0, PC, #124空操作伪指令NOPNOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作 .Thumb汇编语言伪指令 1大范围地址读取伪指令LDRLDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。其语法格式如下:LDR register , = expression2小范

22、围地址读取伪指令ADRADR为小范围地址读取伪指令,它将基于PC相对偏移的地址值读取到寄存器中。偏移量必须是正数并小于1KB。 ADR register , = expression相当于PC寄存器或其它寄存器的长转移。汇编器在处理源程序时,ADR伪指令一条具有ADR等同功能的thumb指令(通常用ADD或SUB指令)替代。如果不能用一条指令实现ADR伪指令的功能,则编译器报告错误,编译失败。 3空操作伪指令NOP NOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作(也就是什么也没做)指令,例如可能为:“MOVR0,R0” NOP空操作伪指令可用于延时操作。ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 源程序的基本结构举例AREA EXAMPLE,CODE,READONLYENTRYstartMOV r0,#10MOV r1,#3ADD r0,r0,r1END本程序的程序体部分实现了一个简单的加法运算。 源程序的基本结构举例/* Memory Setup stuff - tak

温馨提示

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

评论

0/150

提交评论