1、13.1 ARM指令分类及指令格式指令分类及指令格式 3.2 ARM指令的寻址方式指令的寻址方式 3.3 ARM指令集指令集 3.4 Thumb指令集指令集 习题习题23 45678 1.立即数符号立即数符号#“#”符号表示立即数,该符号后的数据可以是二进制数,符号表示立即数,该符号后的数据可以是二进制数,也可以是十进制数或十六进制数,如果操作数为十进制数,也可以是十进制数或十六进制数,如果操作数为十进制数,则前面除了则前面除了#外,没有其他符号。外,没有其他符号。2.二进制符号二进制符号%符号后面的数字表示二进制数,如符号后面的数字表示二进制数,如%10010101表表示二进制数示二进制数1
2、0010101,即十进制数,即十进制数149。3.二进制符号二进制符号2_ 2_符号是二进制前缀的另一种形式,如符号是二进制前缀的另一种形式,如2_10010101也表示二进制数也表示二进制数10010101,与,与%10010101等效。等效。313 ARM指令中的操作数符号指令中的操作数符号9 4.十六进制符号十六进制符号0 x 0 x后面的数据表示十六进制数,如后面的数据表示十六进制数,如0 xFFFF,表示十,表示十六进制数六进制数FFFF,即十进制数,即十进制数65535。5 更新基址寄存器符号更新基址寄存器符号!符号表示指令在完成操作后应将最后的地址写入基符号表示指令在完成操作后应
3、将最后的地址写入基址寄存器。址寄存器。6.复制复制SPSR到到CPSR符号符号“”“”符号通常在批量数据存储指令中作为后缀放在寄存符号通常在批量数据存储指令中作为后缀放在寄存器之后。当其前面的寄存器不包含器之后。当其前面的寄存器不包含PC时,该符号表示所用时,该符号表示所用的寄存器是用户模式的寄存器;当其前面的寄存器包含的寄存器是用户模式的寄存器;当其前面的寄存器包含PC时该符号指示将时该符号指示将SPSR寄存器的值复制到寄存器的值复制到CPSR寄存器中。寄存器中。7.指示寄存器列表范围符号指示寄存器列表范围符号“-”-符号用于在有些指令中表示多个连续寄存器,即含符号用于在有些指令中表示多个连
4、续寄存器,即含义义从从到到。如。如RO-R7表表 示,示,R1,R2,R3,R4,R5,R6,R7这这8个寄存器。个寄存器。10 ARM微处理器内嵌的桶型移位器微处理器内嵌的桶型移位器(Barrel Shifter),支持数,支持数据的各种移位操作,但在据的各种移位操作,但在 ARM指令集中没有单独的指令供移指令集中没有单独的指令供移位操作使用。移位操作在汇编语言中表示为指令中的选项,只位操作使用。移位操作在汇编语言中表示为指令中的选项,只能作为指令格式中的一个字段。如当数据处理指令的第能作为指令格式中的一个字段。如当数据处理指令的第2个操个操作数为寄存器时,就可以加入移位操作选项对它进行各种
5、移位作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。操作。移位操作包括逻辑左移移位操作包括逻辑左移(LSL)、算术左移、算术左移(ASL)、逻辑右移、逻辑右移(LSR)、算术右移、算术右移(ASR)、循环右移、循环右移(ROR)及带扩展的循环右移及带扩展的循环右移(RRX)共共6种类型。种类型。314 ARM指令中的移位操作指令中的移位操作11 1逻辑左移操作逻辑左移操作 格式:通用寄存器,格式:通用寄存器,LSL 立即数立即数 用途:对通用寄存器中的内容进行逻辑左移操作,按操作数用途:对通用寄存器中的内容进行逻辑左移操作,按操作数所指定的数量向左移位,右端所指定的数量向左移位,右
6、端(低位低位)用零来填充。其中,操作数可用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是立即数的取值范围是03l之间的整数之间的整数)。例如:例如:MOV R0,Rl,LSL#2 ;将;将Rl中的内容算术左移中的内容算术左移2位后传送到位后传送到R0中中 2算术左移操作算术左移操作 格式:通用寄存器,格式:通用寄存器,ASL 操作数操作数 用途:用途:ASL表示对通用寄存器中的内容进行算术左移操作,表示对通用寄存器中的内容进行算术左移操作,按操作数所指定的数量向左移位,右端按操作数所指定的数量向左移位,右端(低位低位)用
7、零来填充。其中,用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取立即数的取值范围是值范围是03l之间的整数之间的整数)。LSL与与ASL效果相同,可以互换。效果相同,可以互换。例如:例如:MOV R0,R1,ASL#2 ;将;将R1中的内容算术左移中的内容算术左移2位位后传送到后传送到R0中中12 3 逻辑右移操作逻辑右移操作 格式:通用寄存器,格式:通用寄存器,LSR 操作数操作数 用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所指定的数量向右移位,左端指定的
8、数量向右移位,左端(高位高位)用零来填充。其中,操作数可以用零来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数是通用寄存器中的数值,也可以是立即数(立即数的取值范围是立即数的取值范围是03l之间的整数之间的整数)。例如:例如:MOV R0,R1,LSR#2;将;将R1中的内容逻辑右移中的内容逻辑右移2位位后传送到后传送到R0中,左端用零来填充中,左端用零来填充 4算术右移操作算术右移操作 格式:通用寄存器,格式:通用寄存器,ASR 操作数操作数 用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所用途:对通用寄存器中的内容进行逻辑右移操作,按操作数所指定的数量向右移位,左端指定的
9、数量向右移位,左端(高位高位)用第用第31位的值(亦即符号位)来位的值(亦即符号位)来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范围是立即数的取值范围是03l之间的整数之间的整数)。例如:例如:MOV R0,R1,ASR#2;将;将R1中的内容算术右移中的内容算术右移2位位后传送到后传送到R0中,左端用第中,左端用第31 位的值来填充位的值来填充13 5循环右移操作循环右移操作 格式:通用寄存器,格式:通用寄存器,ROR 操作数操作数 用途:对通用寄存器中的内容进行循环右移操作,按操作数所用途:对通用寄存器
10、中的内容进行循环右移操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数作数可以是通用寄存器中的数值,也可以是立即数(立即数的取值范立即数的取值范围是围是03l之间的整数之间的整数)。当进行。当进行32位的循环右移操作时,通用寄存器位的循环右移操作时,通用寄存器中的值不改变。中的值不改变。例如:例如:MOV R0,R1,ROR#2;将;将R1中的内容循环右移中的内容循环右移2位位后传送到后传送到R0中中 6带扩展的循环右移操作带扩展的循环右移操作 格式:通用寄存器,格式:
11、通用寄存器,RRX 操作数操作数 用途:对通用寄存器中的内容进行带扩展的循环右移操作,按用途:对通用寄存器中的内容进行带扩展的循环右移操作,按操作数所指定操作数所指定 的数量向右循环移位,左端用进位标志位来填充。其的数量向右循环移位,左端用进位标志位来填充。其中,操作数可以是通用寄存器中的数值,也可以是立即数中,操作数可以是通用寄存器中的数值,也可以是立即数(立即数的立即数的取值范围是取值范围是03l之间的整数之间的整数)。例如:例如:MOV R0,R1,RRX#2 ;将;将R1中的内容进行带扩展中的内容进行带扩展的循环右移的循环右移2位后传送到位后传送到R0中中14 1立即寻址立即寻址 立即
12、寻址也叫立即数寻址,是一种特殊的寻址方式。采立即寻址也叫立即数寻址,是一种特殊的寻址方式。采用立即寻址方式时,操作数本身就在指令中给出,只要取出用立即寻址方式时,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。采用立指令也就取到了操作数,这个操作数被称为立即数。采用立即寻址方式的指令示例如下:即寻址方式的指令示例如下:MOV R0,#0 xl0FF66ED ADC R0,R0,#1000 ;R0R0+1000+C 在以上在以上2条指令中,第条指令中,第2个源操作数即为立即数个源操作数即为立即数32 ARM指令的寻址方式指令的寻址方式 所谓寻址方式,就是处理器根据
13、指令中给出的地址信息来寻所谓寻址方式,就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前找物理地址的方式。目前ARM指令系统支持的常见寻址方式有立指令系统支持的常见寻址方式有立即寻址、寄存器寻址、寄存器间接寻址、基址加变址寻址、相对即寻址、寄存器寻址、寄存器间接寻址、基址加变址寻址、相对寻址、堆栈寻址及多寄存器寻址寻址、堆栈寻址及多寄存器寻址7种。种。321 ARM指令的寻址方式指令的寻址方式15 2寄存器寻址寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常址方式是各类微处理器经常 采用的一种方式
14、,也是一种执行采用的一种方式,也是一种执行效率较高的寻址方式。采用寄存器寻址方式的指令示例如下:效率较高的寻址方式。采用寄存器寻址方式的指令示例如下:ADD R0,R 1,R2 ;R0Rl+R2 3寄存器间接寻址寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器而操作数本身存放在存储器 中,用于间接寻址的寄存器必须中,用于间接寻址的寄存器必须用方括号用方括号括起来。采用寄存器间接寻址方式的指令示例括起来。采用寄存器间接寻址方式的指令示例如下:如下:ADD R0,Rl,R2 ;R0Rl+R2 LDR R0,
15、R1 ;R0Rl STR R0,Rl ;RlR016 4基址加变址寻址基址加变址寻址 基址加变址寻址就是将寄存器基址加变址寻址就是将寄存器(该寄存器一般称作基址寄该寄存器一般称作基址寄存器存器)的内容与指令中给出的地址偏移量相加,从而得到一个操的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。基址加变址寻址方式常用于访问某地址附近作数的有效地址。基址加变址寻址方式常用于访问某地址附近的地址单元。采用基址加变址寻址方式的指令有如下几种常见的地址单元。采用基址加变址寻址方式的指令有如下几种常见形式。形式。(1)LDR R0,R1,#4;R0Rl+4(2)LDR R0,R1,#4!;
16、R0Rl+4、RlRl+4 该指令表示以寄存器该指令表示以寄存器Rl的值加上的值加上4作为操作数的有效地址,将取作为操作数的有效地址,将取得的操作数存入寄存器得的操作数存入寄存器R0中,然后再将寄存器中,然后再将寄存器Rl的值增加的值增加4。符号。符号!表示指令在完成数据传送后应该更新基址寄存器。表示指令在完成数据传送后应该更新基址寄存器。(3)LD R0,R1,#4 ;R0Rl、RlRl+4 该指令表示以寄存器该指令表示以寄存器Rl的值作为操作数的有效地址,将取得的的值作为操作数的有效地址,将取得的操作数存入寄存器操作数存入寄存器R0中,然后再将寄存器中,然后再将寄存器Rl的值增加的值增加4
17、。(4)LDR R0,Rl,R2 ;R0Rl+R2 17 5相对寻址相对寻址 相对寻址以程序计数器相对寻址以程序计数器(PC)的当前值为基地址,以指令的当前值为基地址,以指令中的地址标号为偏移量,将两者相加之后的值作为操作数的中的地址标号为偏移量,将两者相加之后的值作为操作数的有效地址。以下程序段的作用是完成子程序的调用和返回,有效地址。以下程序段的作用是完成子程序的调用和返回,其中跳转指令其中跳转指令BL即采用了相对寻址方式。即采用了相对寻址方式。BL Subroutine_ A ;跳转到子程序;跳转到子程序Subroutine_A处执行处执行 Subroutine A MOV PC,LR
18、;从子程序返回;从子程序返回 假设程序段中假设程序段中BL指令所在地址指令所在地址(PC值值)为为0 x2100000,Subroutine_A对应偏移量为对应偏移量为0 x0100,则转移到,则转移到Subroutine_A处对应的地址为处对应的地址为0 x2100100,此地址在汇编时自动形成。,此地址在汇编时自动形成。18 6堆找寻址堆找寻址 堆栈是一种数据结构,按先进后出堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆核指针总是指向栈顶。指示当前的
19、操作位置,堆核指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放人数据的空,而当堆栈指针指向下一个将要放人数据的空位置时,称为空堆栈位置时,称为空堆栈(Empty Stack)。根据堆栈的生成方式,又可以分为递增堆栈根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈和递减堆栈(Decending Stack),当堆栈,当堆栈由低地址向高地址生成时,称为递增堆栈,当由高地址向由低地址向高地址生成时,称为递增堆栈,当由高地址向低地址生成时,称为递减堆栈。
20、低地址生成时,称为递减堆栈。因此堆栈工作方式有因此堆栈工作方式有4种类型:种类型:(1)满递增堆栈;()满递增堆栈;(2)满递减堆栈;()满递减堆栈;(3)空递增堆栈:)空递增堆栈:(4)空递减堆栈。)空递减堆栈。19 7多寄存器寻址多寄存器寻址 多寄存器寻址又称块拷贝寻址,采用多寄存器寻址方多寄存器寻址又称块拷贝寻址,采用多寄存器寻址方式可以用一条指令完成传送最多式可以用一条指令完成传送最多 16个通用寄存器的值。多个通用寄存器的值。多寄存器寻址是多寄存器传送指令寄存器寻址是多寄存器传送指令(LDM/STM)的寻址方式,的寻址方式,LDM/STM指令可以将存储器中的一个数据块加载到多个指令可
21、以将存储器中的一个数据块加载到多个寄存器中,也可以将多个寄存器中的内容存储到存储器中。寄存器中,也可以将多个寄存器中的内容存储到存储器中。寻址操作中的寄存器可以是寻址操作中的寄存器可以是R0R15这这16个寄存器的子集或个寄存器的子集或全集。全集。LDM/STM指令依据后缀名的不同,其寻址方式有指令依据后缀名的不同,其寻址方式有很大区别。采用多寄存器寻址方式的指令示例如下:很大区别。采用多寄存器寻址方式的指令示例如下:LDMIA R0,R1,R2,R3,R4 ;R1R0,R2R0十十4;R3R0+8,R4R0十十12 该指令的后缀该指令的后缀IA表示在每次执行完加载表示在每次执行完加载/存储操
22、作后,存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送按字长度增加,因此,指令可将连续存储单元的值传送到到RlR4。20 【例例31】欲将数据从源数据区欲将数据从源数据区snum复制到目标数据区复制到目标数据区dnum,数据的个数为,数据的个数为num,复制时以,复制时以8个字为单位进行,对个字为单位进行,对于最后所剩不足于最后所剩不足8个字的数据,以字为单位进行复制。用个字的数据,以字为单位进行复制。用ARM汇编语言设计实现该功能的程序,并分析该汇编语言设计实现该功能的程序,并分析该ARM程序程序的详细执行过程和执行结果。的详细执行过程和执行结果。用用ARM汇编语言设计数据块
23、复制程序的设计思想如下:汇编语言设计数据块复制程序的设计思想如下:先将源数据区的起始地址、目标数据区的起始地址以及数据先将源数据区的起始地址、目标数据区的起始地址以及数据个数赋给选定的寄存器个数赋给选定的寄存器R0、R1、R2,再根据每次批量,再根据每次批量/单个单个复制数据的个数复制数据的个数R3,确定用于数据复制的中间寄存器,确定用于数据复制的中间寄存器R4-R11,之后先将源数据区的若干个数据批量装载到中间寄存器中,之后先将源数据区的若干个数据批量装载到中间寄存器中,再将中间寄存器的数据批量存储到目的数据存储区,随后进再将中间寄存器的数据批量存储到目的数据存储区,随后进行数据是否复制完毕
24、的判断,若未复制完毕,修改有关操作行数据是否复制完毕的判断,若未复制完毕,修改有关操作数据地址,并重复前面的数据复制操作,否者,终止操作,数据地址,并重复前面的数据复制操作,否者,终止操作,程序结束。程序结束。322 ARM指令的寻址方式应用举例指令的寻址方式应用举例21程 序 含 义 执行前有关数据 执行后有关结果.GLOBAL _START 定义全局变量 .TEXT 定义文本区 .EQU NUM,20 定义数据个数 NUM为 20 _START:LDR R0,=SRC/*R0 为寄存器寻址*/R0 指向源数据区的起始地址 R0:0 x0000000 SRC:0 x00008054 R0:0
25、 x00008054 LDR R1,=DST/*R1 寄存器寻址*/R1 指向目的数据区的起始地址 R1:0 x0000000 DST:0 x000080A4 R1:0 x000080A4 LDR R3,#NUM/*#NUM 立即寻址*/将需复制的字数据个数存放在 R2 R2:0 x0000000 NUM=20 R2:0 x00000014 LDR SP,#0 x400/*#0X400 为立即寻址*/将堆栈指针 SP 指向地址#0 x400 SP:0 x00000000 SP:0 x00000400 BLKCOPY:MOVS R3,R2,LSR#3/*R3 寄存器寻址*/将 R2 中的值除以
26、8后的结果存入 R3 R3:0 x00000000 R2:0 x00000014 CPSR:0 x000000D3 R3:0 x00000002 R2:0 x00000400 CPSR:0 x200000D3 BEQ COPYWORDS/*COPYWORDS 为相对寻址*/若 Z=1(即少于 8 个字),则转到 COPYWORDS 处 CPSR:0 x200000D3(Z=0)CPSR:0 x200000D3(Z=0)STMFD SP!,R4-R11/*SP 为堆栈寻址*/将 R4R11 的内容分别存入 SP 堆栈进行保护 SP:0 x00000400 R4R7:0 x00000000 SP:
27、0 x000003E0 SPP+32:0 x00000000 表表3.3 数据块复制程序执行前的有关数据和执行后的有关结果列表数据块复制程序执行前的有关数据和执行后的有关结果列表 22程 序 含 义 执行前有关数据 执行后有关结果 OCTCOPY:LDMIA R0!,R4-R11/*R4-R11为寄存器寻址*/从 R0 所指的源数据区装载 8 个字数据到 R4R11 中 R0:0 x00000854 R4R11:0X00000000 R0R0+31:0 x000000010 x00000008 R4R11:0X00000001 0 x00000008 STMIA R1!,R4-R11/*R1
28、寄存器寻址*/将 R4R11 的 8个字数据存入 R1所指的目的数据区 R4R11:0 x00000001 0 x00000008 R1:0 x000008A4 0 x00000000 0 x000008A4:0 x00000001 0 x00000008 SUBS R3,R3,#1/*R3 寄存器寻址*/每复制一次将R3 减 1 R3:0 x00000002 CPSR:0 x200000D3 R3:0 x00000001 CPSR:0 x200000D3 BNE OCTCOPY/*OCTCOPY 为相对寻址*/若 Z=0(即 R3 不等于 0),则转到OCTCOPY CPSR:0 x2000
29、00D3(Z=0)PC=OCTCOPY LDMFDSP!,R4-R11/*SP 堆栈寻址*/将堆栈内容恢复到 R4R11 SP:0 x000003C0 R4R11:0 x000000010 x00000008 R4R11:0 x00000000 COPYWORDS:ANDS R2,R2,#7/*R2 为寄存器寻址*/计算需复制的奇数个字的个数 R2:0 x00000014 CPSR:0 x600000D3 R2:0 x00000004 CPSR:0 x200000D3 BEQ STOP/*STOP 为相对寻址*/若 R2=0,则停止 CPSR:0 x200000D3(Z=0),转 WORDCO
30、PY PC=WORDCOPY 23WORDCOPY:LDR R3,R0,#4/*R0为寄存器间接寻址*/将源数据区的一个字装载至 R3 R0=0 x00008094:0 x00000001 R3:0 x00000000 R0=0 x00008098:0 x00000001 R3:0 x00000001 STR R3,R1,#4/*R1寄存器间接寻址*/将R3 中的一个字数据存到目的数据区 R3:0 x00000001 0 x00000000 R1=0 x000080E8 R3:0 x00000001:0 x000080E4 SUBS R2,R2,#1/*R2 寄存器寻址*/数据传输控制计数器减
31、1 CPSR:0 x200000D3 R2:0 x00000004 R2;0 x00000003 CPSR:0 x200000D3 BNE WORDCOPY/*WORDCOPY 为相对寻址*/若R2 不等于 0,则转到ORDCOPY CPSR:0 x200000D3(Z=0),转 WORDCOPY PC:0 x00008038 STOP:B STOP/*STOP 为相对寻址*/停止操作死循环 .LTORG SRC:.LONG 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 定义源数据区 DST:.LONG 0,0,0,0,0,0,0,0,0,0,0,0,0,0,
32、0,0,0,0,0,0 定义目标数据区 24 ARM微处理器的指令集是加载微处理器的指令集是加载/存储型的,即指令集仅能存储型的,即指令集仅能处理寄存器中的数据,处理结果仍要放回寄存器中,而对系统处理寄存器中的数据,处理结果仍要放回寄存器中,而对系统存储器的访问则需要通过专门的加载存储器的访问则需要通过专门的加载/存储指令来完成。本节存储指令来完成。本节将对将对ARM指令集的共指令集的共6大类指令进行详细的描述,并给出相应大类指令进行详细的描述,并给出相应例子。例子。331 数据处理指令数据处理指令 数据处理类指令可分为数据传送指令、算术逻辑运算指令数据处理类指令可分为数据传送指令、算术逻辑运
33、算指令及比较指令等。其中数据传送指令用于在寄存器和存储器之间及比较指令等。其中数据传送指令用于在寄存器和存储器之间进行数据的双向传输;算术逻辑运算指令完成常用的算术与逻进行数据的双向传输;算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新时更新CPSR中的相应条件标志位;比较指令不保存运算结果,中的相应条件标志位;比较指令不保存运算结果,只更新只更新CPSR中相应的条件标志位。中相应的条件标志位。数据处理类指令见表数据处理类指令见表34。33 ARM指令集指令集2526 1数据传送指令数据传送指令
34、 1)数据传送指令)数据传送指令 格式:格式:MOV条件条件 S目的寄存器,操作数目的寄存器,操作数 用途:用于将操作数传送到目的寄存器中。其中用途:用于将操作数传送到目的寄存器中。其中S决定指令的操决定指令的操作是否影响作是否影响CPSR中条件标志位的值,当没有中条件标志位的值,当没有S时指令不更新时指令不更新CPSR中条件标志位的值。例如:中条件标志位的值。例如:MOV Rl,R0 ;将寄存器;将寄存器R0的值传送到寄存器的值传送到寄存器Rl MOV PC,R14;将寄存器;将寄存器R14的值传送到的值传送到PC,常用于子程序,常用于子程序返回返回 MOV Rl,R0,LSL#3;将寄存器
35、;将寄存器R0的值左移的值左移3位后传送到位后传送到Rl 2)数据取反传送指令)数据取反传送指令 格式:格式:MVN条件条件S 目的寄存器,操作数目的寄存器,操作数 用途:用于将操作数按位取反后传送到目的寄存器中。其中用途:用于将操作数按位取反后传送到目的寄存器中。其中S决决定指令的操作是否影响定指令的操作是否影响CPSR中条件标志位的值,当没有中条件标志位的值,当没有S时指令不时指令不更新更新CPSR中条件标志位的值。例如:中条件标志位的值。例如:MVN R0,#0 ;27 2比较指令比较指令 1)比较指令)比较指令 格式:格式:CMP条件条件)操作数操作数1,操作数,操作数2 用途:用于把
36、用途:用于把2个操作数进行比较,同时更新个操作数进行比较,同时更新CPSR中条件标志中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数志位。标志位表示的是操作数1与操作数与操作数2的关系的关系(大、小、相等大、小、相等),如当操作数如当操作数1大于操作操作数大于操作操作数2,则此后的有,则此后的有GT后缀的指令将可以执后缀的指令将可以执行。行。例如:例如:CMP Rl,R0 ;将;将Rl的值与的值与R0的值相减,并根据结果设的值相减,并根据结果设置置 CPSR的标志位的标志位 2)反值比较指令
37、)反值比较指令 格式:格式:CMN条件条件)操作数操作数1,操作数,操作数2 用途:用于用途:用于2个操作数分别取反后进行比较,同时更新个操作数分别取反后进行比较,同时更新CPSR中中条件标志位的值。该指令实际完成操作数条件标志位的值。该指令实际完成操作数1和操作数和操作数2相加,并根据相加,并根据结果更改条件标志位。结果更改条件标志位。例如:例如:CMN Rl,#100;将;将Rl的值与立即数的值与立即数100相加,并根据相加,并根据结果设置结果设置CPSR 的标志位的标志位28 3 测试指令测试指令 1)位测试指令)位测试指令 格式:格式:TST条件条件 操作数操作数1,操作数,操作数2
38、用途:用于把用途:用于把2个操作数进行按位的与运算,并根据运算结果更个操作数进行按位的与运算,并根据运算结果更新新CPSR中条件标志位的值。该指令通常用来检测是否设置了特定中条件标志位的值。该指令通常用来检测是否设置了特定的位,一般操作数的位,一般操作数1是要测试的数据,而操作数是要测试的数据,而操作数2是一个位掩码。是一个位掩码。例如:例如:TST Rl,#%1;将;将Rl的值与二进制数的值与二进制数1按位进行与运按位进行与运算,并根据结果设置算,并根据结果设置CPSR的标志位的标志位 TST Rl,#0 xFE;将;将Rl的值与十六进制数的值与十六进制数FE按位进行与运算,按位进行与运算,
39、并据结果设置并据结果设置CPSR的标志位。的标志位。2)相等测试指令)相等测试指令 格式:格式:TEQ条件条件 操作数操作数1,操作数,操作数2 用途:用于把用途:用于把2个操作数进行按位的异或运算,并根据运算结个操作数进行按位的异或运算,并根据运算结果更新果更新CPSR中条件标志位的值。该指令通常用于比较操作数中条件标志位的值。该指令通常用于比较操作数1和操和操作数作数2是否相等。是否相等。例如:例如:TEQ Rl,R2 ;将;将Rl的值与的值与R2的值按位异或,并据结果的值按位异或,并据结果设置设置CPSR的标志位的标志位29 4 加法指令加法指令 1)加法指令)加法指令 格式:格式:AD
40、D条件条件 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 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:两个操作数相加后,再
41、加上用途:两个操作数相加后,再加上CPSR中条件标志位的值,并将结中条件标志位的值,并将结果存放到目的寄存器中。由于该指令使用了进位标志位,因此可以做大于果存放到目的寄存器中。由于该指令使用了进位标志位,因此可以做大于32位的数的加法。这时应注意不要忘记设置位的数的加法。这时应注意不要忘记设置S后缀来更改进位标志。操作数后缀来更改进位标志。操作数要求同上。例如两个要求同上。例如两个128位数的加法如下:位数的加法如下:ADDS R0,R4,R8 ;加低端的字;加低端的字 ADCS Rl,R5,R9 ;加第二个字,带进位;加第二个字,带进位 ADCS R2,R6,Rl 0 ;加第三个字,带进位;
42、加第三个字,带进位 ADC R3,R7,Rl1;加第四个字,带进位;加第四个字,带进位 30 5 减法指令减法指令 1)减法指令)减法指令 格式:格式:SUB条件条件 S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:操作数用途:操作数1减去操作数减去操作数2,并将结果存放到目的寄存器中。,并将结果存放到目的寄存器中。操作数操作数 1应是一个寄存器,操作数应是一个寄存器,操作数2可以是一个寄存器,被移位的可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。运算。例如:例如:SUB
43、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位的数的减法,这位的数的
44、减法,这时应注意不要忘记设置时应注意不要忘记设置S后缀来更改进位标志。该指令可用于有符后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。号数或无符号数的减法运算。例如:例如:SBCS R0,Rl,R2 ;R0=Rl-R2-!C31 3)反向减法指令)反向减法指令 格式:格式:RSB条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:用操作数用途:用操作数2减去操作数减去操作数1,并将结果存放到目的寄存器中。,并将结果存放到目的寄存器中。操作数的要求同上。该指令可用于有符号数或无符号数的减法运算。操作数的要求同上。该指令可用于有符号数或无符号数的减法运算。例如
45、:例如: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 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:操作数用途:操作数2减去操作数减去操作数1,再减去,再减去CPSR中的条件标志位中的条件标志位C的的反码,并将结果存放到目的寄存器中。操作数反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操应是一个寄存器,操作数作数2可以是一个寄存器,被移位的寄存器,或一个立即数。由于该可以是一个
46、寄存器,被移位的寄存器,或一个立即数。由于该指令使用进位标志来表示借位,因此可以做大于指令使用进位标志来表示借位,因此可以做大于32位的数的减法,位的数的减法,这时应注意不要忘记设置这时应注意不要忘记设置S后缀来更改进位标志。该指令可用于有符后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。号数或无符号数的减法运算。例如:例如:RSC R0,Rl,R2 ;R0=R2 Rl!C32 6 逻辑运算指令逻辑运算指令 1)逻辑与指令)逻辑与指令 格式:格式:AND条件条件 S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:对两个操作数进行逻辑与运算,并把结果放置到目用途:
47、对两个操作数进行逻辑与运算,并把结果放置到目的寄存器中。操作数的寄存器中。操作数1应是一个寄存器,操作数应是一个寄存器,操作数2可以是一个寄可以是一个寄存器,被移位的寄存器,或一个立即数。存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽该指令常用于屏蔽操作数操作数1的某些位。的某些位。例如:例如:AND R0,R0,#3 ;该指令保;该指令保持持R0的的0、1位,其余位清零位,其余位清零 2)逻辑或指令)逻辑或指令 格式:格式:ORR条件条件 S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:对两个操作数进行逻辑或运算,并把结果放置到目用途:对两个操作数进行逻辑或运算,并
48、把结果放置到目的寄存器中。操作数要求同上。的寄存器中。操作数要求同上。该指令常用于设置操作数该指令常用于设置操作数1的的某些位。某些位。例如:例如:ORR R0,R0,#3 ;该指令设置;该指令设置R0的的0、1位,其余位保持不变位,其余位保持不变 33 3)逻辑异或指令)逻辑异或指令 格式:格式:EOR条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:对两个操作数进行逻辑异或运算,并把结果放置到用途:对两个操作数进行逻辑异或运算,并把结果放置到目的寄存器中。操作数要求同上。该指令常用于反转操作数目的寄存器中。操作数要求同上。该指令常用于反转操作数1的某些位。的某些位
49、。例如:例如:EOR R0,R0,#3 ;该指令反转;该指令反转R0的的0、1位,位,其余位保持不变其余位保持不变 4)位清除指令)位清除指令 格式:格式:BIC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 用途:用于清除操作数用途:用于清除操作数1的某些位,并把结果放置到目的的某些位,并把结果放置到目的寄存器中。操作数要求同上。操作数寄存器中。操作数要求同上。操作数2 为为32位的掩码,如果在位的掩码,如果在掩码中设置了某一位,则清除操作数掩码中设置了某一位,则清除操作数1中相应的位,其余保持中相应的位,其余保持不变。不变。例如:例如:BIC R0,R0,#%1011
50、 ;该指令清除;该指令清除R0中的位中的位0、1和和3,其余的位保持不变,其余的位保持不变 34 7乘法指令与乘加指令乘法指令与乘加指令 ARM微处理器支持的乘法指令与乘加指令共有微处理器支持的乘法指令与乘加指令共有6条,按运条,按运算结果可分为算结果可分为32位和位和64位位2类,与前面的数据处理指令不同,类,与前面的数据处理指令不同,乘法指令与乘加指令中的所有操作数、目的寄存器必须为通用乘法指令与乘加指令中的所有操作数、目的寄存器必须为通用寄存器,不能用立即数或被移位的寄存器作为操作数,同时,寄存器,不能用立即数或被移位的寄存器作为操作数,同时,目的寄存器和操作数目的寄存器和操作数1必须是