嵌入式系统原理及应用教程第3章_第1页
嵌入式系统原理及应用教程第3章_第2页
嵌入式系统原理及应用教程第3章_第3页
嵌入式系统原理及应用教程第3章_第4页
嵌入式系统原理及应用教程第3章_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式系统原理及应用嵌入式系统原理及应用电子信息工程电子信息工程杨健杨健主讲内容主讲内容第第1章章 嵌入式系统概述嵌入式系统概述第第2章章 ARM微处理器概述与编程模型微处理器概述与编程模型第第3章章 ARM9指令系统指令系统第第4章章 嵌入式程序设计基础嵌入式程序设计基础第第5章章 嵌入式内部可编程模块嵌入式内部可编程模块第第6章章 嵌入式接口技术应用嵌入式接口技术应用第第7章章 软件开发环境软件开发环境第第3章章 ARM9指令系统指令系统uARM处理器的寻址方式处理器的寻址方式uARM指令集指令集 uThumb指令集指令集 3.1 ARM处理器的寻址方式处理器的寻址方式u寻址方式寻址方式是

2、处理器根据指令中给出的地址信息来寻是处理器根据指令中给出的地址信息来寻找物理地址的方式。找物理地址的方式。u目前目前ARM指令系统支持指令系统支持8种种寻址方式。寻址方式。l 寄存器寻址寄存器寻址l 立即寻址立即寻址l 寄存器间接寻址寄存器间接寻址l 变址寻址变址寻址l 寄存器移位寻址寄存器移位寻址 l 多寄存器寻址多寄存器寻址l 堆栈寻址堆栈寻址l 相对寻址相对寻址3.1.1 寄存器寻址寄存器寻址 寄存器寻址寄存器寻址就是利用寄存器中的内容作为操作数,就是利用寄存器中的内容作为操作数,寄存器本身就是操作数地址。这种寻址方式是各类微寄存器本身就是操作数地址。这种寻址方式是各类微处理器经常采用的

3、一种方式,也是一种执行效率较高处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。的寻址方式。 例如指令:例如指令: MOV R2, R3 ;R2R3 R3中的内容赋给中的内容赋给R2ADD R2,R3,R4 ;R2R3R4 R3和和R4中的内容相加,结果赋给中的内容相加,结果赋给R20 xAA0 x55R3R2MOV R2,R30 xAA3.1.2 立即寻址立即寻址u立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到

4、了操作数。这令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。即寻址。例如指令:例如指令: MOV R0,#0 xFF000 ;将立即数将立即数0 xFF000装入装入R0寄存器寄存器 ADD R1,R1,0 x7f ; R1R10 x7f 在以上两条指令中,第二个源操作数即为立即数,要在以上两条指令中,第二个源操作数即为立即数,要求以求以“”为前缀,对于以十六进制表示的立即数,还要为前缀,对于以十六进制表示的立即数,还要求在求在“”后加上后加上“0 x”。 0 x55R0MOV R0,#0 xFF

5、00程序存储程序存储MOV R0,#0 xFF000 xFF00从代码中获得数据从代码中获得数据3.1.3 寄存器间接寻址寄存器间接寻址u寄存器间接寻址寄存器间接寻址就是以寄存器中的内容作为操作数的就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如指令地址,而操作数本身存放在存储器中。例如指令 : LDRR1,R2;R1R2 STRR1,R2;R2R1 第一条指令将以第一条指令将以R2中的内容为地址,将该地址中中的内容为地址,将该地址中的数据传送到的数据传送到R1中。中。 第二条指令将第二条指令将R1中的内容传送到以中的内容传送到以R2中的内容为中的内容为地址的存储器中。地

6、址的存储器中。0 x55R1R2 0 x400000000 xAA0 x40000000LDR R1,R20 xAA3.1.4 变址寻址变址寻址u变址寻址变址寻址就是将寄存器(该寄存器一般称作基址寄存就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。某基地址附近的地址单元。例如指令:例如指令: LDR R0,R1,8 ;R0R18LDR R0,R1,8! ;R0R18,R1R18LDR R0,R1,2

7、 ;R0R1,R1R12LDR R0,R1,R2 ;R0R1R20 x55R0R1 0 x600000000 xAA0 x60000008LDR R0,R1,#0 x080 xAA将将R1+0 x08作作为地址装载数为地址装载数据据3.1.5 寄存器移位寻址寄存器移位寻址u寄存器移位寻址寄存器移位寻址是是ARM指令集独有的寻址方式,操作指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;移位的方式在数由寄存器的数值进行相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。或寄存器寻址方式表示。

8、uARM微处理器内嵌的微处理器内嵌的桶型移位器桶型移位器(Barrel Shifter),),移位操作在移位操作在ARM指令集中不作为单独的指令使用,它指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中表示为只能作为指令格式中的一个字段,在汇编语言中表示为指令中的选项。指令中的选项。例如,数据处理指令的第例如,数据处理指令的第2个操作数为寄存器时,个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下操作包括如下6种类型种类型.3.1.5 寄存器移位寻址寄存器移位寻址uLSL(或(或ASL)操作操

9、作 格式为:格式为: 通用寄存器,通用寄存器,LSL(或(或ASL) 操作数操作数 LSL(或(或ASL)可完成对通用寄存器中的内容进)可完成对通用寄存器中的内容进行行逻辑(或算术)的左移逻辑(或算术)的左移操作,按操作数所指定的数操作,按操作数所指定的数量向左移位,低位用零来填充,最后一个左移出的位量向左移位,低位用零来填充,最后一个左移出的位放在状态寄存器的放在状态寄存器的C位位CPSR29中,如图中,如图3-1所示。所示。其中,操作数可以是通用寄存器,也可以是立即其中,操作数可以是通用寄存器,也可以是立即数(数(031)。)。3.1.5 寄存器移位寻址寄存器移位寻址u操作示例:操作示例:

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

11、。其中,操作数可以是通用寄存器,所示。其中,操作数可以是通用寄存器,也可以是立即数(也可以是立即数(031)。)。 3.1.5 寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, LSR#4;将;将R1中的内容右移中的内容右移4位后传送到位后传送到R0中。中。;其中把最后移出的位赋给程序状态寄存器的;其中把最后移出的位赋给程序状态寄存器的C位位CPSR29。 3.1.5 寄存器移位寻址寄存器移位寻址31C302910003.1.5 寄存器移位寻址寄存器移位寻址uROR操作操作格式为:格式为: 通用寄存器,通用寄存器,ROR 操作数操作数 ROR可完成对通用寄存器中的内容进

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

13、寄存器的;其中把最后移出的位赋给程序状态寄存器的C位位CPSR29。 3131C C303029291 10 03.1.5 寄存器移位寻址寄存器移位寻址uASRASR操作操作格式为:格式为: 通用寄存器,通用寄存器,ASR 操作数操作数 ASR可完成对通用寄存器中的内容进行可完成对通用寄存器中的内容进行右移右移的操作,的操作,按操作数所指定的数量向右移位,最左端的位保持不按操作数所指定的数量向右移位,最左端的位保持不变,最后一个右移出的位放在状态寄存器的变,最后一个右移出的位放在状态寄存器的C位位CPSR29 ,如图,如图3-4所示。其中,操作数可以是通用所示。其中,操作数可以是通用寄存器,也

14、可以是立即数(寄存器,也可以是立即数(031)。)。 这种移位对有符号数据使用时可以保持符号位不变。这种移位对有符号数据使用时可以保持符号位不变。3.1.5 寄存器移位寻址寄存器移位寻址3.1.5 寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, ASR#4;将;将R1中的内容右移中的内容右移4位后传送到位后传送到R0中,符号位保持不中,符号位保持不变。变。;最后移出的位同时也送入状态位;最后移出的位同时也送入状态位C中。中。3131C C303029291 10 0uRRX操作操作RRX操作的格式为:操作的格式为: 通用寄存器,通用寄存器,RRX 操作数操作数 RRX

15、可完成对通用寄存器中的内容进行可完成对通用寄存器中的内容进行带扩展的带扩展的循环右移循环右移的操作,按操作数所指定的数量向右循环移的操作,按操作数所指定的数量向右循环移位,左侧空位由状态寄存器位,左侧空位由状态寄存器C位来填充,右侧移出的位来填充,右侧移出的位移进状态位位移进状态位C中,如图中,如图3-5所示。其中,操作数可以所示。其中,操作数可以是通用寄存器,也可以是立即数(是通用寄存器,也可以是立即数(031)。)。3.1.5 寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, RRX#2;将;将R1中的内容进行带扩展的循环右移两位后传送中的内容进行带扩展的循环右移两

16、位后传送到到R0中。中。3131C C303029291 10 03.1.5 寄存器移位寻址寄存器移位寻址u采用采用多寄存器寻址方式多寄存器寻址方式,一条指令可以完成多个寄存,一条指令可以完成多个寄存器值的传送。这种寻址方式可以一次对多个寄存器寻器值的传送。这种寻址方式可以一次对多个寄存器寻址,多个寄存器由小到大排列,最多可传送址,多个寄存器由小到大排列,最多可传送16个寄存个寄存器。器。 例如例如: LDMIA R1!,R2-R4,R5 ;R2R1 ;R3R14 ;R4R18 ;R5R112 该指令的后缀该指令的后缀IA表示在每次执行完加载表示在每次执行完加载/存储操作存储操作后,后,R1按

17、字长度增加,因此,指令可将连续存储单按字长度增加,因此,指令可将连续存储单元的值传送到元的值传送到R2R5。3.1.6 多寄存器寻址多寄存器寻址 使用多寄存器寻址指令时,使用多寄存器寻址指令时,寄存器子集的顺序是按由小到寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器大的顺序排列,连续的寄存器可用可用“”连接;否则用连接;否则用“,”分隔书写。分隔书写。0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R50 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器存储器LDMIA R1!,R2-

18、R4,R5 0 x400000100 x010 x020 x030 x043.1.7 堆栈寻址堆栈寻址u堆栈堆栈是一种数据结构,按先进后出(是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。栈顶。u当堆栈指针指向最后压入堆栈的数据时,称为当堆栈指针指向最后压入堆栈的数据时,称为满堆栈满堆栈(Full Stack);而当堆栈指针指向下一个将要放入数而当堆栈指针指向下一个将要放入数据的空位置时,称为据的空位置

19、时,称为空堆栈空堆栈(Empty Stack)。)。u同时,根据堆栈的生成方式,又可以分为递增堆栈同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈()和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为),当堆栈由低地址向高地址生成时,称为递递增堆栈增堆栈,当堆栈由高地址向低地址生成时,称为,当堆栈由高地址向低地址生成时,称为递减递减堆栈堆栈。栈顶栈顶SP栈顶栈顶SP栈底栈底空堆栈空堆栈栈底栈底满堆栈满堆栈0 x123456780 x12345678栈顶栈顶SP0 x12345678栈顶栈顶SP压栈压栈压栈压栈3.1.7 堆栈

20、寻址堆栈寻址uARM微处理器支持这微处理器支持这四种类型的堆栈工作方式四种类型的堆栈工作方式,即:,即:u满递增方式满递增方式FA(Full Ascending):堆栈指针指向最):堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。后入栈的数据位置,且由低地址向高地址生成。u满递减方式满递减方式FD(Full Decending):堆栈指针指向最):堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。后入栈的数据位置,且由高地址向低地址生成。u空递增方式空递增方式EA(Empty Ascending):堆栈指针指向):堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。下一个

21、入栈数据的空位置,且由低地址向高地址生成。u空递减方式空递减方式ED(Empty Decending):堆栈指针指向):堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。下一个入栈数据的空位置,且由高地址向低地址生成。3.1.8 相对寻址相对寻址 u与基址变址寻址方式相类似,与基址变址寻址方式相类似,相对寻址相对寻址以程序计数器以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令序段完成子程序的调用和返回,跳转

22、指令BL采用了采用了相对寻址方式:相对寻址方式: BL NEXT;跳转到子程序;跳转到子程序NEXT处执行处执行 NEXT MOVPC,LR;从子程序返回;从子程序返回3.2 ARM指令集指令集uARM微处理器的指令集是加载微处理器的指令集是加载/存储型的存储型的.u即指令集仅能处理寄存器中的数据,处理结果仍要放即指令集仅能处理寄存器中的数据,处理结果仍要放回寄存器中,而对回寄存器中,而对系统存储器的访问则需要通过专门系统存储器的访问则需要通过专门的加载的加载/存储指令来完成存储指令来完成。uARM9指令集,包括指令集,包括ARM指令集指令集Thumb指令集。指令集。u首先介绍首先介绍ARM指

23、令的基本格式及灵活的操作数,然指令的基本格式及灵活的操作数,然后介绍条件码,再把后介绍条件码,再把ARM指令集、指令集、Thumb指令集按类指令集按类分别说明。分别说明。ARM指令的基本格式如下: S , 其中其中号内的项是必须的,号内的项是必须的,号内的项是可选的。号内的项是可选的。各项的说明如下:各项的说明如下:opcode:指令助记符;:指令助记符;cond:执行条件;:执行条件;S:是否影响:是否影响CPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器;Rn:第:第1个操作数的寄存器;个操作数的寄存器;op2:第:第2个操作数;个操作数;3.2.1 指令格式指令格式 ARM指

24、令的基本格式如下:指令的基本格式如下:3.2 指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数 灵活的使用第灵活的使用第2个操作数个操作数“op2”能够提高能够提高代码效率。它有如下的形式:代码效率。它有如下的形式:#immed_8r常数表达式;常数表达式;Rm寄存器方式;寄存器方式;Rm,shift寄存器移位方式;寄存器移位方式; S , 3.2 指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数#immed_8r#immed_8r常数表达式常数表达式 该常数必须对应该常数必须对应8 8位位图,即必须是一位位图,即必须是一个个8 8位的常位的常数通过循环右移偶数位可

25、以得到的数数通过循环右移偶数位可以得到的数。循环右移10位0 x120 0 0 1 0 0 1 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常数0 x12移位后得到的常数0 x048000003.2 指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移

26、偶数位可以得到的数。例如:例如:MOV R0,#1AND R1,R2,#0 x0FMOV R1,#0 xC000 ;0 xC000可由可由0 x03循环右移循环右移16位得到位得到可以由0 x4A循环右移10位得到2.请列举2个8位图立即数? 思考与练习?1.以下以下8位图立即数是否合法?位图立即数是否合法?0 x0103C0000 x0103C0000 x128000000 x128000000 x4000003B(0 xED循环右移2位)0 x0016C000(0 x5B循环右移18位)3.2 指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数RmRm寄存器方式寄存器方式 在寄

27、存器方式下,操作数即为寄存器的数值。在寄存器方式下,操作数即为寄存器的数值。例如:例如:SUBR1,R1,R2MOVPC,R03.2.2 条件码条件码u当处理器工作在当处理器工作在ARM状态时,几乎所有的指令均根状态时,几乎所有的指令均根据据CPSR中条件码的状态和指令的条件域有条件的执中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指行。当指令的执行条件满足时,指令被执行,否则指令被忽略。令被忽略。u每一条每一条ARM指令包含指令包含4位的条件码位的条件码,位于指令的最高,位于指令的最高4位位31:28。条件码共有。条件码共有16种,每种条件码可用两个种,每

28、种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令和指令同时使用。例如,跳转指令B可以加上后缀可以加上后缀EQ变为变为BEQ表示表示“相等则跳转相等则跳转”,即当,即当CPSR中的中的Z标标志置位时发生跳转。志置位时发生跳转。u在在16种条件标志码中,只有种条件标志码中,只有15种可以使用。种可以使用。3.2.2 条件码条件码条件码条件码助记符后缀助记符后缀标标 志志含含 义义0000EQZ置位置位相等相等0001NEZ清零清零不相等不相等0010CSC置位置位无符号数大于或等于无符号数大于或等于0011C

29、CC清零清零无符号数小于无符号数小于0100MIN置位置位负数负数0101PLN清零清零正数或零正数或零0110VSV置位置位溢出溢出0111VCV清零清零未溢出未溢出1000HIC置位置位Z清零清零无符号数大于无符号数大于1001LSC清零清零Z置位置位无符号数小于或等于无符号数小于或等于1010GEN等于等于V带符号数大于或等于带符号数大于或等于1011LTN不等于不等于V带符号数小于带符号数小于1100GTZ清零且(清零且(N等于等于V)带符号数大于带符号数大于1101LEZ置位或(置位或(N不等于不等于V)带符号数小于或等于带符号数小于或等于1110AL忽略忽略无条件执行无条件执行C代

30、码:代码:if(a b) a+;else b+;对应的汇编代码:对应的汇编代码:CMP R0,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 存储器访问指令存储器访问指令uARM微处理器内部没有微处理器内部没有RAM,而,而ARM除了寄存器除了寄存器(即(即R0R15)外没有别的存储单元;在以)外没有别的存储单元;在以ARM为核为核的嵌入式系统中,所有的外围模块都和存储单元一样,的嵌入式系统中,所有的外围模块都和存储单元一样,是是AR

31、M微处理器的不同的地址单元。不管这些模块微处理器的不同的地址单元。不管这些模块的功能如何(如输入的功能如何(如输入/输出、定时器、存储器等),输出、定时器、存储器等),也不管这些模块的位置如何(如片内或片外),也不管这些模块的位置如何(如片内或片外),ARM微处理器都把它们看作是外部存储器。其操作微处理器都把它们看作是外部存储器。其操作过程和对存储器的操作是相同的。过程和对存储器的操作是相同的。3.2.3 ARM 存储器访问指令存储器访问指令u因此,在因此,在ARM微处理器的数据传送中,微处理器的数据传送中,数据的源和数据数据的源和数据的目标的目标只有两种:一种是只有两种:一种是ARM的寄存器

32、的寄存器R0R15;另一种;另一种就是外部存储器就是外部存储器(它们可能是外围模块的寄存器、外部数(它们可能是外围模块的寄存器、外部数据存储器或可访问的程序存储器等)。据存储器或可访问的程序存储器等)。u我们把数据从存储器到寄存器的传送我们把数据从存储器到寄存器的传送叫加载,叫加载,数据从寄存数据从寄存器到存储器的传送器到存储器的传送叫存储。叫存储。存储器存储器寄存器(寄存器(R0-R15R0-R15)ARMARM微处理器微处理器外围模块或芯片外围模块或芯片存储存储加载加载加载指令:存储指令:存储器源地址源地址目标寄存器目标寄存器存储器目标地址目标地址源寄存器源寄存器3.2.3 ARM 存储器

33、访问指令存储器访问指令3.2.3 ARM 存储器访问指令存储器访问指令u加载加载/存储指令可分为存储指令可分为3类:类:u单一数据加载单一数据加载/存储指令存储指令u批量数据加载批量数据加载/存储指令存储指令u数据交换指令数据交换指令3.2.3 ARM 存储器访问指令存储器访问指令1单一数据加载单一数据加载/存储指令存储指令(1)LDR指令指令格式为:格式为:LDR条件条件 目的寄存器,目的寄存器, LDR指令是指令是字加载指令字加载指令,用于从存储器中将,用于从存储器中将一个一个32位的字数据传送到目的寄存器中。位的字数据传送到目的寄存器中。3.2.3 ARM 存储器访问指令存储器访问指令u

34、指令示例:指令示例: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的字数据读入寄存器的字数据读入寄存器R3,并将新地址,并将新地址R1R2写入写入R1。LDR R3,R1,8 !;将存储器地址为;将存储器地址为R1+8的字数据读入寄存器的字数据读入寄存器R3,并将

35、新地址,并将新地址R18写入写入R1。零偏移:零偏移: 如:如:LDR Rd,Rn前索引偏移前索引偏移: :如:如:LDR Rd,Rn,#0 x04!程序相对偏移程序相对偏移: :如:如:LDR Rd,labe1 后索引偏移后索引偏移: :如:如:LDR Rd,Rn,#0 x040 x55R3R4 0 x400000000 x123456780 x400000000 x40000000存储器存储器地址地址应用示例:应用示例:LDR R3,R4;将将R4指向地址的字数据存入指向地址的字数据存入R30 x123456783.2.3 ARM 存储器访问指令存储器访问指令3.2.3 ARM 存储器访问

36、指令存储器访问指令LDR R3,R1,R2;将存储器地址为;将存储器地址为R1的字数据读入寄存器的字数据读入寄存器R3,并将新,并将新地址地址R1R2写入写入R1。LDR R3,R1,R2,LSL3!;将存储器地址为;将存储器地址为R1R28的字数据读入寄存器的字数据读入寄存器R3,并将新地址并将新地址R1R28写入写入R1。LDR R3,R1,R2,LSL3;将存储器地址为;将存储器地址为R1的字数据读入寄存器的字数据读入寄存器R3,并将新,并将新地址地址R1R28写入写入R1。注:注:R15不可以作为偏移寄存器使用。不可以作为偏移寄存器使用。3.2.3 ARM 存储器访问指令存储器访问指令

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

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

39、读取中读取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的高

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

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

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

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

44、加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。存储指令则完成相反的操作。3.2.3 ARM 存储器访问指令存储器访问指令常用的加载存储指令如下:常用的加载存储指令如下:LDM(或(或STM)指令)指令格式为:格式为:LDM(或(或STM)条件条件类型类型 基址寄存器基址寄存器!,寄存器列表,寄存器列表 LDM(或(或STM)指令用于从由基址寄存器所指示的一)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途

45、是将多个寄存器的内容入栈或出数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,栈。其中,类型类型为以下几种情况:为以下几种情况:3.2.3 ARM 存储器访问指令存储器访问指令uIA 每次传送后地址加每次传送后地址加1,递增方式;,递增方式;uIB 每次传送前地址加每次传送前地址加1,递增方式;,递增方式;uDA 每次传送后地址减每次传送后地址减1,递减方式;,递减方式;uDB 每次传送前地址减每次传送前地址减1,递减方式;,递减方式;uFD 满递减堆栈;满递减堆栈;uED 空递减堆栈;空递减堆栈;uFA 满递增堆栈;满递增堆栈;uEA 空递增堆栈;空递增堆栈;3.2.3 ARM 存

46、储器访问指令存储器访问指令u!为可选后缀,若选用该后缀,则当数据传送完毕为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。器的内容不改变。u基址寄存器不允许为基址寄存器不允许为R15。u寄存器列表可以为寄存器列表可以为R0R15的任意组合,若使用连续的任意组合,若使用连续的寄存器时,可以使用的寄存器时,可以使用“-”表示省略。表示省略。u为可选后缀,这是一个只是在数据块传送中使用为可选后缀,这是一个只是在数据块传送中使用的后缀,当指令为的后缀,当指令为LDM且寄存器列表中包含且寄存器列表中包含R

47、15,选,选用该后缀时表示:除了正常的数据传送之外,还将用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到复制到CPSR。同时,该后缀还表示传入或传出。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存的是用户模式下的寄存器,而不是当前模式下的寄存器。器。3.2.3 ARM 存储器访问指令存储器访问指令指令示例:指令示例:STMFD R13!,R0,R4-R12,LR;将寄存器列表中的寄存器(;将寄存器列表中的寄存器(R0,R4到到R12,LR)存入堆)存入堆栈。栈。LDMFD R13!,R0,R4-R12,PC;将堆栈内容恢复到寄存器(;将堆栈内容恢复到寄存器

48、(R0,R4到到R12,LR)。)。在通用存储区,数据存储的方式和堆栈区相近。下面通过存在通用存储区,数据存储的方式和堆栈区相近。下面通过存储储R1、R2和和R3 3个寄存器的个寄存器的4种后缀指令执行前后的存储种后缀指令执行前后的存储情况如图情况如图3-7所示。所示。3.2.3 ARM 存储器访问指令存储器访问指令STMIBSTMIB R0R0!,R1,R2,R3R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0STMIA R0!,R1,R2,R3STMIA R0!,R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2

49、R1R1R0R0地址增地址增STMDA R0!,R1,R2,R3STMDA R0!,R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0STMDB R0!,R1,R2,R3STMDB R0!,R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0地址减地址减3.2.3 ARM 存储器访问指令存储器访问指令3交换指令交换指令(1)SWP指令指令格式为:格式为: SWP条件条件 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWP指令是数据指令是数据字交换字交换指令,用于将源寄存器指令,用于将源

50、寄存器2所指向的存储器中的字数据传送到目的寄存器中,所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器同时将源寄存器1中的字数据传送到源寄存器中的字数据传送到源寄存器2所指所指向的存储器中。显然,当源寄存器向的存储器中。显然,当源寄存器1和目的寄存器为和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内同一个寄存器时,指令交换该寄存器和存储器的内容。容。3.2.3 ARM 存储器访问指令存储器访问指令指令示例:指令示例:SWP R1,R2,R3 ;将;将R3所指向的存储器中的字数据传送到所指向的存储器中的字数据传送到R1,同时,同时;将;将R2中的字数据传送到中的字数据传送到R3

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

52、中的字节数据传送到源寄存器中的字节数据传送到源寄存器2所指向的存储器中。所指向的存储器中。显然,当源寄存器显然,当源寄存器1和目的寄存器为同一个寄存器和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。时,指令交换该寄存器和存储器的内容。3.2.3 ARM 存储器访问指令存储器访问指令指令示例:指令示例:SWPB R1,R2,R3;将;将R3所指向的存储器中的字节数据传送到所指向的存储器中的字节数据传送到R1,R1的的高高24位清零,同时将位清零,同时将R2中的低中的低8位数据传送到位数据传送到R3所指所指向的存储单元。向的存储单元。SWPB R1,R1,R2;该指令完成将;该指令完

53、成将R2所指向的存储器中的字节数据与所指向的存储器中的字节数据与R1中的低中的低8位数据交换。位数据交换。3.2.4 ARM 数据处理类指令数据处理类指令u数据处理指令只能对寄存器的内容进行操作,不允许数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。存储器的数据或在寄存器与存储器之间传送数据。u数据处理指令可分为数据处理指令可分为3大类:大类:u数据传送指令数据传送指令u算术逻辑运算指令算术逻辑运算指令u比较指令比较指令3.2.4 ARM 数据处理类指令数据处理

54、类指令u数据传送指令数据传送指令用于在寄存器和存储器之间进行数用于在寄存器和存储器之间进行数据的双向传输。据的双向传输。u算术逻辑运算指令算术逻辑运算指令完成常用的算术与逻辑的运算,完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,该类指令不但将运算结果保存在目的寄存器中,同时更新同时更新CPSR中的相应条件标志位。中的相应条件标志位。u比较指令比较指令是完成对指定的两个寄存器(或是完成对指定的两个寄存器(或1个寄存个寄存器,器,1个立即数)进行比较,不保存运算结果,只个立即数)进行比较,不保存运算结果,只影响影响CPSR中相应的条件标志位。中相应的条件标志位。数据传送指令

55、数据传送指令1.数据传送指令数据传送指令MOV和和MVN(1)MOV指令指令 格式为:格式为: MOV条件条件S 目的寄存器,源操作数目的寄存器,源操作数 MOV指令可完成在寄存器之间或寄存器与第指令可完成在寄存器之间或寄存器与第2操作数之间进行数据传送。操作数之间进行数据传送。 其中其中S选项决定指令的操作是否影响选项决定指令的操作是否影响CPSR中中条件标志位的值,当没有条件标志位的值,当没有S时指令不更新时指令不更新CPSR中中条件标志位的值。条件标志位的值。数据传送指令数据传送指令指令示例:指令示例:MOV R4,R5;将寄存器;将寄存器R5的内容传送到寄存器的内容传送到寄存器R4MO

56、V PC,R14;将寄存器;将寄存器R14的内容传送到的内容传送到PC,常用于子程序返,常用于子程序返回回MOVNE R4,R5,LSL2;当;当Z=0时,将寄存器时,将寄存器R5的内容逻辑左移的内容逻辑左移2位后传送位后传送到到R4数据传送指令数据传送指令(2)MVN指令指令格式为:格式为:MVN条件条件S 目的寄存器,源操作数目的寄存器,源操作数 MVN指令可完成在寄存器之间或寄存器与第指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与操作数之间进行数据非传送。与MOV指令不同指令不同之处是在传送之前按位被取反了,即把一个被取之处是在传送之前按位被取反了,即把一个被取反的值传

57、送到目的寄存器中。反的值传送到目的寄存器中。 其中其中S决定指令的操作是否影响决定指令的操作是否影响CPSR中条件中条件标志位的值,当没有标志位的值,当没有S时指令不更新时指令不更新CPSR中条件中条件标志位的值。标志位的值。数据传送指令数据传送指令指令示例:指令示例:MVN R0,0;将立即数;将立即数0取反传送到寄存器取反传送到寄存器R0中,完成后中,完成后R0=-1 MVN R1,R2;将将R2取反,结果存到取反,结果存到R1算术逻辑运算指令算术逻辑运算指令2.算术逻辑运算指令算术逻辑运算指令(1)ADD指令指令格式为:格式为: ADD条件条件S 目的寄存器,操作数目的寄存器,操作数1,

58、操作数,操作数2 ADD指令是指令是加法指令加法指令,用于把两个操作数相加,用于把两个操作数相加,并将结果存放到目的寄存器中。并将结果存放到目的寄存器中。u 操作数操作数1应是一个寄存器。应是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或可以是一个寄存器,被移位的寄存器,或一个立即数一个立即数 .算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:ADDS R0,R3,R4 ; R0 = R3 + R4,设置标志位,设置标志位ADD R0,R3,#10 ; R0 = R3 + 10ADD R0,R2,R3,LSL#2 ; R0 = R2 + R34算术逻辑运算指令算术逻辑运算

59、指令(2)ADC指令指令格式为:格式为: ADC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2ADC指令是指令是带进位加法指令带进位加法指令,用于把两个操作数相加,用于把两个操作数相加,再加上再加上CPSR中的中的C条件标志位的值,并将结果存放条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可到目的寄存器中。它使用一个进位标志位,这样就可以做比以做比32位大的数的加法,注意不要忘记设置位大的数的加法,注意不要忘记设置S后缀后缀来更改进位标志。来更改进位标志。u操作数操作数1应是一个寄存器。应是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄

60、存器,或一可以是一个寄存器,被移位的寄存器,或一个立即数。个立即数。算术逻辑运算指令算术逻辑运算指令以下指令序列实现以下指令序列实现64位二进制数的加法:位二进制数的加法:R2、R1= R2、R1+ R4、R3ADDS R1,R1,R3 ;R1= R1+ R3ADC R2,R2,R4 ;R2= R2+ R4+C算术逻辑运算指令算术逻辑运算指令(3)SUB指令指令格式为:格式为: SUB条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 SUB指令是指令是减法指令减法指令,用于把操作数,用于把操作数1减去操作减去操作数数2,并将结果存放到目的寄存器中。该指令可用,并将结果存放到

温馨提示

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

评论

0/150

提交评论