嵌入式系统开发与应用教程PPT课件_第1页
嵌入式系统开发与应用教程PPT课件_第2页
嵌入式系统开发与应用教程PPT课件_第3页
嵌入式系统开发与应用教程PPT课件_第4页
嵌入式系统开发与应用教程PPT课件_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

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

文档简介

1、1.ARM指令集概述;2.ARM寻址方式;3.数据处理指令、Load/Store指令;4.寄存器传送指令、转移指令、异常中断产生指令;5.ARM系统初始化6.Embest IDE集成开发环境、实验系统介绍;7.基于ARM的嵌入式软件开发基础:ARM汇编指令实验及C语言程序实验。第1页/共121页指令长度指令长度 指令集可以是以下任一种 32 bits 长 (ARM状态) 16 bits 长 (Thumb 状态) ARM7TDMI 支持3种数据类型 字节 (8-bit) 半字 (16-bit) 字 (32-bit) 字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐 第2页/共121

2、页一、 ARM指令集概述ARM指令集是32位的,ARM汇编程序的启动都是从ARM指令集开始。所有的ARM指令集都可以是有条件执行的。本节从以下三个方面介绍: 指令分类及指令格式 指令集编码 条件执行第3页/共121页指令分类及指令格式F ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。F ARM指令使用的基本格式如下: o p c o d e c o n d S Rd , R n ,operand2 第4页/共121页ARM指令集编码F ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了

3、第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。F 每条32位ARM指令都具有不同的二进制编码方式,和不同的指令功能相对应 。F 编码表如下:第5页/共121页指令集编码表第6页/共121页条件执行FARM指令根据CPSR中的条件位自动判断是否执行指令,在条件满足时,指令执行,否则指令被忽略。F在ARM的指令编码表中,统一占用编码的最高四位31:28来表示“条件码”(即“cond”)。 (P100页)第7页/共121页条件域表1条件码后缀标 志含 义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零

4、无符号数小于0100MIN置位负数0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出 1000 HIC置位Z清零无符号数高于第8页/共121页条件域表2条件码后缀标 志含 义1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL总是无条件执行第9页/共121页 二、二、 ARMARM寻址方式寻址方式ARMARM指令系统支持如下几种常见的寻址方式:指令系统支持如下几种常见的寻址方式:F立即寻址立即寻址F寄存器

5、寻址寄存器寻址F寄存器间接寻址寄存器间接寻址F基址加偏址寻址基址加偏址寻址 F堆栈寻址堆栈寻址 F块拷贝寻址块拷贝寻址 F相对寻址相对寻址 第10页/共121页立即寻址立即寻址F立即寻址也叫立即数寻址,这是一种特殊的寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:寻址方式也就叫做立即寻址。例如以下指令: ADDR0,R0,1/*R0R01*/ ANDR0,R0,0 x3f /

6、*R0R0 AND 0 x3f*/F 在以上两条指令中,第二个源操作数即为立即在以上两条指令中,第二个源操作数即为立即数,要求以数,要求以“”为前缀,对于以十六进制表示的立为前缀,对于以十六进制表示的立即数,还要求在即数,还要求在“”后加上后加上“0 x0 x”。第11页/共121页注:注:有效立即数问题有效立即数问题 在32位指令编码中存放32位立即数的方法是: 在ARM数据处理指令中,当参与操作的第二操作数为立即数型时,每个立即数都是采用一个8位的常数循环右移偶数位而间接得到。其中循环右移的位数由一个4位二进制的两倍表示,如果立即数记作,8位常数记作immed_8,4位的循环右移值记作ro

7、tate_imm,有效的立即数是由一个8位的立即数循环右移偶数位得到。因此有效立即数immediateimmediate可以表示成:=immed_8=immed_8循环右移(循环右移(2 2rotate_immrotate_imm) 第12页/共121页例:MOV R0, #0 x0000F200MOV R0, #0 x00012800MOV R0, #0 x00041400MOV R0, #0 x00041800MOV R0, #0 xF000000F第13页/共121页寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理

8、器经常采用的一种方式,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:也是一种执行效率较高的寻址方式。以下指令: ADDR0,R1,R2/*R0R1R2*/ 该指令的执行效果是将寄存器该指令的执行效果是将寄存器R1R1和和R2R2的内容相加,的内容相加,其结果存放在寄存器其结果存放在寄存器R0R0中中。第14页/共121页寄存器寻址F第二操作数为寄存器型的移位操作第二操作数为寄存器型的移位操作 在ARM指令的数据处理指令中参与操作的第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二操作数进行移位,即Rm,其中Rm称为第二操作数寄存器,用来

9、指定移位类型(LSL,LSR,ASL,ASR,ROR或RRX)和移位位数。移位位数可以是5位立即数(#)或寄存器(Rs)。在指令执行时将移位后的内容作为第二操作数参与运算。例如指令:ADD R3,R2,R1,LSR #2 ;R3R2 + R14第15页/共121页寄存器寻址寄存器寻址F第二操作数移位方式第二操作数移位方式 LSL:逻辑左移,空出的最低有效位用0填充。LSR:逻辑右移,空出的最高有效位用0填充。ASL:算术左移,由于左移空出的有效位用0填充,因此 它与LSL同义。ASR:算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用

10、0填充,如果是负数用1填充。 ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。RRX:带扩展的循环右移。将寄存器的内容循环右移1位,空位用原来C标志位填充。第16页/共121页寄存器寻址寄存器寻址 第17页/共121页寄存器寻址寄存器寻址F第二操作数的移位位数第二操作数的移位位数 移位位数可以用立即数方式或者寄存器方式给出,如下所示:ADD R3,R2,R1,LSR #2 ;R3 R2 + R14ADD R3,R2,R1,LSR R4 ;R3 R2 + R12R4寄存器R1的内容分别逻辑右移2位、R4位(亦即R14、R12R4),再与寄存器R2的内容相加,结果放入R3中。 第1

11、8页/共121页寄存器间接寻址寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: LDR R0,R1/*R0R1*/ STR R0,R1/*R1R0*/ 第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。第19页/共121页基址加偏址寻址基址加偏址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令又可以分为以下几种形式:前变址模式前变址模

12、式:LDR R0,R1,4;R0R14自动变址模式自动变址模式:LDR R0,R1,4!;R0R14、R1R14后变址模式后变址模式:LDR R0,R1 ,4;R0R1、R1R14第20页/共121页基址加偏址寻址基址加偏址寻址基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作,如下所示:LDR r0,r1,r2;r0mem32r1+r2LDR r0,r1,r2,LSL #2;r0r1+r2*4但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用。第21页/共121页堆栈寻址堆栈寻址F堆栈是一种数据结构,按先进后出(First In

13、Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。F当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。F即访问存储器时,存储器的地址向高地址方向生长,称为递增堆栈(ascending stack)。 存储器的地址向低地址方向生长,称为递减堆栈(descending stack)。 第22页/共121页堆栈寻址堆栈寻址四种类型的堆栈工作方式 F满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。F满递减堆栈:堆栈指针

14、指向最后压入的数据,且由高地址向低地址生成。F空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。F空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成 STMFD SP!,R1-R7,LR 满递减LDMFD SP!,R1-R7,LR 第23页/共121页块拷贝寻址块拷贝寻址F 块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可以把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。寻址操作中的寄存器可以是R0-R15这16个寄存器的子集或是所有寄存器。F LDM/STM指令依据其后缀名的不同其

15、寻址的方式也有很大不同,见下表。 第24页/共121页第25页/共121页例:STMIA R0!,R2-R9STMDB R1!,R2-R9LDMIB R0 ,R2-R9第26页/共121页相对寻址相对寻址 与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BLNEXT;跳转到子程序 ; NEXT处执行NEXT:MOVPC,LR;从子程序返回 第27页/共121页三、三、ARMARM指令详细介绍指令详细介绍 ARM指令集总体分为以下6类:F 数据处理

16、指令;F Load/Store指令;F转移指令;F程序状态寄存器与通用寄存器之间的传送指令; F异常中断指令;F 协处理器指令。第28页/共121页、数据处理指令F ARM的数据处理指令主要完成寄存器中数据的算术和逻辑运算操作。本节按以下内容组织: 数据处理指令分类 数据处理指令二进制编码 数据处理指令表第29页/共121页数据处理指令分类F 数据处理指令根据指令实现处理功能可分为以下六类: 数据传送指令; 算术运算指令; 逻辑运算指令; 比较指令; 测试指令; 乘法指令。第30页/共121页数据处理指令F ARM数据处理指令的基本原则为 :所有的操作数都是32位宽,或来自寄存器,或是在指令中

17、定义的立即数(符号或0扩展); 如果数据操作有结果,则结果为32位宽,放在一个寄存器中。(有一个例外:长乘指令产生64位的结果);ARM指令中使用“3地址模式”,即每一个操作数寄存器和结果寄存器在指令中分别指定。 第31页/共121页数据处理指令汇编格式FARM数据处理指令使用两个源操作数和一个目的寄存器(Rd)的“3地址模式”,一个源操作数(Rn)总是寄存器,第二个被称为“灵活的第二操作数operand2”,它可以是寄存器、移位后的寄存器或立即数。如果第二操作数是寄存器Rm,它的移位类型可以是LSL,LSR,ASL,ASR,ROR或RRX中的任意一种 ;移位的位数可以是立即数,也可以是寄存器

18、的内容。F汇编格式 S Rd, Rn, # S Rd, Rn, Rm, 第32页/共121页数据处理指令指令表数据处理指令的详细列表如下:操作码24:21助记符意义效果0000AND逻辑位与Rd = Rn AND Op20001EOR逻辑位异或Rd = Rn EOR Op20010SUB减Rd = Rn - Op20011RSB反向减Rd = Op2 Rn0100ADD加Rd = Rn + Op20101ADC带进位加Rd = Rn + Op2 + C0110SBC带进位减Rd = Rn - Op2 + C -10111RSC反向带进位减Rd = Op2 - Rn + C -11000TST测

19、试根据Rn AND Op2设置条件码1001TEQ测试相等根据Rn EOR Op2设置条件1010CMP比较根据Rn - Op2设置条件码1011CMN负数比较根据Rn + Op2设置条件码1100ORR逻辑位或Rd = Rn OR Op21101MOV传送Rd = Op21110BIC位清零Rd = Rn AND NOT Op21111MVN求反Rd = NOT Op2第33页/共121页算术运算指令:ADDADCSUBSBCRSBRSC第34页/共121页加法:Rd=Rn+Op2ADDR0, R1, R2ADDR0, R1, #256ADDR0, R2, R3, LSL #1ADDS R4

20、, R1, R2ADC指令在形式上和功能上都有与ADD类似,只是相加时还要包括进位标志C的内容:Rd=Rn+Op2+CADCR5, R1, R3第35页/共121页减法:Rd=Rn-Op2SUBR0, R1, R2SUBR0, R1, #256SUBR0, R1, R2, LSL #1SUBSR3, R6, R9带借位减:Rd=Rn-Op2+C-1SBCSR4, R7, R10SBCR5, R8, R11第36页/共121页反减:Rd=Op2-RnRSBR0, R1, R2RSBR0, R1, #256RSBR0, R2, R3, LSL #1反向带借位减: Rd=Op2-Rn+C-1RSCR

21、0, R1, R2第37页/共121页例:ADDR2, R1, R3SUBSR8, R6, #240RSBR4, R4, #0 x1280ADCHIR11, R0, R3RSCLESR0, R5, R0, LSL R4第38页/共121页逻辑运算指令:ANDORREORBIC: Rd=Rn AND NOT Op2第39页/共121页例:ANDR9, R2, #0 xFF00ORREQR2, R0, R5EORR0, R0, R3, ROR R6BICNESR0, R5, R0, LSL R4第40页/共121页数据传送指令:MOV:Rd=Op2MVN:Rd=NOT Op2MOVR9, R2MV

22、NNE R0, #0 xFF00MOVSR0, R0, ROR R6第41页/共121页比较指令:CMP:根据Rn-Op2设置条件码CMN:根据Rn+Op2设置条件码CMPGT R3, R7, LSL #2CMNR0, #0 x6400第42页/共121页测试指令:TST:根据Rn AND Op2设置条件码TEQ:根据Rn EOR Op2设置条件码TSTR0, #0 x3F8TEQEQR10, R9TSTNER1, R5, ASR R1第43页/共121页注:F RSB是反减,即用第二操作数减去源操作数。由于第二操作数可选的范围宽,所以这条指令很有用。F RSC是带进位标志的反减。若进位标志为

23、零,则结果减1。F BIC用于将源操作数的各位与第二操作数中相应位的反码进行“与”操作。BIC可用于将寄存器中某些位的值设置为0。 F MVN是“取反传送”,它是把第二操作数的每一位取反,将得到的值置入结果寄存器。 F CMN表示“取反比较”,将目的操作数和源操作数相加,根据结果更新条件码标志。 第44页/共121页数据处理指令二进制编码数据处理指令的二进制编码如下:第二操作数为立即数以寄存器表示移位位数以立即数表示移位位数第45页/共121页*乘法指令 ARM乘法指令完成两个寄存器中数据的乘法。按产生结果的位宽一般分为两类:一类是两个32位二进制数相乘的结果是64位,另一类是两个32位二进制

24、数相乘,仅保留最低有效32位。这两种类型都有“乘法累加”的变形,如下表所示: 操作码23:21助记符意义效果000MUL乘(32位结果)Rd(RmRs)31:0001MLA乘累加(32位结果)Rd(RmRs+Rn)31:0100UMULL无符号数长乘RdHi:RdLoRmRs101UMLAL无符号长乘累加RdHi:RdLo+=RmRs110SMULL有符号数长乘RdHi:RdLoRmRs111SMLAL有符号数长乘累加RdHi:RdLo+=RmRs第46页/共121页乘法指令二进制编码F 二进制编码 F 说明对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。对于64位乘

25、积结果指令,RdLo、RdHi为结果寄存器,“RdHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。 第47页/共121页乘法指令汇编格式F 产生最低有效3232位乘积的指令:MULS Rd, Rm, RsMULAS Rd, Rm, Rs, RnF 产生6464位乘积的指令: S RdHi, RdLo, Rm, Rs在此是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。 第48页/共121页、Load/StoreLoad/Store指令指令 F ARM处理器是Load/store型的,即它对数据的操作是

26、通过将数据从存储器加载到片内寄存器中进行处理,处理完成后的结果经过寄存器存回到存储器中,以加快对片外存储器进行数据处理的执行速度。F ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。F ARM指令集中有三种基本的数据存取指令: 单寄存器的存取指令(LDR,STR)多寄存器存取指令(LDM,STM)单寄存器交换指令(SWP) 第49页/共121页单寄存器的存取指令单寄存器的存取指令 单个寄存器存取指令又可以针对以下几类数据: 单字 无符号半字、有符号半字 无符号字节、有符号字节第50页/共121页 单字:单字: LDR从内存中取32位字数据放入寄存器,ST

27、R将寄存器中的32位字数据保存到内存中。第51页/共121页字节:字节: LDR从内存中取8位字节数据放入寄存器,STR将寄存器中的8位字节数据保存到内存中。无符号字节:用“0”将8位的操作数扩展到32位有符号字节:用符号位将8位的操作数扩展到32位第52页/共121页半字:半字: LDR从内存中取半字数据放入寄存器,STR将寄存器中的半字数据保存到内存中。无符号半字:用“0”将16位的操作数扩展到32位有符号半字:用符号位将16位的操作数扩展到32位第53页/共121页汇编格式汇编格式这一类数据传送指令的汇编格式如下 前变址格式LDR|STR B|SB|H|SH RdLDR|STR B|SB

28、|H|SH Rd, RnRn, ! 后变址格式LDR|STR B|SB|H|SH T RdLDR|STR B|SB|H|SH T Rd, RnRn, 相对PC的形式LDR|STR B RdLDR|STR B Rd, LABEL LABEL 式中是#或#Rm;第54页/共121页例:LDRR8, R10LDRNER1, R5, #0 x960!STRR2, R9, #4STRBR0,R3, -R8, ASR #2LDRR1, localdataLDRR0, R1, R2, LSL #2LDRBR0, R2, #3LDRR1, R0, -R2, LSL #2STRR0, R7, #-8第55页/共

29、121页例:LDREQSHR11, R6LDRHR1, R0,#20STRHR4,R3,R2!LDRSBR0, constfLDRHR6, R2, #2LDRSHR1, R9STRHR0, R1,R2, LSL #2STRNEHR0, R2, #960!第56页/共121页例如第57页/共121页二进制编码格式二进制编码格式这一类数据传送格式的二进制编码如下:第58页/共121页多寄存器存取指令多寄存器存取指令多寄存器传送指令可以用一条指令将16个可见寄存器(R0-R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址

30、模式更加有限。第59页/共121页汇编格式汇编格式多寄存器存取指令的汇编格式如下: LDM/STM Rn!LDM/STM Rn!, LDMDBR1!,R0, R2, R5STMIAR1!, R3-R6, R11, R12LDMIAR10!, R0-R7, LR第60页/共121页多寄存器传送寻址模式r5r1r9r0r9STMIA r9!, r0,r1,r5100016100c16101816r1r5r9STMDA r9!, r0,r1,r5r0r9100016100c16101816r5r9STMDB r9!, r0,r1,r5r1r0r9100016100c16101816r5r1r0r9r

31、9STMIB r9!, r0,r1,r5100016100c16101816第61页/共121页 块拷贝 数据被存贮在基本寄存器的上面地址或下面地址 地址增加或减少是在存贮第一个值之前或之后开始的Note: 寄存器的部分或全部都可以用单指令传送Note: 在表中的寄存器顺序并不重要Note: 在表中包括 r15 i将造成控制流的改变多寄存器多寄存器数数据据传传送送 Increment After第62页/共121页习题假设R0中内容为0 x8000,R1和R2中内容分别为0 x01和0 x10,存储器内容为空,执行下述指令后,寄存器和存储器内容如何变化?STMIBR0!,R1, R2LDMIA

32、R0!,R1, R2第63页/共121页单寄存器交换指令(单寄存器交换指令(SWPSWP) 交换指令把字或无符号字节的读取和存入组合在一条指令中。通常都把这两种传送结合成为一个不能被外部存储器的访问(例如来自DMA控制器的访问)分隔开的基本的存储器操作,因此本指令一般用于处理器之间或处理器与DMA控制器之间共享的信号量、数据结构进行互斥的访问。 第64页/共121页二进制编码及汇编格式二进制编码及汇编格式F其二进制编码格式如下:F其汇编格式如下:SWP B RdSWP B Rd,RmRm,RnRn 第65页/共121页SWPB R1, R1, R0SWPR1, R2, R3第66页/共121页

33、3 3、转移指令、转移指令F 跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: 使用专门的跳转指令。 直接向程序计数器PC写入跳转地址值。F ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转,根据完成的功能它可以分为以下4种 : B 转移指令 BL 带链接的转移指令 BX 带状态切换的转移指令 BLX 带链接和状态切换的转移指令 第67页/共121页转移和转移链接指令(转移和转移链接指令(B B,BLBL) 转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。BL是转移链接指令,它完全象转移指令一样地执行转移,但同时把转移后面紧

34、接的一条指令的地址保存到链接寄存器LR(r14)。 第68页/共121页二进制编码及汇编格式二进制编码及汇编格式 二进制编码如下: 汇编格式如下: BLBL 第69页/共121页无条件转移:BMOVR0,#10LOOPSUBSR0, #1BNELOOP第70页/共121页转移连接指令:BLCMPR0 , #5BLLTSUB1BLGESUB2SUB1MOVPC, R14注:只有SUB1不改变条件码,本例才能正常工作第71页/共121页当存在多级嵌套子程序时:BLSUB1SUB1STMFD R13!, R0-R2, R14BLSUB2SUB2第72页/共121页转移交换和转移链接交换(转移交换和转

35、移链接交换(BXBX,BLXBLX) 这些指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。 第73页/共121页二进制编码二进制编码F二进制编码如下:二进制编码如下:F说明:说明:在第一种格式中,寄存器Rm的值是转移目标,Rm的第0位拷贝到CPSR中的T位(它决定了是切换到Thumb指令还是继续执行ARM指令),31:1位移入PC;如果Rm0是1,处理器切换执行Thumb指令,并在Rm中的地址处开始执行,但需将最低位清零,使之以半字的边界定位;如果Rm0是0,处理器继续

36、执行ARM指令,并在Rm中的地址处开始执行,但需将Rm1清零,使之以字的边界定位。第74页/共121页汇编格式 汇编格式如下: 1: BLX Rm 2: BLX “ ”一般是汇编代码中的一个标号,表示目标地址; 第75页/共121页伪操作、宏指令及伪指令伪操作是ARM汇编语言程序里的一些特殊指令助记符,主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。宏指令是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。伪指令也是ARM汇编语言程序里的特殊指令助记

37、符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。 第76页/共121页ARM汇编语言的伪操作1、常量编译控制:.byte.hword/.short.word/.long/.int2、字符编译控制:.equ/.set.global.extern3、汇编程序代码控制:.text.data第77页/共121页ARM汇编语言的伪指令 伪指令语法格式作 用ADRADR cond register,expr将基于PC或基于寄存器的地址值读取到寄存器中。小范围的地址读取。ADRLADRL cond register,expr将基于PC或基于

38、寄存器的地址值读取到寄存器中。中等范围的地址读取。LDRLDR cond register,=expr | label-expr将一个32位的立即数或者一个地址值读取到寄存器中。大范围的地址读取。NOPNOP在汇编时将被替换成ARM中的空操作。ARM中伪指令不是真正的ARM指令或Thumb指令,它们在编译器对源程序进行汇编处理时被替换成相应的ARM或Thumb指令序列。第78页/共121页equ x,88equ y,76equ z,96equ stack_top,0 x1000global_starttextstart:movr0,#0 xABloop:movr0,r0,ASR#1movr1,

39、#yaddr2,r0,r1,LSL#1movsp,#0 x1000strr2,spmovr0,#zandr0,r0,#0 xffmovr1,#y addr2,r0,r1,LSR#1ldrr0,sp程序实例movr1,#0 x01orrr0,r0,r1movr1,r2addr2,r0,r1,LSR#1stop:bstopend第79页/共121页五、ARM系统初始化过程简介包括: 中断向量表 初始化存储器系统 初始化堆栈 初始化有特殊要求的端口、设备 初始化应用程序执行环境 改变处理器模式 CALL 主应用程序第80页/共121页启动代码是用来初始化电路以及用来为高级语言写的软件做好运行前准备的

40、一小段汇编语言,是任何处理器上电复位时的程序运行入口点n 功能电路初始化为高级语言编写的软件运行做准备n 特征汇编语言程序复位运行入口点第81页/共121页5.1、中断向量表FIQ0 x1C外部快速中断IRQ0 x18一般外部中断(Reserved)0 x14保留Data Abort0 x10数据异常Frefetch Abort0 x0C预取指异常Software int0 x08软件中断Undef0 x04未定义指令中断Reset0 x00复位中断第82页/共121页初始化中断向量表 ENTRY: b ResetHandler /* for debug */ b HandlerUndef /

41、* handlerUndef */ b HandlerSWI /* SWI interrupt handler*/ b HandlerPabort /* handlerPAbort */ b HandlerDabort /* handlerDAbort */ b . /* handlerReserved */ b HandlerIRQ b HandlerFIQ 其中关键字其中关键字ENTRYENTRY是指定编译器保留这段代码,因为编译器可是指定编译器保留这段代码,因为编译器可能会认为这是一段亢余代码而加以优化。链接的时候要确保这段能会认为这是一段亢余代码而加以优化。链接的时候要确保这段代码被链

42、接在代码被链接在0 0地址处,并且作为整个程序的入口。地址处,并且作为整个程序的入口。第83页/共121页2、初始化存储器系统存储器的类型和时序配置存储器的地址分布第84页/共121页初始化看门狗、时钟 #* #*START * #* ResetHandler: ldr r0,=WTCON /* watch dog disable*/ ldr r1,=0 x0 str r1,r0 ldr r0,=INTMSK ldr r1,=0 x07ffffff /* all interrupt disable */ str r1,r0 #* #*Set clock control registers* #

43、* ldrr0,=LOCKTIME ldrr1,=0 xfff strr1,r0第85页/共121页初始化存储器系统 ldr r0,=CLKCON ldr r1,=0 x7ff8 /* All unit block CLK enable */ str r1,r0 #* #* change BDMACON reset value for BDMA * #* ldr r0,=BDIDES0 ldr r1,=0 x40000000 /* BDIDESn reset value should be 0 x40000000 */ str r1,r0 ldr r0,=BDIDES1 ldr r1,=0 x

44、40000000 /* BDIDESn reset value should be 0 x40000000 */ str r1,r0第86页/共121页 #* #*Set memory control registers* #* ldr r0,=SMRDATA ldmia r0,r1-r13 ldr r0,=0 x01c80000 /* BWSCON Address */ stmia r0,r1-r13 #;* #;*Initialize stacks* #;* ldr sp, =SVCStack bl InitStacks #;* #;*Setup IRQ handler* #;* ldr

45、r0,=HandleIRQ ldr r1,=IsrIRQ str r1,r0第87页/共121页3、初始化堆栈ARM有7种执行状态(工作模式),每一种状态堆栈指针寄存器(SP)都是独立的;对每一种模式都要定义SP寄存器的堆栈地址;第88页/共121页初始化堆栈 #;* #;*The function for initializing stack* #;* InitStacks: mrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE msr cpsr_cxsf,r1/* UndefMode */ ldr sp,=UndefStack orr r

46、1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 /* AbortMode */ ldr sp,=AbortStack orr r1,r0,#IRQMODE|FIQ_MODE msr cpsr_cxsf,r1 /* IRQMode */ ldr sp,=IRQStack orr r1,r0,#FIQMODE|IRQ_MODE msr cpsr_cxsf,r1 /* FIQMode */ ldr sp,=FIQStack bic r0,r0,#MODEMASK orr r1,r0,#SVCMODE msr cpsr_cxsf,r1 /* SVCMode */ ldr

47、sp,=SVCStack#USER mode is not initialized. mov pc,lr /* The LR register may be not valid for the mode changes. */第89页/共121页4、初始化有特殊要求的端口、设备如驱动指示系统运行状态的一些简单的输出设备,如LED,蜂鸣器等一般外设初始化可以系统初始化之后进行第90页/共121页ROM地址的重映射(remap)0 x0200(boot code)0 x0100(Reset_handler)B Reset_Handler0 x0000Flash(remap)0 x0204(boot

48、 code)0 x0200(Reset_handler)B Reset_Handler0 x0000RAM第91页/共121页5、初始化应用程序执行环境完成必要的从ROM到RAM的数据传输第92页/共121页6、改变处理器模式管理员模式多种特权模式用户运行模式复位后缺省模式堆栈初始化阶段用户选择第93页/共121页7、呼叫主应用程序系统初始化工作完成后,程序流程转入主应用程序执行可以直接从启动代码跳到应用程序的主函数入口第94页/共121页初始化应用程序执行环境 #* #* Copy and paste RW data/zero initialized data * #* LDR r0, =I

49、mage_RO_Limit /* Get pointer to ROM data */ LDR r1, =Image_RW_Base /* and RAM copy*/ LDR r3, =Image_ZI_Base/* Zero init base = top of initialised data */ CMP r0, r1 /* Check that they are different */ BEQ F1 F0: CMP r1, r3/* Copy init data */ LDRCC r2, r0, #4 /* - LDRCC r2, r0 + ADD r0, r0, #4 */ ST

50、RCC r2, r1, #4 /* - STRCC r2, r1 + ADD r1, r1, #4 */ BCC F0 F1: LDR r1, =Image_ZI_Limit/* Top of zero init segment */ MOV r2, #0 F2: CMP r3, r1 /* Zero init */ STRCC r2, r3, #4 BCC F2MRSr0, CPSRBICr0, r0, #NOINT /* enable interrupt */MSRCPSR_cxsf, r0/* jump to main() */ BLMain B .第95页/共121页测验2 写一条AR

51、M指令,分别完成下列操作a)r0=16 c)r1=r2*3b)r0=r1/16(带符号的数字) d)r0=-r0 下面哪些立即数是数据处理指令中有效的数据a)0 x00AB0000 b)0 x0000FFFFc)0 xF000000Fd)0 x08000012 e)0 x00001f80f)0 xFFFFFFFF BIC指令做什么用? ARM指令的寻址方式有几种?分别举例说明 ARM指令系统中对字节、半字、字的存取是如何实现的?第96页/共121页第97页/共121页主要内容(一)、开发环境(二)、开发流程(三)、工程的建立与配置(四)、编写软件源文件(五)、软件工程的编译链接(六)、软件调试(七)、可执行文

温馨提示

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

评论

0/150

提交评论