




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式与嵌入式与ARM体系结构体系结构知识回顾嵌入式嵌入式ARM指令系统指令系统 了解了解ARMARM指令系统的特点指令系统的特点掌握掌握ARMARM指令的寻址方式指令的寻址方式 掌握掌握ARMARM各类指令的使用各类指令的使用4ARM汇编程序设计第章本章目标掌握掌握ARMARM汇编规范汇编规范掌握掌握ARMARM指令的汇编程序设计指令的汇编程序设计掌握汇编语言与掌握汇编语言与C C语言的混合编程语言的混合编程两种常见的两种常见的ARM编译开发环境编译开发环境ADS/SDT IDE开发环境:它由ARM公司开发,使用了CodeWarrior公司的编译器; 集成了GNU开发工具的IDE开发环境:它
2、由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。 4.1 概述概述v 一个简单的ARM 指令集的汇编程序1 AREA ARMex, CODE, READONLY2 ; Name this block of code ARMex.3 ENTRY ; Mark first instruction to execute4 start MOV R0, #10 ; Set up parameters5 MOV R1, #36 ADD R0, R0, R1 ; R0 = R0 + R17 END ; Mark end of file 4.1概述概述 行1:AREA 指示符定义本程序段为代码段,
3、名字是ARMex,属性为只读。 行2:关于行1 的注释。注释以“;”开始。 行3:ENTRY 指示符,标志程序中被执行的第一条指令。因此,程序中有且只能有一个ENTRY指示符。 行4:start 是一个标号,其值是一个地址。其后是ARM 指令,将立即数10 赋给寄存器R0 行5:将立即数3 赋给寄存器R1 行6:计算R0=R0+R1 行7:END 指示符,指示汇编器结束对该源程序的处理。所以每个汇编程序都必须包含一个END 行。4.1概述概述v 一个简单的Thumb 指令集的汇编程序AREA ThumbSub, CODE, READONLY ; Name this block of code
4、ENTRY ; Mark first instruction to execute CODE32 ; Subsequent instructions are ARMheader ADR R0, start + 1 ; Processor starts in ARM state, BX R0 ; so small ARM code header used ; to call Thumb main program. CODE16 ; Subsequent instructions are Thumb. startMOV R0, #10 ; Set up parameters MOV R1, #3
5、BL doadd ; Call subroutinedoadd ADD R0, R0, R1 ; Subroutine code MOV pc, lr ; Return from subroutine. END ; Mark end of file 这个程序比前一个复杂一些,主要使用Thumb 指令集,并调用子程序。 行3:CODE32 指示符,指示汇编器将其下的代码汇编为ARM(32 位)指令,直到遇到CODE16指示符。 CODE32 CODE32 和和CODE16 CODE16 只用于指示汇编器,并不在运行过程中更改处只用于指示汇编器,并不在运行过程中更改处理器的指令状态。理器的指令状态
6、。该汇编程序虽然使用Thumb 指令集,但是程序还是从32 位的ARM 指令开始。 行4:ADR 伪指令将行8 指令的地址赋予R0,且R0 最低位是1。 行5:BX 指令使程序跳转到行9 指令,并且根据R0 最低位为1 使处理器转入Thumb 状态。 行6 :CODE16 指示符,指示汇编器将其下的代码汇编为Thumb(16 位)指令。 行10:BL 指令调用子程序,其首地址是doadd。BL 还会将返回地址保存到lr 寄存器。 行12,将lr 寄存器内容赋予pc,即子程序返回。 ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在在ARM程序设计中,
7、常用的源文件可简单分为以下几种程序设计中,常用的源文件可简单分为以下几种:源程序文件文件名说 明汇编程序文件*.S用ARM汇编语言编写的ARM程序或Thumb程序。C程序文件*.C用C语言编写的程序代码。头文件*.H为了简化源程序,把程序中常用到的常量命名、宏定义、数据结构定义等等单独放在一个文件中,一般称为头文件。v在ARM( Thumb)汇编语言程序中,以段为单位组织以段为单位组织源文件。源文件。段是相对独立的指令或数据序列,具有特定的名称。v段可以分为代码段和数据段段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。v一个汇编程序至少应该有一个代码段,当
8、程序较长时,一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件时最终形成一个可执行的映象文件。可执行映象文件通常由以下几部分构成可执行映象文件通常由以下几部分构成: v一个或多个代码段,代码段的属性为只读代码段的属性为只读。 v零个或多个包含初始化数据的数据段,数据段的属性为可读写数据段的属性为可读写。 v零个或多个不包含初始化数据的数据段,数据段的属性为可读写。 ARM汇编语言语句格式如下所示汇编语言语句格式如下所示:symbolinstruction|direct
9、ive|pseudo-instruction ;comment 其中:instruction为指令。 directive为伪操作。 pseudo-instruction为伪指令。 symbolsymbol为符号,顶头为符号,顶头/ /顶格书写。顶格书写。 commentcomment为语句的注释,在为语句的注释,在“;”符号后面。符号后面。 注意: 源程序中允许空行源程序中允许空行。除了标号和注释,指令等指令等都必须有前导空格,即它们不能顶格不能顶格。 如果单行代码太长,可以将其分行。注释,除最后一行外,都以“/”结尾,并且“/”后不能有任何字符,包括空格和TAB。 指令既可以大写,也可以小写
10、,但不要混用但不要混用。寄存器也一样。指示符必须大写。注释从注释从“;”开始,到该开始,到该行结束为止。行结束为止。v 伪操作伪操作是ARM汇编语言程序里的一些特殊指令助记符,其作用主要是完成汇编程序做各种准备工作,在源程序进行在源程序进行汇编时由汇编程序处理汇编时由汇编程序处理,而不是在计算机运行期间由机器而不是在计算机运行期间由机器执行执行.v 宏指令是一段独立的程序代码,可插在源程序中,它通过伪它通过伪操作来定义操作来定义.v 伪指令伪指令是ARM汇编语言程序里的一些特殊指令助记符,不在处理器运行期间执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作
11、.v ARM汇编中常用的符号汇编中常用的符号v 在汇编语言程序设计中,经常使用各种符号代替地址、使用各种符号代替地址、变量和常量等变量和常量等,以增加程序的可读性。当符号代表地址当符号代表地址时又称为标号时又称为标号。符号包括变量、数字常量、标号、局部标号。尽管符号的命名符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定必须遵循以下的约定:1.符号由大小写字母、数字以及下划线组成。2.局部标号以数字开头局部标号以数字开头,其他符号都不能以数字开头。 3.符号区分大小写符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 4.符号在其作用范围内必须唯一。 5.自定义的符号名
12、不能与系统的保留字相同。 6.符号名不应与指令或伪指令同名符号名不应与指令或伪指令同名。 汇编代码中的符号汇编代码中的符号AREA ARMex, CODE, READONLYENTRY start MOV R0, #10 MOV R1, #3ADD R0, R0, R1 STARTMOV R1, #3GBLAarith;声明数字变量arith SETA 0 xEF;赋值MOV R0,#arithnumEQU 20num2EQU 32END v变量变量在ARM汇编语言中,变量有数字变量、逻辑变量和串变变量有数字变量、逻辑变量和串变量量3种类型。 声明全局变量全局变量伪操作 GBLA(数字变量)(
13、数字变量),GBLL(逻辑变量),GBLS(串变量) 声明局部变量局部变量伪操作 LCLA,LCLL,LCLS 变量赋值变量赋值伪操作 SETA,SETL,SETSv数字常量数字数字常量常量一般有一般有3种表示方式种表示方式: 十进制数,如:12,46。 十六进制数,如:0 x12,0 xff。 N进进制数,用进进制数,用n_xxx表示表示,其中其中n=29,xxx为具体数为具体数。如:2_010010,8_432。在ARM汇编语言中,使用使用EQU伪操作来定义数字常量伪操作来定义数字常量。ADS编译环境下的伪操作编译环境下的伪操作ADS编译环境下的伪操作可分为以下几类:符号定义(Symbol
14、 Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作 符号定义伪操作符号定义伪操作 伪操作语法格式作 用GBLAGBLA Variable声明一个全局的算术变量,并将其初始化成0。GBLLGBLL Variable声明一个全局的逻辑变量,并将其初始化成FALSE。GBLSGBLS Variable声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLA Variable声明一个局部的算术变量,并将其初始化成0。LCLLLCLL
15、 Variable声明一个局部的逻辑变量,并将其初始化成FALSE。LCLSLCLS Variable声明一个局部的串变量,并将其初始化成空串“”。SETASETA Variable expr给一个全局或局部算术变量赋值。SETLSETL Variable expr给一个全局或局部逻辑变量赋值。SETSSETS Variable expr给一个全局或局部字符串变量赋值。RLISTname LIST list of reg为一个通用寄存器列表定义名称。CNname CN expr为一个协处理器的寄存器定义名称。CPname CP expr为一个协处理器定义名称。DN/SNname DN/SN e
16、xprDN/SN为一个双精度/单精度的VFP寄存器定义名称。FNname FN expr为一个FPA浮点寄存器定义名称。v 数据定义伪操作数据定义伪操作v SPACE (c中的全局变量) 用于分配一块连续内存单元,并用用于分配一块连续内存单元,并用0初始化初始化。SPACE可用%代替。格式:label SPACE expr label:是一个标号,可选。 expr:分配的内存字节数字节数。示例: Data SPACE 100 ;分配100字节内存单元,并用0初始化v 数据定义伪操作v DCB 用于分配段字节内存单元用于分配段字节内存单元,并用伪操作中的expr初始化。DCB可用可用=代替代替。
17、格式:label DCB expr,expr label:是一个标号,可选。 expr:可以为-128255的数值或者字符串。示例: string DCB “hello” ;构造一个字符串v 数据定义伪操作v DCD及DCDU 用于分配段字内存单元用于分配段字内存单元(分配的内存都是字对齐分配的内存都是字对齐, DCDU并不严格字对齐并不严格字对齐),并用伪操作中的expr初始化。DCD可用&代替。格式:label DCD expr,expr label:是一个标号,可选。 expr:数字表达式或程序中的标号。示例: data DCD 1,3,5,6 ;分配字单元,字对齐。v其他伪操作
18、其他伪操作AREA 功能:创建一段新的程序代码或数据区。 格式:AREA name , attr , 其中:name 给出的程序段名,attr 段名属性。 例如: AREA boot ,CODE ,READONLY 表示创建一个段名为表示创建一个段名为boot的程序,属于代码段,只读的程序,属于代码段,只读 AREA library_register ,DATA ,READWRITE 表示创建一个段名为表示创建一个段名为library_register的程序,属于数据段,读写的程序,属于数据段,读写 在汇编时,必须至少有一个在汇编时,必须至少有一个AREA 指示符。使用指示符。使用AREA 符
19、号可以将源程序区分,符号可以将源程序区分,但必须不重名(段名不重名,但必须不重名(段名不重名,段名与标号也要不重名)段名与标号也要不重名)。 v END 功能:表示源程序的结束 格式:END 所有汇编语言源文件必须以END 结束,汇编器遇到END,将结束汇编。v ENTRY 功能: 指定程序的入口点。 格式:ENTRY 在程序中必须定义唯一的ENTRY 指示符,(一个项目中可以有多一个项目中可以有多个程序,但是有且只有一个个程序,但是有且只有一个ENTRY,作为汇编程序的入口点)作为汇编程序的入口点)如果如果ENTRY 不存在,或者有多个不存在,或者有多个ENTRY,在链接时会产生错误信息,在
20、链接时会产生错误信息。 例: AREA boot ,CODE ,READONLY ENTRYv EQU (define,宏)宏) 功能:对1个常量标号赋值(数字) 格式:name EQU expression 其中:name 符号名,expression 寄存器相关或者程序相关的固定值例如:例如: osTimer_OSMR0 EQU0 x40a00000 num EQU 2 ;数字2 赋予符号num EQU,等同于C 语言中用#define 定义一个常量v EXPORT 或GLOBAL 功能:定义1个函数名。 格式: EXPORT symbol 其中:symbol 函数名,对大小写敏感 EXP
21、ORT,等同于C 语言中用int 定义1个函数 例如:例如: EXPORTpost_initVariant;定义函数v 使用EXPORT 符号可以在其它文件中引入当前文件的符号v IMPORT 功能:引用1个变量(符号名)。 格式: IMPORT symbol 其中:symbol 变量名,对大小写敏感 IMPORT,等同于C 语言中用extern 引用1个变量例如:例如: IMPORTbuttonStatus ;引用1个在别的程序中已定义的变量(符号名)。ARM汇编语言的伪指令汇编语言的伪指令伪指令不是真正的ARM或Thumb指令,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从
22、而实现真正的指令操作. ARM伪指令包括:ADR,ADRL,LDR,NOP. Thumb伪指令包括: ADR, LDR,NOP.小范围的地址读取伪指令小范围的地址读取伪指令 ADR将基于PC或基于寄存器的地址值读取到寄存器中。小范围的小范围的地址读取(一般是离此伪指令不远的标号)。地址读取(一般是离此伪指令不远的标号)。格式:ADR cond register,exprcond:指令执行条件register:目标寄存器expr:基于PC或寄存器的地址表达式1. 当地址值不是字对齐时,其取值范围为-255255字节。2. 当地址值是字对齐时,其取值范围为-10201020字节。3. 当地址值是1
23、6字节对齐时,其取值范围为更大。v例子:start mov r0,#1ADR r1,start中等范围的地址读取伪指令中等范围的地址读取伪指令 ADRL(ARM有效,有效,THUMB无效)无效)将基于PC或基于寄存器的地址值读取到寄存器中。中等范围的地址读取。(Thumb状态下无效)格式:ADRL cond register,exprcond:指令执行条件register:目标寄存器expr:基于PC或寄存器的地址表达式1.当地址值不是字对齐时,其取值范围为-64KB64KB字节。2.当地址值是字对齐时,其取值范围为-256KB256字节。3.当地址值是16字节对齐时,其取值范围为更大。v例子
24、:start mov r0,#10ADR r1,start+6000大范围的地址读取伪指令大范围的地址读取伪指令 LDR将一个32位的立即数或者一个地址值读取到寄存器中。大范围的地址读取。格式:LDR cond register,=expr | label-exprcond:指令执行条件register:目标寄存器expr:32位常量,label-expr为基于PC的地址表达式或者外部表达式。LDR伪指令两种用途:当需要读取到寄存器的数据超过了MOV/MVN指令可操作的范围时,可使用LDR伪指令读取。将一个基于PC的地址值或者外部地址的值读取到寄存器v例子:LDR R1,=0 x1122334
25、4LDR R1,=STOPv 通过下面 的例子进一步体会LDR 指令的使用AREA boot ,CODE ,READONLYAREA boot ,CODE ,READONLYENTRYENTRYstartstartmovmov r14,pc r14,pc;保护保护PCPC指针指针ldrldr pc,= pc,=post_initGpiopost_initGpio;调用子程序调用子程序 初始化初始化GPIOGPIO;延时延时ldrldr r0,= r0,=postDelaypostDelay;r0=;r0=延时时间常数延时时间常数postLooppostLoopsub r0,r0,#0 x1sub r0,r0,#0 x1;r0=r0-1;r0=r0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村采购吸粪车合同范例
- 公寓出售标准合同范例
- 冰激淋生产销售合同范例
- led灯具采购合同范例
- 预制盖板场地施工方案
- 云南白药购销合同范例
- 公司场所租赁合同范例
- 农村奶牛转让合同范例
- 东丰租房合同范例
- 公司租赁库房合同范例
- 线性代数试题(完整试题与详细答案)
- DZT 0445-2023 天然气水合物术语
- 双重血浆置换
- 2024年贵州省六盘水市中考二模道德与法治试题
- 2024年辅警考试公基常识300题(附解析)
- 2024年上海公安机关勤务辅警招聘笔试参考题库附带答案详解
- 健康知识科普讲座主题
- 篮球突分技术与配合-教学设计
- 【音乐】歌唱祖国-《彩色的中国》课件 2023-2024学年人音版初中音乐七年级上册
- JJF 2095-2024压力数据采集仪校准规范
- 2023年上海市16区数学中考二模汇编2 方程与不等式(39题)含详解
评论
0/150
提交评论