收藏 分享(赏)

3--ARM嵌入式系统原理及应用教程.ppt

上传人:saw518 文档编号:4218285 上传时间:2018-12-16 格式:PPT 页数:140 大小:1.16MB
下载 相关 举报
3--ARM嵌入式系统原理及应用教程.ppt_第1页
第1页 / 共140页
3--ARM嵌入式系统原理及应用教程.ppt_第2页
第2页 / 共140页
3--ARM嵌入式系统原理及应用教程.ppt_第3页
第3页 / 共140页
3--ARM嵌入式系统原理及应用教程.ppt_第4页
第4页 / 共140页
3--ARM嵌入式系统原理及应用教程.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

1、主讲内容,第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础 第5章 嵌入式内部可编程模块 第6章 嵌入式接口技术应用 第7章 软件开发环境,第3章 ARM9指令系统,ARM处理器的寻址方式 ARM指令集 Thumb指令集,3.1 ARM处理器的寻址方式,寻址方式是处理器根据指令中给出的地址信息来寻找物理地址的方式。 目前ARM指令系统支持8种寻址方式。 寄存器寻址 立即寻址 寄存器间接寻址 变址寻址 寄存器移位寻址 多寄存器寻址 堆栈寻址 相对寻址,3.1.1 寄存器寻址,寄存器寻址就是利用寄存器中的内容作为操作数,寄存器本身就

2、是操作数地址。这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。例如指令: MOV R2, R3 ;R2R3 R3中的内容赋给R2 ADD R2,R3,R4 ;R2R3R4 R3和R4中的内容相加,结果赋给R2,MOV R2,R3,0xAA,3.1.2 立即寻址,立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。 例如指令: MOV R0,#0xFF000 ;将立即数0xFF000装入R0寄存器 ADD R1,R1,0x7f

3、 ; R1R10x7f在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“0x”。,MOV R0,#0xFF00,0xFF00,从代码中获得数据,3.1.3 寄存器间接寻址,寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如指令 : LDR R1,R2 ;R1R2STR R1,R2 ;R2R1第一条指令将以R2中的内容为地址,将该地址中的数据传送到R1中。第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。,LDR R1,R2,0xAA,3.1.4 变址寻址,变址寻址就是将寄存器(该寄存器一般

4、称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。例如指令: LDR R0,R1,8 ;R0R18 LDR R0,R1,8! ;R0R18,R1R18 LDR R0,R1,2 ;R0R1,R1R12 LDR R0,R1,R2 ;R0R1R2,LDR R0,R1,#0x08,0xAA,将R1+0x08作为地址装载数据,3.1.5 寄存器移位寻址,寄存器移位寻址是ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。 ARM微

5、处理器内嵌的桶型移位器(Barrel Shifter),移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第2个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型.,3.1.5 寄存器移位寻址,LSL(或ASL)操作格式为:通用寄存器,LSL(或ASL) 操作数 LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充,最后一个左移出的位放在状态寄存器的C位CPSR29中,如图3-1所示。其中,操作数可以是通用寄存器,

6、也可以是立即数(031)。,3.1.5 寄存器移位寻址,操作示例:MOV R0, R1, LSL#2 ;将R1中的内容左移4位后传送到R0中, ;其中把最后移出的位赋给程序状态寄存器的C位CPSR29。,LSR操作 格式为:通用寄存器,LSR 操作数 LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充,最后一个右移出的位放在状态寄存器的C位CPSR29中,如图3-2所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。,3.1.5 寄存器移位寻址,操作示例:MOV R0, R1, LSR#4 ;将R1中的内容右移4位后传送到R0中。 ;其中把最

7、后移出的位赋给程序状态寄存器的C位CPSR29。,3.1.5 寄存器移位寻址,3.1.5 寄存器移位寻址,ROR操作 格式为:通用寄存器,ROR 操作数 ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,右端移出的位填充在左侧的空位处,最后一个右移出的位同时也放在状态寄存器的C位CPSR29中,如图3-3所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。,操作示例: MOV R0, R1, ROR#4 ;将R1中的内容循环右移4位后传送到R0中, ;其中把最后移出的位赋给程序状态寄存器的C位CPSR29。,3.1.5 寄存器移位寻址,ASR操作

8、格式为:通用寄存器,ASR 操作数 ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,最左端的位保持不变,最后一个右移出的位放在状态寄存器的C位CPSR29 ,如图3-4所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。这种移位对有符号数据使用时可以保持符号位不变。,3.1.5 寄存器移位寻址,3.1.5 寄存器移位寻址,操作示例: MOV R0, R1, ASR#4 ;将R1中的内容右移4位后传送到R0中,符号位保持不变。 ;最后移出的位同时也送入状态位C中。,RRX操作 RRX操作的格式为:通用寄存器,RRX 操作数 RRX可完成对通用寄存器中的内容

9、进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左侧空位由状态寄存器C位来填充,右侧移出的位移进状态位C中,如图3-5所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。,3.1.5 寄存器移位寻址,操作示例:MOV R0, R1, RRX#2 ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。,3.1.5 寄存器移位寻址,采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以一次对多个寄存器寻址,多个寄存器由小到大排列,最多可传送16个寄存器。例如:LDMIA R1!,R2-R4,R5 ;R2R1;R3R14;R4R18;R5R112该指令的

10、后缀IA表示在每次执行完加载/存储操作后,R1按字长度增加,因此,指令可将连续存储单元的值传送到R2R5。,3.1.6 多寄存器寻址,使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“”连接;否则用“,”分隔书写。,LDMIA R1!,R2-R4,R5,0x40000010,3.1.7 堆栈寻址,堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack);而当堆栈指针指向下一个将要放入数

11、据的空位置时,称为空堆栈(Empty Stack)。 同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。,0x12345678,3.1.7 堆栈寻址,ARM微处理器支持这四种类型的堆栈工作方式,即: 满递增方式FA(Full Ascending):堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。 满递减方式FD(Full Decending):堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。 空递增方式EA(Empty

12、 Ascending):堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。 空递减方式ED(Empty Decending):堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。,3.1.8 相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BL NEXT;跳转到子程序NEXT处执行 NEXT MOV PC,LR;从子程序返回,3.2 ARM指令集,ARM微处理器的指令集是加载/存储型的. 即指令集仅能处理寄存器中的数据

13、,处理结果仍要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM9指令集,包括 ARM指令集 Thumb指令集。 首先介绍ARM指令的基本格式及灵活的操作数,然后介绍条件码,再把ARM指令集、Thumb指令集按类分别说明。,ARM指令的基本格式如下:, S ,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符; cond:执行条件; S:是否影响CPSR寄存器的值; Rd:目标寄存器;Rn:第1个操作数的寄存器; op2:第2个操作数;,3.2.1 指令格式,ARM指令的基本格式如下:,3.2 指令集介绍,ARM指令集第2个操作数,

14、灵活的使用第2个操作数“op2”能够提高代码效率。它有如下的形式: #immed_8r常数表达式; Rm寄存器方式; Rm,shift寄存器移位方式;, S ,3.2 指令集介绍,ARM指令集第2个操作数,#immed_8r常数表达式该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。,循环右移10位,移位前的8位常数0x12,移位后得到的常数0x04800000,3.2 指令集介绍,ARM指令集第2个操作数,#immed_8r常数表达式该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。,例如: MOV R0,#1 AND R1,R2,#0

15、x0F MOV R1,#0xC000 ;0xC000可由0x03循环右移16位得到,2.请列举2个8位图立即数?,思考与练习,?,1.以下8位图立即数是否合法? 0x0103C0000x12800000,0x4000003B(0xED循环右移2位) 0x0016C000(0x5B循环右移18位),3.2 指令集介绍,ARM指令集第2个操作数,Rm寄存器方式在寄存器方式下,操作数即为寄存器的数值。 例如: SUB R1,R1,R2 MOV PC,R0,3.2.2 条件码,当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令

16、被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。 在16种条件标志码中,只有15种可以使用。,3.2.2 条件码,C代码: if(a b)a+; elseb+;,对应的汇编代码: CMP R0,R1 ;R0与R1比较 ADDHI R0,R0,#1 ;若R0R1,则R0=R0+1 ADDLS R1,R1,#1 ;若R0R1,则R1=R1+1,示例:,3.2.2

17、 条件码,3.2.3 ARM 存储器访问指令,ARM微处理器内部没有RAM,而ARM除了寄存器(即R0R15)外没有别的存储单元;在以ARM为核的嵌入式系统中,所有的外围模块都和存储单元一样,是ARM微处理器的不同的地址单元。不管这些模块的功能如何(如输入/输出、定时器、存储器等),也不管这些模块的位置如何(如片内或片外),ARM微处理器都把它们看作是外部存储器。其操作过程和对存储器的操作是相同的。,3.2.3 ARM 存储器访问指令,因此,在ARM微处理器的数据传送中,数据的源和数据的目标只有两种:一种是ARM的寄存器R0R15;另一种就是外部存储器(它们可能是外围模块的寄存器、外部数据存储

18、器或可访问的程序存储器等)。 我们把数据从存储器到寄存器的传送叫加载,数据从寄存器到存储器的传送叫存储。,3.2.3 ARM 存储器访问指令,3.2.3 ARM 存储器访问指令,加载/存储指令可分为3类: 单一数据加载/存储指令 批量数据加载/存储指令 数据交换指令,3.2.3 ARM 存储器访问指令,1单一数据加载/存储指令 (1)LDR指令格式为:LDR条件 目的寄存器,LDR指令是字加载指令,用于从存储器中将一个32位的字数据传送到目的寄存器中。,3.2.3 ARM 存储器访问指令,指令示例: LDR R3,R4 ;将存储器地址为R4的字数据读入寄存器R3。 LDR R3,R1,R2 ;

19、将存储器地址为R1+R2的字数据读入寄存器R3。 LDR R3,R1,8 ;将存储器地址为R1+8的字数据读入寄存器R3。 LDR R3,R1,R2! ;将存储器地址为R1+R2的字数据读入寄存器R3,并将新地址R1R2写入R1。 LDR R3,R1,8 ! ;将存储器地址为R1+8的字数据读入寄存器R3,并将新地址R18写入R1。,应用示例: LDR R3,R4;将R4指向地址的字数据存入R3,0x12345678,3.2.3 ARM 存储器访问指令,3.2.3 ARM 存储器访问指令,LDR R3,R1,R2 ;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1R2写入R1。 LDR

20、 R3,R1,R2,LSL3! ;将存储器地址为R1R28的字数据读入寄存器R3,并将新地址R1R28写入R1。 LDR R3,R1,R2,LSL3 ;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1R28写入R1。 注:R15不可以作为偏移寄存器使用。,3.2.3 ARM 存储器访问指令,(2)LDRB指令格式为:LDR条件B 目的寄存器,LDRB指令是字节加载指令,用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。,3.2.3 ARM 存储器访问指令,指令示例: LDRB R

21、3,R1 ;将存储器地址为R1的字节数据读入寄存器R0,并 将R3的高24位清零。 LDRB R3,R1,8 ;将存储器地址为R18的字节数据读入寄存器R3, 并将R3的高24位清零。,3.2.3 ARM 存储器访问指令,(3)LDRH指令格式为:LDR条件H 目的寄存器,LDRH指令是无符号半字加载指令,用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。,3.2.3 ARM 存储器访问指令,指令示例: LDRH R3,R1 ;将存储器地址为R1的半字数据读入寄存器R3,并将R3的高

22、16位清零。 LDRH R3,R1,8 ;将存储器地址为R18的半字数据读入寄存器R3,并 将R3的高16位清零。 LDRH R3,R1,R2 ;将存储器地址为R1R2的半字数据读入寄存器R3, 并将R3的高16位清零。,3.2.3 ARM 存储器访问指令,(4)STR指令格式为:STR条件 源寄存器, STR指令是字存储指令,用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。,3.2.3 ARM 存储器访问指令,指令示例:STR R3,R1,8 ;将R3中的字数据写入以R1为地址的存储器中,并将新地址R18写入R1。

23、STR R3,R1,8 ;将R3中的字数据写入以R18为地址的存储器中。,3.2.3 ARM 存储器访问指令,(5)STRB指令格式为:STR条件B 源寄存器,STRB指令是无符号字节存储指令,用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。,3.2.3 ARM 存储器访问指令,指令示例: STRB R3,R1;将寄存器R3中的字节数据写入以R1为地址的存储器中。 STRB R3,R1,8 ;将寄存器R3中的字节数据写入以R18为地址的存储器中。,3.2.3 ARM 存储器访问指令,(6)STRH指令 格式为:STR条件H 源寄存器,STRH指令是无符号半字

24、存储指令,用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。,3.2.3 ARM 存储器访问指令,指令示例: STRH R3,R1 ;将寄存器R3中的半字数据写入以R1为地址的存储器中。 STRH R3,R1,8 ;将寄存器R3中的半字数据写入以R18为地址的存储器中。,3.2.3 ARM 存储器访问指令,2批量数据加载/存储指令ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。,3.2.3 ARM 存储器访问指令,

25、常用的加载存储指令如下: LDM(或STM)指令 格式为: LDM(或STM)条件类型 基址寄存器!,寄存器列表LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,类型为以下几种情况:,3.2.3 ARM 存储器访问指令,IA 每次传送后地址加1,递增方式; IB 每次传送前地址加1,递增方式; DA 每次传送后地址减1,递减方式; DB 每次传送前地址减1,递减方式; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈;,3.2.3 ARM 存储器访问指令,!

26、为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。 基址寄存器不允许为R15。 寄存器列表可以为R0R15的任意组合,若使用连续的寄存器时,可以使用“-”表示省略。 为可选后缀,这是一个只是在数据块传送中使用的后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。,3.2.3 ARM 存储器访问指令,指令示例: STMFD R13!,R0,R4-R12,LR ;将寄存器列表中的寄存器(R0,R4到R12

27、,LR)存入堆栈。 LDMFD R13!,R0,R4-R12,PC ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。 在通用存储区,数据存储的方式和堆栈区相近。下面通过存储R1、R2和R3 3个寄存器的4种后缀指令执行前后的存储情况如图3-7所示。,3.2.3 ARM 存储器访问指令,3交换指令 (1)SWP指令 格式为:SWP条件 目的寄存器,源寄存器1,源寄存器2SWP指令是数据字交换指令,用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内

28、容。,3.2.3 ARM 存储器访问指令,指令示例: SWP R1,R2,R3 ;将R3所指向的存储器中的字数据传送到R1,同时 ;将R2中的字数据传送到R3所指向的存储单元。 SWPEQ R1,R1,R2 ;Z=1时,完成将R2所指向的存储器中的字数据与 ;R1中的字数据交换。,3.2.3 ARM 存储器访问指令,3.2.3 ARM 存储器访问指令,(2)SWPB指令 格式为: SWP条件B 目的寄存器,源寄存器1,源寄存器2SWPB指令是字节交换指令,用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24清零,同时将源寄存器1中的字节数据传送到源寄存器2所指向的存

29、储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。,3.2.3 ARM 存储器访问指令,指令示例: SWPB R1,R2,R3 ;将R3所指向的存储器中的字节数据传送到R1,R1的高24位清零,同时将R2中的低8位数据传送到R3所指向的存储单元。 SWPB R1,R1,R2 ;该指令完成将R2所指向的存储器中的字节数据与R1中的低8位数据交换。,3.2.4 ARM 数据处理类指令,数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。 数据处理指令可分为3大类: 数据传送指令

30、 算术逻辑运算指令 比较指令,3.2.4 ARM 数据处理类指令,数据传送指令用于在寄存器和存储器之间进行数据的双向传输。 算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。 比较指令是完成对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,不保存运算结果,只影响CPSR中相应的条件标志位。,数据传送指令,1.数据传送指令MOV和MVN (1)MOV指令格式为:MOV条件S 目的寄存器,源操作数MOV指令可完成在寄存器之间或寄存器与第2操作数之间进行数据传送。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报