嵌入式ppt第三章.ppt
《嵌入式ppt第三章.ppt》由会员分享,可在线阅读,更多相关《嵌入式ppt第三章.ppt(94页珍藏版)》请在文库网上搜索。
1、第第3章章 ARM指令集指令集目目 录录 3.1 3.1 ARMARM指令集指令集概述概述3.2 ARM3.2 ARM指令的寻址方式指令的寻址方式3.3 ARM3.3 ARM指令简介指令简介3.4 Thumb3.4 Thumb指令简介指令简介3.5 ARM3.5 ARM汇编语言简介汇编语言简介3.6 C3.6 C语言与汇编语言的混合编程语言与汇编语言的混合编程3.7 3.7 本章小结本章小结在嵌入式系统开发中,目前最常用的编程语言是汇编语言和C语言。在较复杂的嵌入式软件中,由于C语言编写程序较方便,结构清晰,而且有大量支持库,所以大部分代码采用C语言编写,特别是基于操作系统的应用程序设计。但是
2、在系统初始化、BootLoadr、中断处理等,对时间和效率要求较严格的地方仍旧要使用汇编语言来编写相应代码块。本章将介绍ARM指令集指令及汇编语言的相关知识。ARM指令集指令集概述概述Part One3.13.1ARM处理器的指令集主要有:ARM指令集,是ARM处理器的原生32位指令集,所有指令长度都是32位,以字对齐(4字节边界对齐)方式存储;该指令集效率高,但是代码密度较低。Thumb指令集是16位指令集,2字节边界对齐,是ARM指令集的子集;在具有较高代码密度的同时,仍然保持ARM的大多数性能优势。Thumb-2指令集是对Thumb指令集的扩展,提供了几乎与ARM指令集完全相同的功能,同
3、时具有16位和32位指令,既继承了Thumb指令集的高代码密度,又能实现ARM指令集的高性能;2字节边界对齐,16位和32位指令可自由混合。Thumb-2EE指令集是Thumb-2指令集的一个变体,用于动态产生的代码;不能与ARM指令集和Thumb指令集交织在一起。除了上面介绍的指令集外,ARM处理器还有针对协处理器的扩展指令集,如普通协处理器指令、NEON和VFP扩展指令集、无线MMX技术扩展指令集等。3.1.1 指令格式指令格式ARM指令集的指令基本格式如下:S ,指令中“”内的项是必需的,“”内的项是可选的。符号符号说明说明opcode操作码,即指令助记符,如MOV、SUB、LDR等co
4、nd条件码,描述指令执行的条件S可选后缀,指令后加上“S”,指令执行成功完成后自动更新CPSR寄存器中的条件标志位Rd目的寄存器Rn存放第1个操作数的寄存器shift_operand第2个操作数,可以是寄存器、立即数等ARM指令集中几乎每条指令都可以是条件执行的,由cond可选条件码来决定,位于ARM指令的最高4位31:28,可以使用的条件码如表3-2所示。每种条件码的助记符由两个英文符号表示,在指令助记符的后面和指令同时执行。根据程序状态寄存器CPSR中的条件标志位31:28判断当前条件是否满足,若满足则执行指令。若指令中有后缀S,则根据执行结果更新程序状态寄存器CPSR中的条件标志位31:
5、28。3.1.2 指令的条件指令的条件码指令条件码指令条件码助记符助记符CPSR条件标志位值条件标志位值含义含义0000EQZ=1相等0001NEZ=0不相等0010 CS/HSC=1无符号数大于或等于0011 CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于 1011LTN!=V有符号数小于 1100GTZ=0,N=V有符号数大于 1101LEZ=1,N!=V有符号数小于或等于 1110AL任何无条件
6、执行(指令默认条件)1111NV任何从不执行(不要执行)ARM指令的寻址方式Part Two3.23.2寻址方式是指处理器根据指令中给出的地址信息,找出操作数所存放的物理地址,实现对操作数的访问。根据指令中给出的操作数的不同形式,ARM指令系统支持的寻址方式有:立即寻址、寄存器寻址、寄存器间接寻址、寄存器移位寻址、变址寻址、多寄存器寻址、堆栈寻址、块复制寻址和相对寻址等。3.2 ARM指令的寻址方式立即寻址寄存器寻址寄存器偏移寻址寄存器间接寻址基址变址寻址多寄存器寻址堆栈寻址相对寻址ARM指令集与Thumb指令集的关系Thumb指令集具有灵活、小巧的特点ARM指令集支持ARM核所有的特性,具有
7、高效、快速的特点 操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOV R1,R2 ;将R2的值存入R1 SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0 0 xAA0 x55R2R1寻址方式分类寄存器寻址MOV R1,R20 xAA 立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1 ;R0减1,结果放入R0,并且影响标志位MOVR0,#0 xFF000 ;
8、将立即数0 xFF000装入R0寄存器 0 x55R0MOV R0,#0 xFF00程序存储寻址方式分类立即寻址MOV R0,#0 xFF000 xFF00从代码中获得数据 寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL#3 ;R2的值左移3位,结果放入R0,;即是R0=R28 ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R10 x55R0R20 x01寻址方式分类寄存器偏移寻址(寄存器移位寻址)
9、MOV R0,R2,LSL#30 x080 x08逻辑左移3位 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中 SWPR1,R1,R2;将寄存器R1的值和R2指定的存储;单元的内容交换 0 x55R0R2 0 x400000000 xAA0 x40000000寻址方式分类寄存器间接寻址LDR R1,R20 xAA 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储
10、单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDRR2,R3,#0 x0C ;读取R3+0 x0C地址上的存储单元 ;的内容,放入R2 STRR1,R0,#-4!;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存储单元 寻址方式分类基址(变址)寻址0 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0C0 xAA将R3+0 x0C作为地址装载数据 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,R2-R7,R12 ;将R1
11、指向的单元中的数据读出到 ;R2R7、R12中(R1自动加1)STMIAR0!,R2-R7,R12 ;将寄存器R2R7、R12的值保 ;存到R0指向的存储;单元中 ;(R0自动加1)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器寻址方式分类多寄存器寻址LDR R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一
12、个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈寻址方式分类堆栈寻址寻址方式分类堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0 x123456780 x12345678堆栈压栈堆栈压栈栈顶SP栈顶SP栈底空堆栈栈底满堆栈 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。寻址方式分类堆栈寻址0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈所
13、以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类堆栈寻址 多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:STMIAR0!,R1-R7;将R1R7的数据保存到存储器中。;存储指针在保存第一个值之后增加,;增长方向为向上增长。S
14、TMIBR0!,R1-R7;将R1R7的数据保存到存储器中。;存储指针在保存第一个值之前增加,;增长方向为向上增长。寻址方式分类块拷贝寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处.LOOPMOVR6,#1.SUBR1.寻址方式分类相对寻址简单的ARM程序;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明
15、代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 使用“;”进行注释标号顶格写实际代码段声明文件结束简单的ARM程序;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY
16、;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 3.2.1 立即立即寻址址立即寻址也叫立即数寻址,指令的操作码字段后面的地址码部分不是操作数地址而是操作数本身,包含在指令的32位编码中。立即数前要加前缀“#”。示例:ADDR0,R0,#1;R0 R0+1MOVR0,#0 x00ff;R0 0 x00ff3.2.2 寄存器寄存器寻址址寄存
17、器寻址是指将操作数放在寄存器中,指令中地址码部分给出寄存器编号。这是各类微处理器常用的一种有较高执行效率的寻址方式。示例:ADDR0,R1,R2;R0 R1+R2MOVR0,R1;R0 R13.2.3 寄存器寄存器间接接寻址址操作数存放在存储器中,并将所存放的存储单元地址放入某一通用寄存器中,在指令中的地址码部分给出该通用寄存器的编号。示例:LDRR0,R1;R0 R1该指令将寄存器R1中存放的值0 xA0000008作为存储器地址,将该存储单元中的数据0 x00000003传送到寄存器R0中,寻址示意图如图3-1所示。3.2.4 寄存器移位寄存器移位寻址址该指令中,寄存器的值在被送到ALU之
18、前,先进行移位操作。移位的方式由助记符给出,移位的位数可由立即数或寄存器直接寻址方式表示。可以采用的移位操作有:LSL:逻辑左移,寄存器值低端空出的位补0。LSR:逻辑右移,寄存器值高端空出的位补0。ASR:算术右移,算术移位操作对象是有符号数,位移过程中要保证操作数的符号不变,若操作数是正数,高端空出位补0;若操作数是负数,高端空出位补1。ROR:循环右移,从低端移出的位填入高端空出的位中。RRX:带扩展的循环右移,操作数右移1位,高端空出的位用C标志位填充。示例:MOV R0,R1,LSL#2 ;R0 R1中的数左移2位ADDR0,R1,R2,LSR#3 ;R0 R1+R2中的数右移3位3
19、.2.5 变址址寻址址变址寻址方式是将某个寄存器(基址寄存器)的值与指令中给出的偏移量相加,形成操作数的有效地址,再根据该有效地址访问存储器。该寻址方式常用于访问在基址附近的存储单元。示例:LDRR0,R1,#2;R0 R1+2该指令将R1寄存器的值0 xA0000008加上位移量2,形成操作数的有效地址,将该有效地址单元中的数据传送到寄存器R0中。3.2.6 多寄存器多寄存器寻址址多寄存器寻址方式可以在一条指令中传送多个寄存器的值,一条指令最多可以传送16个通用寄存器的值。连续的寄存器之间用“-”连接,不连续的中间用“,”分隔。示例:LDMIAR0!,R1-R3,R5;R1 R0;R2 R0
20、+4;R3 R0+8;R5 R0+12该指令将R0寄存器的值0 xA0000004作为操作数地址,将存储器中该地址开始的连续单元中的数据传送到寄存器R1、R2、R3、R5中,寻址示意图如图3-2所示。3.2.7 相相对寻址址相对寻址方式就是以PC寄存器为基址寄存器,以指令中的地址标号为偏移量,两者相加形成操作数的有效地址。偏移量指出的是当前指令和地址标号之间的相对位置。子程序调用指令即是相对寻址方式。示例:BLADDR1;跳转到子程序ADDR1处执行ADDR1:MOVPC,LR;从子程序返回3.2.8 堆堆栈寻址址堆栈是按“先进后出”或“后进先出”方式进行存取的存储区。堆栈寻址是隐含的,使用一
21、个叫做堆栈指针的专门寄存器,指示当前堆栈的栈顶。根据堆栈的生成方式不同,分为递增堆栈和递减堆栈。当堆栈向高地址方向生长时,叫做递增堆栈(向上生长);当堆栈向低地址方向生长时,叫做递减堆栈(向下生长)。堆栈指针指向最后压入堆栈的数据时,称为满堆栈;堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈。这样就有四种类型的堆栈工作方式:满递增堆栈(FA)、满递减堆栈(FD)、空递增堆栈(EA)、空递减堆栈(ED)。示例:STMFDSP!,R1-R3,LR;将寄存器R1-R3和LR压入堆栈,满递减堆栈LDMFDSP!,R1-R3,LR;将堆栈数据出栈,放入寄存器R1-R3和LR3.2.9 堆堆栈寻址址
22、块复制寻址方式是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可以将存储器中的一个数据块复制到多个寄存器中,或则将多个寄存器中的值复制到存储器中。寻址操作中使用的寄存器可以是R0R15这16个寄存器的所有或子集。根据基地址的增长方向是向上还是向下,以及地址的增减与指令操作的先后顺序(操作先进行还是地址先增减)的关系,有四种寻址方式:IB(Increment Before):地址先增加再完成操作,如STMIB、LDMIB。IA(Increment After):先完成操作再地址增加,如STMIA、LDMIA。DB(Decrement Before):地址先减少再完成操作,如STMD
23、B、LDMDB。DA(Decrement After):先完成操作再地址减少,如STMDA、LDMDA。ARM指令简介Part Three3.33.3ARM指令集主要有:跳转指令、数据处理指令、程序状态寄存器处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。ARM指令集是加载/存储型的,指令的操作数都存储在寄存器中,处理结果直接放入到目的寄存器中。采用专门的加载/存储指令来访问系统存储器。3.3.1 跳跳转指令指令跳转指令用于实现程序流程的跳转。在ARM程序中有两种方式可以实现程序流程的跳转:直接向程序计数器PC中写入跳转地址,可以实现4G地址空间内的任意跳转。例如:LDRPC,PC
24、,#+0 x00FF;PC PC+8+0 x00FF使用专门的跳转指令。ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB地址空间的跳转。跳转指令有:BWAITA;无条件跳转到标号WAITA处执行B0 x1234;跳转到绝对地址0 x1234处1.B指令:指令:B 条件 目标地址跳转指令B是最简单的跳转指令,跳转到给定的目标地址,从那里继续执行。示例:BLFUNC1;将当前PC值保存到R14中,然后跳转到标号FUNC1处执行2.BL指令指令BL 条件 目标地址用于子程序调用,在跳转之前,将下一条指令的地址复制到链接寄存器R14(LR)中,然后跳转到指定地址执行。示例:BLX FUN
25、C1;将当前PC值保存到R14中,然后跳转到标号FUNC1处执行,;并切换到Thumb状态BLX R0;将当前PC值保存到R14中,然后跳转R0中的地址处执行,;并切换到Thumb状态3.BLX指令指令BLX 条件 目标地址BLX指令从ARM指令集跳转到指定地址执行,并将处理器的工作状态由ARM状态切换到Thumb状态,同时将PC值保存到链接寄存器R14中。示例:BX R0;跳转R0中的地址处执行,如果R00=1,切换到Thumb状态4.BX指令指令BX 条件 目标地址带状态切换的跳转指令,跳转到指定地址执行。若目标地址寄存器的位0为1,处理器的工作状态切换为Thumb状态,同时将CPSR中的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 ppt 第三