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

上传人:牧羊曲112 文档编号:6501685 上传时间:2023-11-07 格式:PPT 页数:140 大小:697KB
返回 下载 相关 举报
ARM嵌入式系统原理及应用教程.ppt_第1页
第1页 / 共140页
ARM嵌入式系统原理及应用教程.ppt_第2页
第2页 / 共140页
ARM嵌入式系统原理及应用教程.ppt_第3页
第3页 / 共140页
ARM嵌入式系统原理及应用教程.ppt_第4页
第4页 / 共140页
ARM嵌入式系统原理及应用教程.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

《ARM嵌入式系统原理及应用教程.ppt》由会员分享,可在线阅读,更多相关《ARM嵌入式系统原理及应用教程.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且寄存器列表中包

26、含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。,3.2.3 ARM 存储器访问指令,指令示例:STMFD R13!,R0,R4-R12,LR;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。LDMFD R13!,R0,R4-R12,PC;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。在通用存储区,数据存储的方式和堆栈区相近。下面通过存储R1、R2和R3 3个寄存器的4种后缀指令执行前后的存储情况如图3-7所示。,3.2.3 ARM 存储器访问指令,3交换指令(1)S

27、WP指令格式为:SWP条件 目的寄存器,源寄存器1,源寄存器2 SWP指令是数据字交换指令,用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。,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

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

29、指向的存储器中的字节数据与R1中的低8位数据交换。,3.2.4 ARM 数据处理类指令,数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。数据处理指令可分为3大类:数据传送指令算术逻辑运算指令比较指令,3.2.4 ARM 数据处理类指令,数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令是完成对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,不保存运算结果,只影响CPS

30、R中相应的条件标志位。,数据传送指令,1.数据传送指令MOV和MVN(1)MOV指令 格式为:MOV条件S 目的寄存器,源操作数 MOV指令可完成在寄存器之间或寄存器与第2操作数之间进行数据传送。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。,数据传送指令,指令示例:MOVR4,R5;将寄存器R5的内容传送到寄存器R4MOVPC,R14;将寄存器R14的内容传送到PC,常用于子程序返回MOVNE R4,R5,LSL2;当Z=0时,将寄存器R5的内容逻辑左移2位后传送到R4,数据传送指令,(2)MVN指令格式为:MVN条件S 目的寄存器,

31、源操作数 MVN指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。,数据传送指令,(2)MVN指令格式为:MVN条件S 目的寄存器,源操作数 MVN指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。,数据传送

32、指令,指令示例:MVN R0,0;将立即数0取反传送到寄存器R0中,完成后R0=-1 MVN R1,R2;将R2取反,结果存到R1,算术逻辑运算指令,2.算术逻辑运算指令(1)ADD指令格式为:ADD条件S 目的寄存器,操作数1,操作数2 ADD指令是加法指令,用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数.,算术逻辑运算指令,指令示例:ADDS R0,R3,R4;R0=R3+R4,设置标志位ADDC R0,R3,#10;R0=R3+10ADD R0,R2,R3,LSL#2;R0=R2+R34,算术逻辑运算指令,

33、(2)ADC指令格式为:ADC条件S 目的寄存器,操作数1,操作数2ADC指令是带进位加法指令,用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,以下指令序列实现64位二进制数的加法:R2、R1=R2、R1+R4、R3ADDS R1,R1,R3;R1=R1+R3ADC R2,R2,R4;R2=R2+R4+C,算术逻辑运算指令,(3)SUB指令格式为:SUB条件S 目的

34、寄存器,操作数1,操作数2 SUB指令是减法指令,用于把操作数1减去操作数2,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,指令示例:SUBS R0,R3,R4;R0=R3 R4,设置标志位SUB R0,R1,#0 x10;R0=R1-0 x 10SUB R0,R2,R3,LSL#1;R0=R2-(R3 1),算术逻辑运算指令,(4)SBC指令格式为:SBC条件S 目的寄存器,操作数1,操作数2 SBC指令是带借位减法指令,用于把操作数1减去操作数2,再减去CPSR中的C

35、条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。指令示例:SBCR2,R2,R4;R2=R2 R4-C,算术逻辑运算指令,(5)RSB指令格式为:RSB条件S 目的寄存器,操作数1,操作数2 RSB指令是反减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或

36、一个立即数。,算术逻辑运算指令,指令示例:RSB R0,R1,R2;R0=R2 R1RSB R0,R1,#0 x10;R0=0 x10 R1RSB R0,R2,R3,LSL#1;R0=R32-R2,算术逻辑运算指令,(6)RSC指令格式为:RSC条件S 目的寄存器,操作数1,操作数2RSC指令是带借位反减法指令,用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,指令示例:RSCS R6,R4,R3,LSL#1;

37、R6=R32 R4+C-1同时刷新标志位,算术逻辑运算指令,(7)AND指令格式为:AND条件S 目的寄存器,操作数1,操作数2AND指令是逻辑与指令,用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。该指令常用于屏蔽操作数1的某些位。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,指令示例:AND R5,R6,R8;R5=R6R8AND R2,R2,3;该指令保持R2的0、1位,其余位清零。,算术逻辑运算指令,(8)ORR指令 格式为:ORR条件S 目的寄存器,操作数1,操作数2 ORR指令是逻辑或指令,用于在两个操作数上进行逻

38、辑或运算,并把结果放置到目的寄存器中。该指令常用于设置操作数1的某些位。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,指令示例:ORR R5,R6,R8;R5=R6R8ORR R2,R2,3;该指令设置R2的0、1位,其余位保持不变。,算术逻辑运算指令,(9)EOR指令格式为:EOR条件S 目的寄存器,操作数1,操作数2 EOR指令是逻辑异或指令,用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。该指令常用于反转操作数1的某些位。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令

39、,指令示例:EOR R5,R6,R8;R5=R6+R8EOR R2,R2,3;该指令反转R2的0、1位,其余位保持不变。,算术逻辑运算指令,(10)BIC指令格式为:BIC条件S 目的寄存器,操作数1,操作数2 BIC指令是位清除指令,用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器。操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。,算术逻辑运算指令,指令示例:BIC R0,R2,2_0011;清除 R2 中的位 0、1,其余的位保持不变。BICS R0,R2,0 x80000000;清除 R2 中的位 31,其余的位保持不变,刷新标志位。,算术逻辑运算指令

40、,(11)MUL指令格式为:MUL条件S目的寄存器,操作数1,操作数2 MUL指令是乘法指令,完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。其中,操作数1和操作数2均为32位的有符号数或无符号数。,算术逻辑运算指令,指令示例:MULR0,R4,R5;R0=R4 R5MULS R0,R4,R5;R0=R4 R5,同时设置条件标志位,算术逻辑运算指令,(12)MLA指令格式为:MLA条件S 目的寄存器,操作数1,操作数2,操作数3 MLA指令是乘加指令,完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把

41、结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。其中,操作数1和操作数2均为32位的有符号数或无符号数。,算术逻辑运算指令,指令示例:MLAR0,R1,R2,R3;R0=R1 R2+R3MLASR0,R1,R2,R3;R0=R1 R2+R3,同时设置CPSR中的相关条件标志位,算术逻辑运算指令,(13)SMULL指令格式为:SMULL条件S 目的寄存器Low,目的寄存器低High,操作数1,操作数2 SMULL指令是带符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中

42、,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。,算术逻辑运算指令,指令示例:SMULL R1,R2,R3,R4;R1=(R3 R4)的低32位;R2=(R3 R4)的高32位,算术逻辑运算指令,(14)SMLAL指令 格式为:SMLAL条件S 目的寄存器Low,目的寄存器低High,操作数1,操作数2 SMLAL指令是长乘加指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置C

43、PSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。,算术逻辑运算指令,对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。指令示例:SMLALR1,R2,R3,R4;R1=(R3 R4)的低32位 R1;R2=(R3 R4)的高32位 R2,算术逻辑运算指令,(15)UMULL指令 格式为:UMULL条件S 目的寄存器Low,目的寄存器低High,操作数1,操作数2 UMULL指令是无符号乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的

44、低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。,算术逻辑运算指令,指令示例:UMULL R1,R2,R3,R4;R1=(R3 R4)的低32位;R2=(R3 R4)的高32位,算术逻辑运算指令,(16)UMLAL指令格式为:UMLAL条件S目的寄存器Low,目的寄存器低High,操作数1,操作数2 UMLAL指令是无符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器

45、High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。,算术逻辑运算指令,对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。指令示例:UMLAL R1,R2,R3,R4;R1=(R3 R4)的低32位 R1;R2=(R3 R4)的高32位 R2,比较和测试指令,(1)CMP指令格式为:CMP条件 操作数1,操作数2 CMP指令是比较指令,该指令是做一次减法运算,但不存储结

46、果,只是刷新条件标志位,根据条件标志位判断操作数的大小。对条件位的影响是:结果为正数则N=0,结果为负数则N=1;结果为0则Z=1,结果不为0则Z=0;如果产生借位则C=0,没有借位则C=1;结果是符号溢出则V=1,否则V=0。,比较和测试指令,指令示例:CMPR1,#0 x30;比较R1和0 x30ADDCS R5,R5,#0 x20;如果C=1,则R5=R5+0 x20ADDCC R5,R5,#0 x10;如果C=0,则R5=R5+0 x10,比较和测试指令,(2)CMN指令格式为:CMN条件 操作数1,操作数2 CMN指令是比较非指令,也是做一次减法运算,用第1操作数减去第2操作数的非值

47、,结果不保存,只是刷新条件标志位,对条件标志位的影响和比较指令CMP相同。,比较和测试指令,指令示例:CMNR1,#0 x00;比较R1和0 xFFFFFFFFADDCS R5,R5,#0 x20;如果C=1,则R5=R5+0 x20ADDCC R5,R5,#0 x10;如果C=0,则R5=R5+0 x10,比较和测试指令,(3)TST指令格式为:TST条件 操作数1,操作数2 TST指令是位测试指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。指令示例:TSTR2,0 x01;将寄存器R1的值与立即数 0 x01按位与,并根

48、据结果设置CPSR的标志位,用来判断R2中最低位是否为0。,比较和测试指令,(4)TEQ指令格式为:TEQ条件 操作数1,操作数2 TEQ指令是测试指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。指令示例:TEQR1,#0 x10;将寄存器R1的值与0 x10按位异或,并根据结果设置;CPSR的标志位,若Z=1则表示R1的内容是0 x10,3.2.5 ARM 分支指令,在ARM指令集中,没有专门的子程序调用指令,把分支和子程序调用看成是同一种操作,分支指令用于实现程序流程的跳转

49、,在ARM程序中可以通过使用专门的跳转指令或是直接向程序计数器PC写入跳转地址值的方法来实现。通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOVLR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。,3.2.5 ARM 分支指令,ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下3条指令:1.B指令2.BL指令3.BX指令,3.2.5 ARM 分支指令,1.B指令 格式为:B条件 目标地址 B指令是分支指令,是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器

50、将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。,3.2.5 ARM 分支指令,指令实例:BLabel;程序无条件跳转到标号Label处执行CMPR1,0;当CPSR寄存器中的Z条件码置位;时,程序跳转到标号Label处执行BEQLabel,3.2.5 ARM 分支指令,2.BL指令格式为:BL条件 目标地址 BL指令是分支和链接指令,一种可以存储分支处地址的分支指令,可用于子程序调用。具体实现过程是跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号