第3章-ARM嵌入式处理器指令系统-.ppt

上传人:本田雅阁 文档编号:3083917 上传时间:2019-07-05 格式:PPT 页数:75 大小:1.28MB
返回 下载 相关 举报
第3章-ARM嵌入式处理器指令系统-.ppt_第1页
第1页 / 共75页
第3章-ARM嵌入式处理器指令系统-.ppt_第2页
第2页 / 共75页
第3章-ARM嵌入式处理器指令系统-.ppt_第3页
第3页 / 共75页
第3章-ARM嵌入式处理器指令系统-.ppt_第4页
第4页 / 共75页
第3章-ARM嵌入式处理器指令系统-.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《第3章-ARM嵌入式处理器指令系统-.ppt》由会员分享,可在线阅读,更多相关《第3章-ARM嵌入式处理器指令系统-.ppt(75页珍藏版)》请在三一文库上搜索。

1、1,第3章 ARM嵌入式处理器指令系统,3.1 ARM指令分类及指令格式 3.2 ARM指令的寻址方式 3.3 ARM指令集 3.4 Thumb指令集 习题,2,本章以流行ARM处理器为例介绍嵌入式微处理器的指令系统,包括 ARM处理器的指令格式分类、指令格式、寻址方式、32位的ARM指令集和16位的Thumb指令集。,31 ARM指令分类及指令格式,3,31l ARM指令分类,4,5,6,7,8,1. 立即数符号“#“ “#”符号表示立即数,该符号后的数据可以是二进制数,也可以是十进制数或十六进制数,如果操作数为十进制数,则前面除了#外,没有其他符号。 2. 二进制符号“%“ “%“符号后面

2、的数字表示二进制数,如%10010101表示二进制数10010101,即十进制数149。 3. 二进制符号“2_“ “2_“符号是二进制前缀的另一种形式,如2_10010101也表示二进制数10010101,与%10010101等效。,313 ARM指令中的操作数符号,9,4. 十六进制符号“0x“ “0x“后面的数据表示十六进制数,如0xFFFF,表示十六进制数FFFF,即十进制数65535。 5 更新基址寄存器符号“!“ “!“符号表示指令在完成操作后应将最后的地址写入基址寄存器。 6. 复制SPSR到CPSR符号“” “” 符号通常在批量数据存储指令中作为后缀放在寄存器之后。当其前面的寄

3、存器不包含PC时,该符号表示所用的寄存器是用户模式的寄存器;当其前面的寄存器包含PC时该符号指示将SPSR寄存器的值复制到CPSR寄存器中。 7. 指示寄存器列表范围符号“-” “-“符号用于在有些指令中表示多个连续寄存器,即含义“从到“。如RO-R7表 示,R1,R2,R3,R4,R5,R6,R7这8个寄存器。,10,ARM微处理器内嵌的桶型移位器(Barrel Shifter),支持数据的各种移位操作,但在 ARM指令集中没有单独的指令供移位操作使用。移位操作在汇编语言中表示为指令中的选项,只能作为指令格式中的一个字段。如当数据处理指令的第2个操作数为寄存器时,就可以加入移位操作选项对它进

4、行各种移位操作。 移位操作包括逻辑左移(LSL)、算术左移(ASL)、逻辑右移(LSR)、算术右移(ASR)、循环右移(ROR)及带扩展的循环右移(RRX)共6种类型。,314 ARM指令中的移位操作,11,1逻辑左移操作 格式:通用寄存器,LSL 立即数 用途:对通用寄存器中的内容进行逻辑左移操作,按操作数所指定的数量向左移位,右端(低位)用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。 例如:MOV R0, Rl , LSL# 2 ;将Rl中的内容算术左移2位后传送到R0中 2算术左移操作 格式:通用寄存器,ASL 操作数 用途:AS

5、L表示对通用寄存器中的内容进行算术左移操作,按操作数所指定的数量向左移位,右端(低位)用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。 LSL与ASL效果相同,可以互换。 例如:MOV R0,R1,ASL#2 ;将R1中的内容算术左移2位后传送到R0中,12,3 逻辑右移操作 格式:通用寄存器,LSR 操作数 用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所指定的数量向右移位,左端(高位)用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。 例如:MOV R0, R1, LSR#

6、2;将R1中的内容逻辑右移2位后传送到R0中,左端用零来填充 4算术右移操作 格式:通用寄存器,ASR 操作数 用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所指定的数量向右移位,左端(高位)用第31位的值(亦即符号位)来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。 例如:MOV R0, R1, ASR#2 ;将R1中的内容算术右移2位后传送到R0中,左端用第31 位的值来填充,13,5循环右移操作 格式:通用寄存器,ROR 操作数 用途:对通用寄存器中的内容进行循环右移操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充

7、。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。当进行32位的循环右移操作时,通用寄存器中的值不改变。 例如:MOV R0, R1 , ROR#2 ;将R1中的内容循环右移2位后传送到R0中 6带扩展的循环右移操作 格式:通用寄存器,RRX 操作数 用途:对通用寄存器中的内容进行带扩展的循环右移操作,按操作数所指定 的数量向右循环移位,左端用进位标志位来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是03l之间的整数)。 例如:MOV R0, R1, RRX#2 ;将R1中的内容进行带扩展的循环右移2位后传送到R0中,

8、14,1立即寻址 立即寻址也叫立即数寻址,是一种特殊的寻址方式。采用立即寻址方式时,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。采用立即寻址方式的指令示例如下: MOV R0, # 0xl0FF66ED ADC R0 , R0 ,# 1000 ; R0R0 + 1000 + C 在以上2条指令中,第2个源操作数即为立即数,32 ARM指令的寻址方式,所谓寻址方式,就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持的常见寻址方式有立即寻址、寄存器寻址、寄存器间接寻址、基址加变址寻址、相对寻址、堆栈寻址及多寄存器寻址7种。,321 A

9、RM指令的寻址方式,15,2寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常 采用的一种方式,也是一种执行效率较高的寻址方式。采用寄存器寻址方式的指令示例如下: ADD R0, R 1 , R2 ; R0Rl + R2 3寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器 中,用于间接寻址的寄存器必须用方括号“ “括起来。采用寄存器间接寻址方式的指令示例如下: ADD R0,Rl ,R2 ;R0Rl + R2 LDR R0,R1 ;R0Rl STR R0, Rl ; RlR0,16,4基址加变址寻址 基址加变址寻址就

10、是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。基址加变址寻址方式常用于访问某地址附近的地址单元。采用基址加变址寻址方式的指令有如下几种常见形式。 (1)LDR R0, R1, # 4 ;R0Rl + 4 (2)LDR R0, R1, # 4! ; R0Rl + 4、RlRl + 4 该指令表示以寄存器Rl的值加上4作为操作数的有效地址,将取得的操作数存入寄存器R0中,然后再将寄存器Rl的值增加4。符号“!“表示指令在完成数据传送后应该更新基址寄存器。 (3)LD R0,R1,#4 ;R0Rl 、RlRl + 4 该指令表示以寄存器Rl

11、的值作为操作数的有效地址,将取得的操作数存入寄存器R0中,然后再将寄存器Rl的值增加4。 (4)LDR R0,Rl ,R2 ;R0Rl + R2,17,5相对寻址 相对寻址以程序计数器(PC)的当前值为基地址,以指令中的地址标号为偏移量,将两者相加之后的值作为操作数的有效地址。以下程序段的作用是完成子程序的调用和返回,其中跳转指令BL即采用了相对寻址方式。 BL Subroutine_ A ;跳转到子程序Subroutine_A处执行 Subroutine A MOV PC, LR ;从子程序返回 假设程序段中BL指令所在地址(PC值)为0x2100000, Subroutine_A对应偏移量

12、为0x0100,则转移到Subroutine_A处对应的地址为0x2100100,此地址在汇编时自动形成。,18,6堆找寻址 堆栈是一种数据结构,按先进后出(First In Last Out, FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆核指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack) ,而当堆栈指针指向下一个将要放人数据的空位置时,称为空堆栈(Empty Stack)。 根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack) ,当堆栈由低地址向高地址生成

13、时,称为递增堆栈,当由高地址向低地址生成时,称为递减堆栈。 因此堆栈工作方式有4种类型: (1)满递增堆栈;(2)满递减堆栈;(3)空递增堆栈: (4)空递减堆栈。,19,7多寄存器寻址 多寄存器寻址又称块拷贝寻址,采用多寄存器寻址方式可以用一条指令完成传送最多 16个通用寄存器的值。多寄存器寻址是多寄存器传送指令(LDM/STM)的寻址方式, LDM/STM指令可以将存储器中的一个数据块加载到多个寄存器中,也可以将多个寄存器中的内容存储到存储器中。寻址操作中的寄存器可以是R0R15这16个寄存器的子集或全集。LDM/STM指令依据后缀名的不同,其寻址方式有很大区别。采用多寄存器寻址方式的指令

14、示例如下: LDMIA R0, R1,R2,R3,R4 ;R1R0, R2R0十4 ;R3R0 + 8,R4R0十12 该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到RlR4。,20,【例31】 欲将数据从源数据区snum复制到目标数据区dnum,数据的个数为num,复制时以8个字为单位进行,对于最后所剩不足8个字的数据,以字为单位进行复制。用ARM汇编语言设计实现该功能的程序,并分析该ARM程序的详细执行过程和执行结果。 用ARM汇编语言设计数据块复制程序的设计思想如下:先将源数据区的起始地址、目标数据区的起始地址以及数据个数赋给选定

15、的寄存器R0、R1、R2,再根据每次批量/单个复制数据的个数R3,确定用于数据复制的中间寄存器R4-R11,之后先将源数据区的若干个数据批量装载到中间寄存器中,再将中间寄存器的数据批量存储到目的数据存储区,随后进行数据是否复制完毕的判断,若未复制完毕,修改有关操作数据地址,并重复前面的数据复制操作,否者,终止操作,程序结束。,322 ARM指令的寻址方式应用举例,21,表3.3 数据块复制程序执行前的有关数据和执行后的有关结果列表,22,23,24,ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,处理结果仍要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指

16、令来完成。本节将对ARM指令集的共6大类指令进行详细的描述,并给出相应例子。 331 数据处理指令 数据处理类指令可分为数据传送指令、算术逻辑运算指令及比较指令等。其中数据传送指令用于在寄存器和存储器之间进行数据的双向传输;算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位;比较指令不保存运算结果,只更新CPSR中相应的条件标志位。 数据处理类指令见表34。,33 ARM指令集,25,26,1数据传送指令 1)数据传送指令 格式:MOV条件 S目的寄存器,操作数 用途:用于将操作数传送到目的寄存器中。其中S决定指令的操作是否

17、影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。例如: MOV Rl,R0 ;将寄存器R0的值传送到寄存器Rl MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV Rl ,R0, LSL# 3 ;将寄存器R0的值左移3位后传送到Rl 2)数据取反传送指令 格式:MVN条件S 目的寄存器,操作数 用途:用于将操作数按位取反后传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。例如: MVN R0, # 0 ;,27,2比较指令 1)比较指令 格式:CMP条件) 操作数1,操

18、作数2 用途:用于把2个操作数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等) ,如当操作数1大于操作操作数2,则此后的有GT后缀的指令将可以执行。 例如:CMP Rl,R0 ;将Rl的值与R0的值相减,并根据结果设置 CPSR的标志位 2)反值比较指令 格式:CMN条件) 操作数1,操作数2 用途:用于2个操作数分别取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。 例如:CMN Rl,# 100 ;将Rl的值与立即数100

19、相加,并根据结果设置CPSR 的标志位,28,3 测试指令 1)位测试指令 格式:TST条件 操作数1,操作数2 用途:用于把2个操作数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用来检测是否设置了特定的位,一般操作数1是要测试的数据,而操作数2是一个位掩码。 例如:TST Rl, # % 1 ;将Rl的值与二进制数1按位进行与运算,并根据结果设置CPSR的标志位 TST Rl, # 0xFE ;将Rl的值与十六进制数FE按位进行与运算,并据结果设置CPSR的标志位。 2)相等测试指令 格式:TEQ条件 操作数1,操作数2 用途:用于把2个操作数进行按位的异或运算,

20、并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。 例如:TEQ Rl,R2 ;将Rl的值与R2的值按位异或,并据结果设置CPSR的标志位,29,4 加法指令 1)加法指令 格式:ADD条件 S 目的寄存器,操作数1,操作数2 用途: 两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或立即数。 例如:ADD R0,Rl, # 256 ; R0=Rl + 256 ADD R0,R2,R3,LSL# 1 ; R0= R2 + (R3 1) 2)带进位加法指令 格式:ADC条件S 目的寄存器,操作数

21、1,操作数2 用途:两个操作数相加后,再加上CPSR中条件标志位的值,并将结果存放到目的寄存器中。由于该指令使用了进位标志位,因此可以做大于32位的数的加法。这时应注意不要忘记设置S后缀来更改进位标志。操作数要求同上。例如两个128位数的加法如下: ADDS R0 ,R4, R8 ;加低端的字 ADCS Rl,R5,R9 ;加第二个字,带进位 ADCS R2 , R6, Rl 0 ;加第三个字,带进位 ADC R3, R7 , Rl1 ;加第四个字,带进位,30,5 减法指令 1)减法指令 格式:SUB条件 S 目的寄存器,操作数1,操作数2 用途:操作数1减去操作数2,并将结果存放到目的寄存

22、器中。操作数 1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。 例如:SUB R0,Rl ,R2 ; R0 = Rl - R2 SUB R0,Rl, # 256 ; R0=Rl - 256 SUB R0,R2,R3, LSL # 1 ; R0 = R2 - (R31) 2)带借位减法指令 格式:SBC条件S 目的寄存器,操作数1,操作数2 用途:操作数1减去操作数2,再减去CPSR中的条件标志位C的反码,并将结果存放到目的寄存器中。操作数要求同上。由于该指令使用进位标志来表示借位,因此可以做大32位的数的减法,这时应注意不要忘

23、记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。 例如:SBCS R0,Rl ,R2 ; R0 = Rl - R2 - ! C,31,3)反向减法指令 格式:RSB条件S 目的寄存器,操作数1,操作数2 用途:用操作数2减去操作数1,并将结果存放到目的寄存器中。操作数的要求同上。该指令可用于有符号数或无符号数的减法运算。 例如:RSB R0,Rl ,R2 ; R0= R2 - Rl RSB R0,Rl, #256 ; R0=256 - Rl RSB R0,R2,R3,LSL# 1 ; R0 = (R3 1) -R2 4)带借位反向减法指令 格式:RSC条件S 目的寄存器,

24、操作数1,操作数2 用途:操作数2减去操作数1,再减去CPSR中的条件标志位C的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。由于该指令使用进位标志来表示借位,因此可以做大于32位的数的减法,这时应注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。 例如:RSC R0,Rl,R2 ;R0=R2 Rl!C,32,6 逻辑运算指令 1)逻辑与指令 格式:AND条件 S 目的寄存器,操作数1,操作数2 用途:对两个操作数进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一

25、个寄存器,被移位的寄存器,或一个立即数。 该指令常用于屏蔽操作数1的某些位。 例如:AND R0 , R0 , # 3 ;该指令保持R0的0、1位,其余位清零 2)逻辑或指令 格式:ORR条件 S 目的寄存器,操作数1,操作数2 用途:对两个操作数进行逻辑或运算,并把结果放置到目的寄存器中。操作数要求同上。 该指令常用于设置操作数1的某些位。 例如:ORR R0 , R0 , # 3 ;该指令设置R0的0 、1位,其余位保持不变,33,3)逻辑异或指令 格式:EOR条件S 目的寄存器,操作数1,操作数2 用途:对两个操作数进行逻辑异或运算,并把结果放置到目的寄存器中。操作数要求同上。该指令常用

26、于反转操作数1的某些位。 例如:EOR R0 , R0 , # 3 ;该指令反转R0的0、1位,其余位保持不变 4)位清除指令 格式:BIC条件S 目的寄存器,操作数1,操作数2 用途:用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数要求同上。操作数2 为32位的掩码,如果在掩码中设置了某一位,则清除操作数1中相应的位,其余保持不变。 例如:BIC R0,R0,#%1011 ;该指令清除R0中的位0 、1和3,其余的位保持不变,34,7乘法指令与乘加指令 ARM微处理器支持的乘法指令与乘加指令共有6条,按运算结果可分为32位和64位2类,与前面的数据处理指令不同,乘法指令与乘加指令

27、中的所有操作数、目的寄存器必须为通用寄存器,不能用立即数或被移位的寄存器作为操作数,同时,目的寄存器和操作数1必须是不同的寄存器。 1)32位乘法指令 格式:MUL条件S 目的寄存器,操作数1,操作数2 用途:操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。 例如:MUL R0,Rl,R2 ;R0= RlR2 MULS R0, Rl,R2 ;R0 = RlR2,同时设置CPSR中的相关条件标志位,35,2) 32位乘加指令 格式:MLA条件S 目的寄存器,操作数1,操作数2,操作数

28、3 用途:首先操作数1与操作数2进行乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。 例如:MLA R0,Rl,R2,R3 ;R0 = RlR2 + R3 MLAS R0,Rl,R2,R3 ;R0=RlR2 + R3,同时设置CPSR中的相关条件标志位,36,3)64位乘法指令 格式:SMULL / UMULL 条件 S 目的寄存器Low,目的寄存器High,操作数1,操作数2 用途:操作数1与操作数2进行乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到

29、目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,当操作符为SMULL,表示为64位有符号数乘法运算,操作数1和操作数2均为32位的有符号数;当操作符为UMULL时,表示为64位无符号数乘法运算,操作数1和操作数2均为32位的无符号数。例如: SMULL R0,Rl,R2,R3 ;R0=(R2R3)的低32位,Rl=(R2R3)的高32位 UMULL R0,Rl,R2,R3 ;R0 = (R2 R3)的低32位;Rl=(R2 R3)的高32位,37,4)64位乘加指令 格式:SMLAL / UMLAL 条件S 目的寄存器Low,目的寄存器High,操作数1,操作数

30、2 用途:操作数1与操作数2进行乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器 High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,当操作符为SMLAL时,表示为64位有符号数乘加运算,操作数1和操作数2均为32位的有符号数;当操作符为/UMLAL时,表示为64位无符号数乘加运算,操作数1和操作数2均为32位的无符号数。 对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位;对于目的寄存器High,在指令执行前存放64位加数的高32位,指

31、令执行后存放结果的高32位。 例如:SMLAL R0,Rl,R2,R3 ;R0 = (R2 x R3)的低32位+ R0,Rl = (R2 x R3)的高32位+ Rl UMLAL R0,Rl,R2,R3 ;R0 = (R2R3)的低32位+ R0 ,Rl = (R2 x R3)的高32位+ Rl,38,ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,包括程序状态寄存器到通用寄存器的数据传送指令(MRS)和通用寄存器到程序状态寄存器的数据传送指令(MSR)两条。 1 程序状态寄存器到通用寄存器的数据传送指令 格式:MRS条件 通用寄存器,程序状态寄存器(

32、CPSR或SPSR) 用途:将程序状态寄存器的内容传送到通用寄存器中。当需要改变程序 状态寄存器的内容时,可用MRS指令将程序状态寄存器的内容读入通用寄存器,修改后再 写回程序状态寄存器;当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用 MRS指令读出程序状态寄存器的值,然后保存。 例如:MRS R0, CPSR ;传送CPSR的内容到R0 MRS R0, SPSR ;传送SPSR的内容到R0,332 程序状态寄存器访问指令,39,2 通用寄存器到程序状态寄存器的数据传送指令 格式:MSR条件 程序状态寄存器(CPSR或SPSR)_ ,操作数 用途:将操作数的内容传送到程序状态寄存

33、器的特定域中,操作数可以为通用寄存器或立即数。选项用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域: 位(3124)为条件标志位域,用f表示; 位(2316)为状态位域,用s表示; 位(158)为扩展位域,用x表示; 位(70)为控制位域,用c表示。MSR指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。 例如:MSR CPSR,R0 ;传送R0的内容到CPSR MSR SPSR,R0 ;传送R0的内容到SPSR MSR CPSR _c, R0 ;传送R0的内容到SPSR,但仅修改CPSR中的控制位域,40,程序分支指令用于实现

34、程序流程的跳转,在ARM程序中可以使用专门的跳转指令,也可以通过直接向程序计数器PC写入跳转地址值(这在基于80X86的系统中是不可以的)的方法 实现程序流程的转移。 通过向程序计数器(PC)写入跳转地址值,便可在4GB的地址空间中任意跳转;若在跳转之前结合使用MOV LR,PC等指令,便可保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。 ARM指令集中的程序分支指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括转移指令B、带返回的转移指令BL、带返回且带状态切换的转移指令(BLX)及带状态切换的转移指令(BX)4条。,333 程序程序分支指令,41,1转移

35、指令 格式:B条件 目标地址 用途:立即跳转到给定的目标地址,从那里继续执行。如B Label表示程序元条件跳转到标号Label处执行。 注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算。它是24位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26位(前后32MB的地址空间)。B指令是最简单的跳转指令。 例如:CMP R1, # 0 ;将寄存器R1的值减去立即数0,并根据结果设置CSPR的标志位。 BEQ Label ;带条件等于EQ的转移,即当CPSR寄存器中的标志位Z 置位时,程序跳转到标号Label处执行,42,2 带状态切换

36、的转移指令 格式:BX条件 用途:跳转到指令中所指定的由寄存器Rn同0xFFFFFFFE进行与运算后的结果指示的目标地址(即Rn中的最低位并不作为目标地址,而是作为状态切换位) ,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。如果Rn中的最低位为1,则指令将CPSR的T标志置为1,且将目标地址的代码解释为Thumb(状态切换到Thumb指令集)。 例如: MOV R6,# 0x12000001 BX R6 ;转换到地址为0x12000000处的Thumb指令,43,3 带返回的转移指令 格式:BL条件 目标地址 用途:BL是带返回的跳转指令,在跳转之前,会在寄存器R14中保存PC

37、的当前值。因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。 该指令是实现子程序调用的一个基本且常用的手段。 例如:BL Label;程序无条件跳转到标号Label处执行时,同时将当前PC值保存到R14中,44,4 带返回且带状态切换的转移指令 格式: BLX目标地址; BLXcond 用途:使用格式的BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将程序计数器(PC)的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序

38、的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。使用格式时不能带条件。使用格式 时可以有条件,但目标地址只能是寄存器,当Rn的最低位是1时,除了转移到指令中所指定的由寄存器Rn同0xFFFFFFE进行与运算后的结果指示的目标地址处外,还将自动切换到Thumb指令集。例如: BLX LabelA ;程序转移到LabelA处且切换成Thumb状态 BLXNE R5 ;程序转移到R5 & 0xFFFFFFFE处且切换到Thumb状态,45,ARM微处理器支持加载/存储指令,用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令

39、则完成相反的操作。 加载存储指令可分为:单一数据加载/存储指令、批量数据加载/存储指令以及数据交换指令3类。 1 单一数据加载/存储指令 单一数据加载/存储指令包括字数据加载指令(LDR)、字节数据加载指令(LDRB)、半字数据加载指令(LDRH)、字数据存储指令(STR)、字节数据存储指令(STRB)及半字数据存储指令(STRH)。,334 加载/存储指令,46,1)字数据加载指令 格式:LDR条件 目的寄存器, 用途:用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令是常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器(PC)作为目的寄存器时,指令从

40、存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样。 例如: LDR R0,R1 ;将存储器地址为Rl的字数据读入寄存器R0 LDR R0,Rl,R2 ;将存储器地址为Rl+R2的字数据读入寄存器R0 ;,47,LDR R0,R1,R2,LSL # 2 ;将存储器地址为Rl 的字数据读入寄存器 R0,并将新地址Rl + R24写入Rl LDR R0,Rl,# 8 ;将存储器地址为Rl+8的字数据读入寄存器R0 LDR R0,Rl,R2! ;将存储器地址为Rl+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1 LDR R0,Rl

41、,# 8! ;将存储器地址为Rl + 8的字数据读入寄存器R0,并将新地址Rl + 8写入Rl LDR R0,Rl,R2 ;将存储器地址为Rl的字数据读入寄存器R0,并将新地址Rl十R2写入Rl LDR R0,R1,R2,LSL # 2 ! ;将存储器地址为Rl + R24的字数据读入R0,并将新地址Rl + R24写入Rl,48,2)字节数据加载指令 格式:LDR条件B 目的寄存器, 用途:从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器(PC)作为目的寄存器时,指令从存储器

42、中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。 例如: LDRB R0,Rl ;将存储器地址为Rl的字节数据读入寄存器R0,并将R0的高24位清零 LDRB R0,Rl,# 8 ;将存储器地址为Rl + 8的字节数据读入寄存器R0,并将R0的高24位清零,49,3)半字数据加载指令 格式:LDR条件H 目的寄存器, 用途:从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器(PC)作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转

43、。例如: LDRH R0,Rl ;将存储器地址为Rl的半字数据读入寄存器R0,并将R0的高16清零 LDRH R0,Rl,# 8 ;将存储器地址为Rl8的半字数据读入寄存器R0,并将R0的高16位清零 LDRH R0,Rl,R2 ;将存储器地址为RlR2的半字数据读入寄存器R0,并将R0的高16位清零,50,4)字数据存储指令 格式:STR条件 源寄存器, 用途:从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。例如: STR R0,R1,#8 ;将R0中的字数据写入以Rl为地址的存储器中,并将新地址 Rl + 8写入Rl

44、 STR R0,R 1,# 8 ;将R0中的字数据写入以Rl + 8为地址的存储器中 5)字节数据存储指令 格式:STR条件B 源寄存器, 用途:将源寄存器中位于低8位的字节数据传送到存储器中。 例如:STRB R0,Rl ;将寄存器R0中的字节数据写入以Rl为地址的存储器中 STRB R0,Rl,# 8 ;将寄存器R0中的字节数据写入以Rl + 8为地址的存储器中,51,6)半字数据存储指令 格式:STR条件H 源寄存器, 用途:从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。例如: STRH R0,Rl ;将寄存器R0中的半字数据写入以Rl为地址的存储器

45、中 STRH R0,Rl,# 8 ;将寄存器R0中的半字数据写入以Rl + 8为地址的存储器中 2 批量数据加载/存储指令 ARM微处理器所支持批量数据加载/存储指令,可以一次在连续的存储器单元和多个存储器之间传送数据,批量加载指令用于将连续的存储器单元中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。 常用的加载/存储指令有批量数据加载指令(LDM)及批量数据存储指令(STM)。,52,1)批量数据加载指令 格式:LDM条件类型 基址寄存器!,寄存器列表 用途:将有基址寄存器所指示的一片连续寄存器到寄存器列表所指示的多个寄存器中,该指令的常见用途是将多个寄存器的内容出栈。 格式中,

46、类型为可选后缀,通常有以下几种情况: IA每次传送后的地址加1;IB每次传送前的地址加1;DA每次传送后的地址减1;DB每次传送前的地址减1;FD满递减堆栈;ED空递减堆栈;FA满递增堆栈;EA空递增堆栈。 !为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。 基址寄存器不允许为R15,寄存器列表可为R0R15的任意组合。,53,为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器。 例如:LDMFD R13!,R0,R4

47、-R12,PC ;将由R13指示的堆栈内容恢复到寄存器R0、R4R12及程序计数器(PC)中 2)批量数据存储指令 格式:STM条件类型 基址寄存器 ! ,寄存器列表 用途:将寄存器列表所指示的多个寄存器的数据存储到由基址寄存器所指示的连续存储器中,该指令的常见用途是将多个寄存器的内容入栈。其可选后缀的含义与LDM指令的相同。 例如:STMFD R13! ,R0,R4-R12,LR ;将寄存器R0,R4到R12以及LR的值存入由R13 指示的堆栈中,54,3 数据交换指令 ARM微处理器所支持数据交换指令能在存储器和寄存器之间交换数据。数据交换指令有字数据交换指令(SWP)和字节数据交换指令(

48、SWPB)两条。 1)字数据交换指令 格式:SWP条件 目的寄存器,源寄存器1,源寄存器2 用途:将源寄存器2所指向的存储器中的字数据传送到目的寄存器中, 同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。 例如:SWP R0,Rl,R2 ;将R2所指向的存储器中的字数据传送到R0,同时将Rl中的字数据传送到R2所指向的存储单元 SWP R0,R0,Rl ;该指令完成将Rl所指向的存储器中的字数据与R0中的字数据交换,55,2)字节数据交换指令 格式:SWP条件B 目的寄存器,源寄存器1,源寄存器2 用途:将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24位清零,同时将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,交换寄存器和存储器的内容。 例如:SWPB R0,Rl,R2 ; 将R2所指向的存储器中的字节数据传送到R0,R0的高24位清零,同时将Rl中的低8位数据传送到R2所指向的存储单元 SWPB R0,R0,R1 ;

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1