嵌入式系统原理及应用教程.ppt
《嵌入式系统原理及应用教程.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统原理及应用教程.ppt(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中的内容赋给R2ADD R2,R3,R4;R2R3R4 R3和R4中的内容相加,结果赋给R2,MOV R2,R3,0 xAA,3.1.2 立即寻址,立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如指令:MOVR0,#0 xFF000;将立即数0 xFF000装入R0寄存器 ADD R1,R1,0 x7f;R1R10 x7f 在以上两条指令中,
3、第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“0 x”。,MOV R0,#0 xFF00,0 xFF00,从代码中获得数据,3.1.3 寄存器间接寻址,寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如指令:LDRR1,R2;R1R2 STRR1,R2;R2R1 第一条指令将以R2中的内容为地址,将该地址中的数据传送到R1中。第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。,LDR R1,R2,0 xAA,3.1.4 变址寻址,变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址
4、偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。例如指令:LDR R0,R1,8;R0R18LDR R0,R1,8!;R0R18,R1R18LDR R0,R1,2;R0R1,R1R12LDR R0,R1,R2;R0R1R2,LDR R0,R1,#0 x08,0 xAA,将R1+0 x08作为地址装载数据,3.1.5 寄存器移位寻址,寄存器移位寻址是ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。ARM微处理器内嵌的桶型移位器(Barrel Shifter
5、),移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第2个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型.,3.1.5 寄存器移位寻址,LSL(或ASL)操作 格式为:通用寄存器,LSL(或ASL)操作数 LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充,最后一个左移出的位放在状态寄存器的C位CPSR29中,如图3-1所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。,3.1.5 寄存器移位寻
6、址,操作示例: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中。;其中把最后移出的位赋给程序状态寄存器的C位CPSR29。,3.1.5 寄存器移
7、位寻址,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操作格式为:通用寄存器,ASR 操作数 ASR可完成对通用寄存器中的内容进行右移的操作,
8、按操作数所指定的数量向右移位,最左端的位保持不变,最后一个右移出的位放在状态寄存器的C位CPSR29,如图3-4所示。其中,操作数可以是通用寄存器,也可以是立即数(031)。这种移位对有符号数据使用时可以保持符号位不变。,3.1.5 寄存器移位寻址,3.1.5 寄存器移位寻址,操作示例:MOV R0,R1,ASR#4;将R1中的内容右移4位后传送到R0中,符号位保持不变。;最后移出的位同时也送入状态位C中。,RRX操作RRX操作的格式为:通用寄存器,RRX 操作数 RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左侧空位由状态寄存器C位来填充,右侧
9、移出的位移进状态位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 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字长度增加,因此,指令可将连续存储单元的值传送到R2R5
10、。,3.1.6 多寄存器寻址,使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“”连接;否则用“,”分隔书写。,LDMIA R1!,R2-R4,R5,0 x40000010,3.1.7 堆栈寻址,堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack);而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。同时,根据堆栈的生成方式,又可以分为递增堆栈(Asc
11、ending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。,0 x12345678,3.1.7 堆栈寻址,ARM微处理器支持这四种类型的堆栈工作方式,即:满递增方式FA(Full Ascending):堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。满递减方式FD(Full Decending):堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。空递增方式EA(Empty Ascending):堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。空递减方式ED(Empty
12、 Decending):堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。,3.1.8 相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BL NEXT;跳转到子程序NEXT处执行 NEXT MOVPC,LR;从子程序返回,3.2 ARM指令集,ARM微处理器的指令集是加载/存储型的.即指令集仅能处理寄存器中的数据,处理结果仍要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。ARM9指令集,包括ARM指令
13、集Thumb指令集。首先介绍ARM指令的基本格式及灵活的操作数,然后介绍条件码,再把ARM指令集、Thumb指令集按类分别说明。,ARM指令的基本格式如下:,S,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;op2:第2个操作数;,3.2.1 指令格式,ARM指令的基本格式如下:,3.2 指令集介绍,ARM指令集第2个操作数,灵活的使用第2个操作数“op2”能够提高代码效率。它有如下的形式:#immed_8r常数表达式;Rm寄存器方式;Rm,shift寄存器移
14、位方式;,S,3.2 指令集介绍,ARM指令集第2个操作数,#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。,循环右移10位,移位前的8位常数0 x12,移位后得到的常数0 x04800000,3.2 指令集介绍,ARM指令集第2个操作数,#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。,例如:MOVR0,#1ANDR1,R2,#0 x0FMOVR1,#0 xC000;0 xC000可由0 x03循环右移16位得到,2.请列举2个8位图立即数?,思考与练习,?,1.以下8位图
15、立即数是否合法?0 x0103C0000 x12800000,0 x4000003B(0 xED循环右移2位)0 x0016C000(0 x5B循环右移18位),3.2 指令集介绍,ARM指令集第2个操作数,Rm寄存器方式 在寄存器方式下,操作数即为寄存器的数值。例如:SUBR1,R1,R2MOVPC,R0,3.2.2 条件码,当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符
16、可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。在16种条件标志码中,只有15种可以使用。,3.2.2 条件码,C代码:if(a b)a+;else b+;,对应的汇编代码:CMPR0,R1;R0与R1比较ADDHI R0,R0,#1;若R0R1,则R0=R0+1ADDLS R1,R1,#1;若R0R1,则R1=R1+1,示例:,3.2.2 条件码,3.2.3 ARM 存储器访问指令,ARM微处理器内部没有RAM,而ARM除了寄存器(即R0R15)外没有别的存储单元;在以ARM为核的嵌入式系统中,所有
17、的外围模块都和存储单元一样,是ARM微处理器的不同的地址单元。不管这些模块的功能如何(如输入/输出、定时器、存储器等),也不管这些模块的位置如何(如片内或片外),ARM微处理器都把它们看作是外部存储器。其操作过程和对存储器的操作是相同的。,3.2.3 ARM 存储器访问指令,因此,在ARM微处理器的数据传送中,数据的源和数据的目标只有两种:一种是ARM的寄存器R0R15;另一种就是外部存储器(它们可能是外围模块的寄存器、外部数据存储器或可访问的程序存储器等)。我们把数据从存储器到寄存器的传送叫加载,数据从寄存器到存储器的传送叫存储。,3.2.3 ARM 存储器访问指令,3.2.3 ARM 存储
18、器访问指令,加载/存储指令可分为3类:单一数据加载/存储指令批量数据加载/存储指令数据交换指令,3.2.3 ARM 存储器访问指令,1单一数据加载/存储指令(1)LDR指令格式为:LDR条件 目的寄存器,LDR指令是字加载指令,用于从存储器中将一个32位的字数据传送到目的寄存器中。,3.2.3 ARM 存储器访问指令,指令示例:LDR R3,R4;将存储器地址为R4的字数据读入寄存器R3。LDR R3,R1,R2;将存储器地址为R1+R2的字数据读入寄存器R3。LDR R3,R1,8;将存储器地址为R1+8的字数据读入寄存器R3。LDR R3,R1,R2!;将存储器地址为R1+R2的字数据读入
19、寄存器R3,并将新地址R1R2写入R1。LDR R3,R1,8!;将存储器地址为R1+8的字数据读入寄存器R3,并将新地址R18写入R1。,应用示例:LDRR3,R4;将R4指向地址的字数据存入R3,0 x12345678,3.2.3 ARM 存储器访问指令,3.2.3 ARM 存储器访问指令,LDR R3,R1,R2;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1R2写入R1。LDR R3,R1,R2,LSL3!;将存储器地址为R1R28的字数据读入寄存器R3,并将新地址R1R28写入R1。LDR R3,R1,R2,LSL3;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1
20、R28写入R1。注:R15不可以作为偏移寄存器使用。,3.2.3 ARM 存储器访问指令,(2)LDRB指令 格式为:LDR条件B 目的寄存器,LDRB指令是字节加载指令,用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。,3.2.3 ARM 存储器访问指令,指令示例:LDRB R3,R1;将存储器地址为R1的字节数据读入寄存器R0,并将R3的高24位清零。LDRB R3,R1,8;将存储器地址为R18的字节数据读入寄存器R3,并将R3的高24位清零。,3.2.3 ARM 存储器访问指令
21、,(3)LDRH指令格式为:LDR条件H 目的寄存器,LDRH指令是无符号半字加载指令,用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。,3.2.3 ARM 存储器访问指令,指令示例:LDRH R3,R1;将存储器地址为R1的半字数据读入寄存器R3,并将R3的高16位清零。LDRH R3,R1,8;将存储器地址为R18的半字数据读入寄存器R3,并将R3的高16位清零。LDRH R3,R1,R2;将存储器地址为R1R2的半字数据读入寄存器R3,并将R3的高16位清零。,3.2.3 A
22、RM 存储器访问指令,(4)STR指令格式为:STR条件 源寄存器,STR指令是字存储指令,用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。,3.2.3 ARM 存储器访问指令,指令示例:STRR3,R1,8;将R3中的字数据写入以R1为地址的存储器中,并将新地址R18写入R1。STRR3,R1,8;将R3中的字数据写入以R18为地址的存储器中。,3.2.3 ARM 存储器访问指令,(5)STRB指令格式为:STR条件B 源寄存器,STRB指令是无符号字节存储指令,用于从源寄存器中将一个8位的字节数据传送到存储器中。
23、该字节数据为源寄存器中的低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指令是无符号半字存储指令,用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。,3.2.3 ARM 存储器访问指令,指令示例:STRH R3,R1;将寄存器R3中的半字数据写入以R1为地址的存储器中。STRH R3,R1,8;将寄存器
24、R3中的半字数据写入以R18为地址的存储器中。,3.2.3 ARM 存储器访问指令,2批量数据加载/存储指令 ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。,3.2.3 ARM 存储器访问指令,常用的加载存储指令如下:LDM(或STM)指令格式为:LDM(或STM)条件类型 基址寄存器!,寄存器列表 LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈
25、。其中,类型为以下几种情况:,3.2.3 ARM 存储器访问指令,IA每次传送后地址加1,递增方式;IB每次传送前地址加1,递增方式;DA每次传送后地址减1,递减方式;DB每次传送前地址减1,递减方式;FD满递减堆栈;ED空递减堆栈;FA满递增堆栈;EA空递增堆栈;,3.2.3 ARM 存储器访问指令,!为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。基址寄存器不允许为R15。寄存器列表可以为R0R15的任意组合,若使用连续的寄存器时,可以使用“-”表示省略。为可选后缀,这是一个只是在数据块传送中使用的后缀,当指令为LDM且寄存器列表中包
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 应用 教程
链接地址:https://www.31ppt.com/p-5099506.html