收藏 分享(赏)

嵌入式ppt第三章.ppt

上传人:bubibi 文档编号:20014187 上传时间:2023-12-02 格式:PPT 页数:94 大小:1.87MB
下载 相关 举报
嵌入式ppt第三章.ppt_第1页
第1页 / 共94页
嵌入式ppt第三章.ppt_第2页
第2页 / 共94页
嵌入式ppt第三章.ppt_第3页
第3页 / 共94页
嵌入式ppt第三章.ppt_第4页
第4页 / 共94页
嵌入式ppt第三章.ppt_第5页
第5页 / 共94页
亲,该文档总共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中的

26、T标志位置1,目标地址寄存器的位31:1复制到PC中;若目标地址寄存器的位0为0,处理器的工作状态切换为ARM状态,同时将CPSR中的T标志位清0,目标地址寄存器的位31:1复制到PC中。示例:3.3.2 数据数据处理指令理指令数据传输指令主要完成寄存器中数据的各种运算操作。数据处理指令的使用原则:所有操作数都是32位,可以是寄存器或立即数。如果数据操作有结果,结果也为32位,放在目的寄存器中。指令使用“两操作数”或“三操作数”方式,即每一个操作数寄存器和目的寄存器分别指定。数据处理指令只能对寄存器的内容进行操作。指令后都可以选择S后缀来影响标志位。比较指令不需要后缀S,这些指令执行后都会影响

27、标志位。MOV R0,#0 x01;将立即数0 x01装入到R0MOV R0,R1;将寄存器R1的值传送到R0MOVS R0,R1,LSL#3;将寄存器R1的值左移3位后传送到R0,并影响标志位MOV PC,LR;将链接寄存器LR的值传送到PC中,用于子程序返回1.MOV指令指令MOV 条件S 目的寄存器,源操作数MOV指令将一个立即数、一个寄存器或被移位的寄存器传送到目的寄存器中。后缀S表示指令的操作是否影响标志位。如果目的寄存器是寄存器PC可以实现程序流程的跳转;寄存器PC做为目的寄存器且后缀S被设置,则在跳转的同时,将当前处理器工作模式下的SPSR值复制到CPSR中。示例:MVN R0,

28、#0 x0FF;将立即数0 xFF按位求反后装入R0,操作后R0=0 xFFFFFF00MVN R0,R1;将寄存器R1的值按位求反后传送到R02.MVN指令指令MVN 条件S 目的寄存器,源操作数MVN指令将一个立即数、一个寄存器或被移位的寄存器的值先按位求反,再传送到目的寄存器中。后缀S表示是否影响标志位。示例:ADD R0,R0,#1 ;R0=R0+1ADD R0,R1,R2 ;R0=R1+R2ADD R0,R1,R2,LSL#3 ;R0=R1+(R2 3)3.ADD指令指令ADD 条件S 目的寄存器,操作数1,操作数2ADD指令将两个操作数相加后,结果放入目的寄存器中。同时根据操作的结

29、果影响标志位。示例:SUB R0,R0,#1;R0=R0-1SUB R0,R1,R2;R0=R1-R2SUB R0,R1,R2,LSL#3;R0=R1-(R2 3)4.SUB指令指令SUB 条件S 目的寄存器,操作数1,操作数2SUB指令用于把操作数1减去操作数2,将结果放入目的寄存器中。同时根据操作的结果影响标志位。示例:RSB R0,R0,#0 xFFFF ;R0=0 xFFFF -R0RSB R0,R1,R2;R0=R2 R15.RSB指令指令RSB 条件S 目的寄存器,操作数1,操作数2RSB指令称为逆向减法指令,用于把操作数2减去操作数1,将结果放入目的寄存器中。同时根据操作的结果影

30、响标志位。示例:ADDS R0,R0,R2ADC R1,R1,R3;用于64位数据加法,(R1,R0)=(R1,R0)+(R3,R2)6.ADC指令指令ADC 条件S 目的寄存器,操作数1,操作数2ADC指令将两个操作数相加后,再加上CPSR中的C标志位的值,将结果放入目的寄存器中。同时根据操作的结果影响标志位。示例:SUBS R0,R0,R2SBC R1,R1,R3;用于64位数据减法,(R1,R0)=(R1,R0)-(R3,R2)7.SBC指令指令SBC 条件S 目的寄存器,操作数1,操作数2SBC指令用于操作数1减去操作数2,再减去CPSR中的C标志位值的反码,将结果放入目的寄存器中。同

31、时根据操作的结果影响标志位。示例:RSBS R2,R0,#0RSC R3,R1,#0 ;用于求64位数据的负数RSC R0,R1,R2 ;R0=R2 R1-!C8.RSC指令指令RSC 条件S 目的寄存器,操作数1,操作数2RSC指令用于操作数2减去操作数1,再减去CPSR中的C标志位值的反码,将结果放入目的寄存器中。同时根据操作的结果影响标志位。示例:AND R0,R1,R2;R0=R1&R2AND R0,R0,#3;R0的位0和位1不变,其余位清09.AND指令指令AND 条件S 目的寄存器,操作数1,操作数2AND指令实现两个操作数的逻辑与操作,将结果放入目的寄存器中。同时根据操作的结果

32、影响标志位。常用于将操作数某些位清0。示例:ORR R0,R0,#3;R0的位0和位1置1,其余位不变10.ORR指令指令ORR 条件S 目的寄存器,操作数1,操作数2ORR指令实现两个操作数的逻辑或操作,将结果放入目的寄存器中。同时根据操作的结果影响标志位。常用于将操作数某些位置1。示例:EOR R0,R0,#0F;R0的低4位取反11.EOR指令指令EOR 条件S 目的寄存器,操作数1,操作数2EOR指令实现两个操作数的逻辑异或操作,将结果放入目的寄存器中。同时根据操作的结果影响标志位。常用于将操作数某些位置取反。示例:BIC R0,R0,#0F;将R1的低4位清0,其他位不变12.BIC

33、指令指令BIC 条件S 目的寄存器,操作数1,操作数2BIC指令用于清除操作数1的某些位,将结果放入目的寄存器中。同时根据操作的结果影响标志位。操作数2为32位掩码,掩码中设置了哪些位则清除操作数1中这些位。示例:CMP R1,R0;将R1的值减去R0的值,并根据结果设置CPSR的标志位CMP R1,#0 x200;将R1的值减去200,并根据结果设置CPSR的标志位13.CMP指令指令CMP 条件 操作数1,操作数2CMP指令用于把一个寄存器的值减去另一个寄存器的值或立即数,根据结果设置CPSR中的标志位,但不保存结果。示例:CMN R1,R0;将R1的值和R0的值相加,并根据结果设置CPS

34、R的标志位CMN R1,#0 x200 ;将R1的值和立即数200相加,并根据结果设置CPSR的标志位14.CMN指令指令CMN 条件 操作数1,操作数2CMN指令用于把一个寄存器的值减去另一个寄存器或立即数取反的值,根据结果设置CPSR中的标志位,但不保存结果。该指令实际完成两个操作数的加法。示例:TST R1,#0 x0F;检测R1的低4为是否为015.TST指令指令TST 条件 操作数1,操作数2TST指令用于把一个寄存器的值和另一个寄存器的值或立即数进行按位与运算,根据结果设置CPSR中的标志位,但不保存结果。该指令常用于检测特定位的值。示例:TEQ R1,R2;将R1的值和R2的值进

35、行异或运算,并根据结果设置CPSR的标志位16.TEQ指令指令TEQ 条件 操作数1,操作数2TEQ指令用于把一个寄存器的值和另一个寄存器的值或立即数进行按位异或运算,根据结果设置CPSR中的标志位,但不保存结果。该指令常用于检测两个操作数是否相等。示例:3.3.3 程序状程序状态寄存器寄存器处理指令理指令MRS指令和MSR指令用于在状态寄存器和通用寄存器间传输数据。状态寄存器的值要通过“读取修改写回”三个步骤操作来实现,可先用MRS指令将状态寄存器的值复制到通用寄存器中,修改后再通过MSR指令把通用寄存器的值写回状态寄存器。示例:MRS R0,CPSR;将CPSR的值复制到R0中ORR R0

36、,R0,#C0;R0的位6和位7置1,即屏蔽外部中断和快速中断MSR CPSR,R0;将R0值写回到CPSR中MRS指令和MSR指令的格式如下:MRS 条件 通用寄存器,程序状态寄存器(CPSR或SPSR)MSR 条件 程序状态寄存器(CPSR或SPSR)_,操作数其中,MSR指令中的可用于设置程序状态寄存器中需要操作的位:位31:24为条件标志位域,用f表示。位23:16为状态位域,用s表示。位15:8为扩展位域,用x表示。位7:0为控制位域,用c表示。示例:MSR CPSR_cxsf,R33.3.4 加加载/存存储指令指令加载/存储指令用于在寄存器和存储器之间传输数据,Load指令用于将存

37、储器中的数据传输到寄存器中,Store指令用于将寄存器中的数据保存到存储器中。1.LDR指令指令LDR条件 目的寄存器,LDR指令将一个32位字数据传输到目的寄存器中。如果目的寄存器是PC,从存储器中读出的数据将作为目的地址,以实现程序流程的跳转。示例:LDR R1,R0,#0 x12;将存储器地址为R0+0 x12的字数据写入R1LDR R1,R0,R2;将存储器地址为(R0+R2)的字数据写入R1STR R1,R0,#0 x12;将R1中的字数据写入以R0+0 x12为地址的存储器中STR R1,R0,#0 x12;将R1中的字数据写入以R0+0 x12为地址的存储器中,;并将新地址R0+

38、0 x12写入R02.STR指令指令STR 条件 源寄存器,STR指令用于从源寄存器中将一个32位字数据写入存储器中。示例:3.LDM和和STM指令指令LDM(或STM)条件类型 基址寄存器!,寄存器列表LDM指令和STM指令实现一组寄存器和一片连续存储空间之间的数据传输。LDM指令加载多个寄存器,STM指令存储多个寄存器,它们常用于现场保护、数据复制、参数传输等,有8种模式:IA:每次传送后地址加4。IB:每次传送前地址加4。DA:每次传送后地址减4。DB:每次传送前地址减4。FD:满递减堆栈。ED:空递减堆栈。FA:满递增堆栈。EA:空递增堆栈。可选后缀!,选用该后缀,当数据传输完成后,将

39、最后地址写入基址寄存器中,否则基址寄存器值不变;基址寄存器不能为R15(PC),寄存器列表可以是R0R15的任意组合。可选后缀,当指令为LDM且寄存器列表中有R15(PC),选用该后缀表示除了完成数据传输以外,还将SPSR复制到CPSR。示例:LDMIA R0,R3-R9;R0指向的存储器单元的数据,保存到R3R9中,R0值不更新STMIA R1!,R3-R9;将R3R9数据存储到R1指向的存储器单元中,R1的值更新SWP R1,R1,R0;将R1的内容与R0指向的存储单元的内容进行交换SWP R1,R2,R0;将R0指向的存储单元的内容写入到R1中,并将R2的内容写入;到该内存单元中4.SW

40、P指令指令SWP条件 目的寄存器,源寄存器1,源寄存器2SWP指令用于将源寄存器2所指向的存储器中的字数据传输到目的寄存器中,同时将源寄存器1中的字数据传输到源寄存器2所指向的存储器中。当源寄存器1和目的寄存器为同一个寄存器时,该指令完成该寄存器和存储器内容的交换。示例:3.3.5 协处理理指令指令ARM体系结构允许通过增加协处理器来扩展指令集。ARM协处理器具有自己专用的寄存器组,它们的状态由控制ARM状态的指令的镜像指令来控制。程序的控制流指令由ARM处理器来处理,所有的协处理器指令只能同数据处理和数据传送有关。ARM协处理器指令可完成下面三类操作:ARM协处理器的数据处理操作。ARM处理

41、器和协处理器的寄存器之间数据传输。ARM协处理器的寄存器和存储器之间数据传输。ARM协处理器指令主要包括5条,它们的格式和功能如下:助记符助记符说明说明功能功能CDP coproc,opcodel,CRd,CRn,CRm,opcode2协处理器数据操作指令用于ARM处理器通知协处理器执行特定的操作LDCL coproc,CRd 协处理器数据读取指令从某一连续的存储单元将数据读取到协处理器的寄存器中STCL coproc,CRd 协处理器数据写入指令将协处理器的寄存器数据写入到某一连续的存储单元中MCR coproc,opcodel,Rd,CRn,opcode2ARM寄存器到协处理器寄存器的数据

42、传输指令将ARM处理器的寄存器中的数据传输到协处理器的寄存器中MRC coproc,opcodel,Rd,CRn,opcode2协 处 理 器 寄 存 器 到ARM寄存器的数据传输指令将协处理器的寄存器中的数据传输到ARM处理器的寄存器中3.3.6 异常异常产生生指令指令ARM处理器有两条异常产生指令,软中断指令(SWI)和断点中断指令(BKPT)。1.SWI指令指令SWI 条件 24位立即数SWI指令用于产生SWI异常中断,实现从用户模式切换到管理模式,CPSR保存到管理模式下的SPSR中,执行转移到SWI向量,;其他模式下也可使用SWI指令,同样切换到管理模式。该指令不影响条件码标志。示例

43、:SWI 0 x02;软中断,调用操作系统编号为02 的系统例程2.BKPT指令指令BKPT 16位立即数BKPT指令产生软件断点中断,软件调试程序可以使用该中断。立即数会被ARM硬件忽视,但能被调试工具利用来得到有用的信息。示例:BKPT 0 xFF32 Thumb指令简介Part Four3.43.4为了兼容存储系统总线宽度为16位的应用系统,ARM体系结构中提供了16位Thumb指令集,它可以看作是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度,这对于嵌入式系统来说至关重要。Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令而不支持ARM

44、指令集。因此,Thumb指令只需要支持通用功能,必要时可以借助完善的ARM指令集。只要遵循一定的调用规则,Thumb子程序和ARM子程序可以互相调用。当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态;当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态。Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,并且指令的第二操作数受到限制;除了分支指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。Thumb指令集与ARM指令集的区别一般有如下4点:1.跳转指令跳转指令程

45、序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。2.数据处理指令数据处理指令数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。数据处理操作比ARM状态的更少。访问R8R15受到一定限制:除MOV和ADD指令访问寄存器R8R15外,其他数据处理指令总是更新CPSR中的ALU状态标志;访问寄存器R8R15的Thumb数据处理指令不能更新CPSR中的ALU状态标志。3.单寄存器加载和存储指令单寄存器加载和存储指令在Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0R7。4.多寄

46、存器加载和多寄存器存储指令多寄存器加载和多寄存器存储指令LDM和STM指令可以将任何范围为R0R7的寄存器子集加载或存储。PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈。除R0R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序计数器PC。ARM汇编语言程序简介Part Five3.53.53.5.1 伪操作操作ARM汇编语言程序是由机器指令、伪指令和伪操作组成的。伪操作是ARM汇编语言程序里的一些特殊的指令助记符,和指令系统中的助记符不同,这些助记符没有相应的操作码。伪操作主要是为完成汇编程序做一些准备工作,在源程序汇编过程中起作用,一旦汇编完成,伪操作的

47、使命就完成。宏是一段独立的程序代码,通过伪操作定义,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序校对每个宏调用进行展开,用宏定义代替源程序中的宏指令。1.符号定义伪操作符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值及定义寄存器名称等。常用伪操作有:GBLA、GBLL和GBLS:定义全局变量。LCLA、LCLL和LCLS:定义局部变量。SETA、SETL和SETS:为变量赋值。RLIST:为通用寄存器列表定义名称。CN:为协处理器的寄存器定义名称。CP:为协处理器定义名称。DN和SN:为VFP的寄存器定义名称。FN:为FPA的浮点寄存器定义名称。2.数据定义伪操

48、作数据定义伪操作数据定义伪操作用于数据表定义、文字池定义、数据空间分配等。常用伪操作有:LTORG:声明一个数据缓冲池的开始。MAP:定义一个结构化的内存表的首地址。FIELD:定义结构化内存表的一个数据域SPACE:分配一块内存空间,并用0初始化。DCB:分配一段字节的内存单元,并用指定的数据初始化。DCD和DCDU:分配一段字的内存单元,并用指定的数据初始化。DCFD和DCFDU:分配一段双字的内存单元,并用双精度的浮点数据初始化。DCFS和DCFSU:分配一段字的内存单元,并用单精度的浮点数据初始化。DCQ和DCQU:分配一段双字的内存单元,并用64位整型数据初始化。DCW和DCWU:分

49、配一段半字的内存单元,并用指定的数据初始化。3.汇编控制伪操作汇编控制伪操作汇编控制伪操作用于条件汇编、宏定义、重复汇编控制等,常用伪操作有:IF、ELSE和ENDIF:根据条件把一段源程序代码包括在汇编程序内或排除在程序之外。WHILE和WEND:根据条件重复汇编相同的源程序代码段。MACRO和MEND:MACRO标识宏定义的开始,MEND标识宏定义结束。用MACRO和MEND定义一段代码,称为宏定义体,在程序中可以通过宏指令多次调用该代码段。MEXIT:用于从宏中跳转出去。4.其它伪操作其它伪操作其它伪操作常用的有段定义伪操作、入口点设置伪操作、包含文件伪操作、标号导出或引入声明等:ALI

50、GN:边界对齐。AREA:段定义。CODE16和CODE32:指令集定义。END:汇编结束。ENTRY:程序入口。EQU:常量定义。EXPORT和GLORBAL:声明一个符号可以被其它文件引用。IMPORT和EXTERN:声明一个外部符号。GET和INCLUDE:包含文件。INCBIN::包含不被汇编的文件。RN:给特定的寄存器命名。ROUT:标记局部标号使用范围的界限。3.5.2 伪指令指令ARM中的伪指令并不是真正的ARM或Thumb指令,这些伪指令在汇编编译器对源程序进行汇编处理时被替换成对应ARM或Thumb指令(序列)。常用的伪指令有:ADR:小范围的地址读取伪指令,该指令将基于PC

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 网络技术 > 前端技术

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


客服QQ:2549714901微博号:文库网官方知乎号:文库网

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

文库网官网©版权所有2025营业执照举报