1、4C H A P T E RARM7指令集指令集1/2/20231本章重点1、ARM处理器的寻址方式处理器的寻址方式2、ARM指令集指令集3、Thumb指令集指令集1/2/202324.1 ARMARM指令的分类指令的分类与格式 ARMARM微处理器的指令集可以分为跳转微处理器的指令集可以分为跳转(分支)指令、分支)指令、数据处理指令、程序状态寄存器(数据处理指令、程序状态寄存器(CPSRCPSR)处理指令、)处理指令、加载加载/存储指令、协处理器指令和异常产生指令六存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表大类,具体的指令及功能如表4-14-1所示(表中指令所示(表中指
2、令为基本为基本ARMARM指令,不包括派生的指令,不包括派生的ARMARM指令)指令)。1/2/202331/2/202344.1.2 4.1.2 指令格式指令格式用助记符表示的用助记符表示的ARMARM指令一般格式如下:指令一般格式如下:S S,(格式中(格式中的内容必不可少,的内容必不可少,中的内容可省略)中的内容可省略)表示操作码,如表示操作码,如ADDADD表示算术加法。表示算术加法。表示指令执行的条件域,如表示指令执行的条件域,如EQEQ、NENE等,缺省为等,缺省为ALAL。SS决定指令的执行结果是否影响决定指令的执行结果是否影响CPSRCPSR的值,使用该后缀则的值,使用该后缀则
3、指令执行的结果影响指令执行的结果影响CPSRCPSR的值,否则不影响。的值,否则不影响。表示目的寄存器。表示目的寄存器。表示第一个操作数,为寄存器。表示第一个操作数,为寄存器。表示第二个操作数,可以是立即数、寄存器和寄存表示第二个操作数,可以是立即数、寄存器和寄存器移位操作数。器移位操作数。1/2/202352 指令的条件域当处理器工作在当处理器工作在ARMARM状态时,几乎所有的指令均根状态时,几乎所有的指令均根据据CPSRCPSR中条件码的状态和指令的条件域有条件的中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,执行。当指令的执行条件满足时,指令被执行,否则指
4、令被忽略。否则指令被忽略。每一条每一条ARMARM指令包含指令包含4 4位的条件码,位于指令的最位的条件码,位于指令的最高高4 4位位31:2831:28。条件码共有。条件码共有1616种,每种条件码可种,每种条件码可用两个字符表示,这两个字符可以添加在指令助用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。记符的后面和指令同时使用。例如,跳转指令例如,跳转指令B B可以加上后缀可以加上后缀EQEQ变为变为BEQBEQ表示表示“相等则跳转相等则跳转”,即当,即当CPSRCPSR中的中的Z Z标志置位时发生标志置位时发生跳转跳转1/2/20236NZCV IM0M1M2M3M4
5、TF.31 30 29 28 27 26 8 7 6 5 4 3 2 1 0 程序状态寄存器条件代码标志保留控制位溢出标志 oVerflow进位或借位扩展 Carry零 Zero负或小于 NegativeIRQ禁止 InterruptFIQ禁止 Fast状态位 Thumb模式位 ModeNZCVIM0M1M2M3M4TFCPSRCPSR寄存器的格式寄存器的格式1/2/20237 指令的条件码在在16种条件标志码中,只有种条件标志码中,只有15种可以使用,第种可以使用,第16种种(1111)为系统保留,暂时不能使用。)为系统保留,暂时不能使用。1/2/20238S S后缀后缀 指令中使用指令中使
6、用S S后缀时,指令执行后程序状后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用态寄存器的条件标志位将被刷新,不使用S S后缀时,指令执行后程序状态寄存器的条件后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。标志将不会发生变化。S S后缀通常用于对条件进行测试,例如是后缀通常用于对条件进行测试,例如是否有溢出,是否进位等;根据这些变化,就否有溢出,是否进位等;根据这些变化,就可以进行一些判断,如是否大于,是否相等;可以进行一些判断,如是否大于,是否相等;从而可能影响指令执行的顺序。从而可能影响指令执行的顺序。1/2/20239条件后缀和S后缀的关系如下:(1 1)如果既有
7、条件后缀又有)如果既有条件后缀又有S S后缀,则书写时后缀,则书写时S S排在后面,如:排在后面,如:ADDEQS R1,R0,R2ADDEQS R1,R0,R2该指令该指令在在Z=1Z=1时执行,将时执行,将R0+R2R0+R2的值放入的值放入R1R1,同时,同时刷新条件标志位。刷新条件标志位。(2 2)条件后缀是要测试条件标志位,而)条件后缀是要测试条件标志位,而S S后后缀是要刷新条件标志位。缀是要刷新条件标志位。(3 3)条件后缀要测试的是执行前的标志位,)条件后缀要测试的是执行前的标志位,而而S S后缀是依据指令的结果改变条件标志。后缀是依据指令的结果改变条件标志。1/2/20231
8、0例:例:假设假设R0=0 x1,R3=0 x3,R0=0 x1,R3=0 x3,指令执行之前指令执行之前CPSR=nzcvqIFt_SVC,CPSR=nzcvqIFt_SVC,分别执行如下指令分别执行如下指令CPSRCPSR的值有何变化?的值有何变化?SUB R1,R0,R3 SUB R1,R0,R3 ;R0R0的值减去的值减去R3R3的值,结果存入的值,结果存入R1R1 SUBS R1,R0,R3 SUBS R1,R0,R3 ;R0R0的值减去的值减去R3R3的值,结果存入的值,结果存入R1R1 影响标志位影响标志位 分析:执行第分析:执行第1 1条指令对于标志寄存器的值没有任何影条指令对
9、于标志寄存器的值没有任何影 响,因此响,因此CPSRCPSR的值不变。的值不变。执行第执行第2 2条指令后条指令后CPSR=NzcvqIFt_SVC,CPSR=NzcvqIFt_SVC,因为因为R0R0的的 值减去值减去R3R3值,结果变成负数,故而值,结果变成负数,故而NN被置位了被置位了1/2/2023114.1.3 ARM指令中的操作数符号 ARMARM指令格式中的操作数有不同的符号,说明如下:指令格式中的操作数有不同的符号,说明如下:1 1、立即数符号立即数符号#符号表示一个立即数,该符号后的数据可以是十进制、符号表示一个立即数,该符号后的数据可以是十进制、二进制或十六进制数。二进制或
10、十六进制数。#2#22 2、二进制符号、二进制符号%(2 2)%后面的数字表示二进制数,例如:后面的数字表示二进制数,例如:%10010101%10010101 (2 100101012 10010101),表示二进制数),表示二进制数1001010110010101,即十进制数,即十进制数149149。3 3、十六进制数、十六进制数0 x0 x 0 x 0 x后面的数字表示十六进制数,如:后面的数字表示十六进制数,如:0 xFFFF 0 xFFFF,表示十六进,表示十六进制数制数FFFFFFFF,即十进制数的,即十进制数的6553565535 1/2/202312ARMARM指令中的操作数符
11、号(续指令中的操作数符号(续1 1)5 5、更新基地址寄存器符号!、更新基地址寄存器符号!符号表示指令在完成操作后应将最后的地址写!符号表示指令在完成操作后应将最后的地址写入基址寄存器。入基址寄存器。如果指令地址表达式中不含!后缀,则基址寄存器如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。指令中的地址表达式中中的地址值不会发生变化。指令中的地址表达式中含有含有!后缀时,指令执行后,基址寄存器中的地址后缀时,指令执行后,基址寄存器中的地址值将发生变化,变化的结果如下:值将发生变化,变化的结果如下:基址寄存器中的值(指令执行后)基址寄存器中的值(指令执行后)指令执行前的值地址
12、偏移量指令执行前的值地址偏移量1/2/202313例例 分别执行下面两条指令有何区别?分别执行下面两条指令有何区别?LDR R3,R0,#4 LDR R3,R0,#4 LDR R3,R0,#4 LDR R3,R0,#4!分析:在上述指令中,第分析:在上述指令中,第1 1条指令没有后缀!,条指令没有后缀!,指令的结果是把指令的结果是把R0R0加加4 4作为地址指针,把这个作为地址指针,把这个指针所指向的地址单元所存储的数据读入指针所指向的地址单元所存储的数据读入R3R3,R0R0的值不变。第的值不变。第2 2条指令除了实现以上操作外,条指令除了实现以上操作外,还把还把R0R04 4的结果送到的结
13、果送到R0R0中。中。1/2/202314使用使用!后缀需要注意如下事项:后缀需要注意如下事项:(1)!(1)!后缀必须紧跟在地址表达式后面,而地后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。址表达式要有明确的地址偏移量。(2)!(2)!后缀不能用于后缀不能用于R15(PC)R15(PC)的后面的后面 1/2/2023156 6、复制、复制SPSRSPSR到到CPSRCPSR符号符号 该符号通常在批量数据存储指令中作为后缀放该符号通常在批量数据存储指令中作为后缀放在存储器之后,当前寄存器不包含在存储器之后,当前寄存器不包含PCPC时,该符号表时,该符号表示所用的寄存器使用户模
14、式的寄存器;当其前面的示所用的寄存器使用户模式的寄存器;当其前面的寄存器包含寄存器包含PCPC时,该符号指示将时,该符号指示将SPSRSPSR寄存器的值复寄存器的值复制到制到CPSRCPSR寄存器中。寄存器中。7 7、指示寄存器列表范围符号、指示寄存器列表范围符号 符号用于有些指令中表示多个连续的寄存器时,符号用于有些指令中表示多个连续的寄存器时,及从及从到到。例如:。例如:R0R7R0R7,表示,表示R0R0、R1.R7 R1.R7,8 8个寄存器。个寄存器。1/2/2023164.1.4 ARM指令中的移位操作ARMARM微处理器内嵌的桶型移位器(微处理器内嵌的桶型移位器(Barrel S
15、hifterBarrel Shifter),),支持数据的各种移位操作,移位操作在支持数据的各种移位操作,移位操作在ARMARM指令指令集中不作为单独的指令使用,它只能作为指令格式集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。中是一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下移位操作包括如下6 6种类型,种类型,LSL LSL 逻辑左移、逻辑左移、ASL ASL 算
16、术左移算术左移 、LSR LSR 逻辑右移逻辑右移 、ASR ASR 算术右移、算术右移、ROR ROR 循环右移循环右移 、RRX RRX 带扩展的循环右移带扩展的循环右移;ASLASL和和LSLLSL是是等价的,可以自由互换:等价的,可以自由互换:1/2/2023174.2 指令集介绍 桶形移位器支持数据的各种移位操作桶形移位器支持数据的各种移位操作ALU桶形移位器桶形移位器Rd结果结果N预预处处理理未未预预处处理理RmRn1/2/202318ARM指令中的移位操作(续1)1 1、LSLLSL(或(或ASLASL)逻辑(或算术)左移操作逻辑(或算术)左移操作 LSL LSL(或(或ASLA
17、SL)操作的格式为:)操作的格式为:通用寄存器,通用寄存器,LSLLSL(或(或ASLASL)操作数操作数 用途:用途:LSL LSL(或(或ASLASL)可完成对通用寄存器中的内容进行逻辑(或算)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以用一个立即值用零来填充。其中,操作数可以用一个立即值(从从 0 0 到到 31)31)指定移位数量,或用包含在指定移位数量,或用包含在 0 0 和和 31 31 之间的一个值的寄存器之间的一个值的寄存器指定移位数量。指定移位数量。操作
18、示例:操作示例:MOV R0,R1,LSL#2 MOV R0,R1,LSL#2 ;将;将R1R1中的内容左移两位后传送到中的内容左移两位后传送到R0R0中。中。1/2/202319ARM指令中的移位操作(续2)2 2、LSR LSR 逻辑右移操作逻辑右移操作 LSR LSR操作的格式为:操作的格式为:通用寄存器,通用寄存器,LSR LSR 操作数操作数 用途:用途:LSR LSR可完成对通用寄存器中的内容进行右移的操作,可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数操作数可以用一个立即值操
19、作数操作数可以用一个立即值(从从 0 0 到到 31)31)指定移位数量,指定移位数量,或用包含在或用包含在 0 0 和和 31 31 之间的一个值的寄存器指定移位数量。之间的一个值的寄存器指定移位数量。操作示例:操作示例:MOV R0,R1,LSR#2 MOV R0,R1,LSR#2 ;将;将R1R1中的内容右移两位后传送到中的内容右移两位后传送到 ;R0R0中,左端用零来填充。中,左端用零来填充。1/2/202320ARM指令中的移位操作(续3)3 3、ASR ASR 算数右移操作算数右移操作 ASR ASR操作的格式为:操作的格式为:通用寄存器,通用寄存器,ASR ASR 操作数操作数
20、用途:用途:ASR ASR可完成对通用寄存器中的内容进行算数右移的操作,按可完成对通用寄存器中的内容进行算数右移的操作,按操作数所指定的数量向右移位,左端用第操作数所指定的数量向右移位,左端用第3131位的值来填充。位的值来填充。其中,操作数操作数可以用一个立即值其中,操作数操作数可以用一个立即值(从从 0 0 到到 31)31)指定移指定移位数量,或用包含在位数量,或用包含在 0 0 和和 31 31 之间的一个值的寄存器指定移之间的一个值的寄存器指定移位数量。操作示例:位数量。操作示例:MOV R0,R1,ASR#2 MOV R0,R1,ASR#2 ;将;将R1R1中的内容右移两位后传送中
21、的内容右移两位后传送到到R0R0中,左端用第中,左端用第3131位的值来填充。位的值来填充。1/2/202321ARM指令中的移位操作(续4)4 4、ROR ROR 循环右移操作循环右移操作 ROR ROR操作的格式为:通用寄存器,操作的格式为:通用寄存器,ROR ROR 操作数操作数 用途:用途:ROR ROR可完成对通用寄存器中的内容进行循环右移的操作,按可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即来填充。其中,操作数可以是通用寄存器,也
22、可以是立即数(数(0 03131)。显然,当进行)。显然,当进行3232位的循环右移操作时,通用位的循环右移操作时,通用寄存器中的值不改变。寄存器中的值不改变。操作示例:操作示例:MOV R0,R1,ROR#2 MOV R0,R1,ROR#2 ;将;将R1R1中的内容循环右移两位后中的内容循环右移两位后传送到传送到R0R0中。中。1/2/202322ARM指令中的移位操作(续5)5 5、RRX RRX 带扩展的循环右移操作带扩展的循环右移操作 RRX RRX操作的格式为:操作的格式为:通用寄存器,通用寄存器,RRX RRX 操作数操作数 用途:用途:RRX RRX可完成对通用寄存器中的内容进行
23、带扩展的循环右移的可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位操作,按操作数所指定的数量向右循环移位,左端用进位标志位标志位C C来填充。其中,操作数可以是通用寄存器,也可以来填充。其中,操作数可以是通用寄存器,也可以是立即数(是立即数(0 03131)。)。操作示例:操作示例:MOV R0,R1,RRX#2 MOV R0,R1,RRX#2 ;将;将R1R1中的内容进行带扩展的循中的内容进行带扩展的循环右移两位后传送到环右移两位后传送到R0R0中。中。1/2/2023234.2 ARM处理器寻址方式 寻址方式是根据指令中给出的地址码字段来寻
24、址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。实现寻找真实操作数地址的方式。ARMARM处理器处理器具有具有7 7种基本寻址方式。种基本寻址方式。1.1.立即寻址;立即寻址;2.2.寄存器寻址;寄存器寻址;3.3.寄存器间接寻址;寄存器间接寻址;4.4.基址加变址寻址;基址加变址寻址;5.5.相对寻址;相对寻址;6.6.堆栈寻址;堆栈寻址;7.7.多寄存器寻址;多寄存器寻址;1/2/202324寻址方式分类立即寻址 立即寻址指令中的操作码字段后面的地址码部立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令分即是操作数本身,也就是说,数据就包
25、含在指令当中,取出指令也就取出了可以立即使用的操作数当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数这样的数称为立即数)。立即寻址指令举例如下:。立即寻址指令举例如下:SUBSR0,R0,#1 ;R0减减1,结果放入,结果放入R0,并且影响标志位,并且影响标志位MOVR0,#0 xFF000 ;将立即数将立即数0 xFF000装入装入R0寄存器寄存器 0 x55R0MOV R0,#0 xFF00程序存储MOV R0,#0 xFF000 xFF00从代码中获得数据1/2/202325寻址方式分类寄存器寻址 操作数的值在寄存器中,指令中的地址码字段操作数的值在寄存器中,指令中的地址
26、码字段指出的是寄存器编号,指令执行时直接取出寄存器指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:值来操作。寄存器寻址指令举例如下:MOV R1,R2 ;将将R2的值存入的值存入R1 SUB R0,R1,R2 ;将将R1的值减去的值减去R2的值,结果保存到的值,结果保存到R0 0 xAA0 x55R2R1MOV R1,R20 xAA1/2/202326 寄存器间接寻址指令中的地址码给出的是一个通用寄存器寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存
27、器为操作数的地址指针。寄存器间接寻址指令举例如下:即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,R2;将R2指向的存储单元的数据读出,保存在R1中 SWPR1,R1,R2;将寄存器R1的值和R2指定的存储单元的内容交换 0 x55R0R2 0 x400000000 xAA0 x40000000 寻址方式分类寄存器间接寻址LDR R0,R20 xAA1/2/202327 基址寻址就是将基址寄存器的内容与指令中给出的偏移基址寻址就是将基址寄存器的内容与指令中给出的偏移量(量(4K4K)相加)相加/减,形成操作数的有效地址。基址寻址用减,形成操作数的有效地址。基址寻址用于访问基
28、址附近的存储单元,常用于查表、数组操作、功能于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为部件寄存器访问等。寄存器间接寻址是偏移量为0 0的基址加的基址加偏移寻址。偏移寻址。基址寻址指令举例如下基址寻址指令举例如下(前索引寻址前索引寻址):LDRR2,R3,#0 x0C ;读取读取R3+0 x0C地址上的存储单元地址上的存储单元 ;的内容,放入的内容,放入R2 STRR1,R0,#-4!;先先R0=R0-4,然后把,然后把R0的值寄存的值寄存 ;到保存到到保存到R1指定的存储单元指定的存储单元 寻址方式分类基址(加变址)寻址0 x55R2R3 0
29、 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0C0 xAA将R3+0 x0C作为地址装载数据1/2/202328寻址方式分类基址(加变址)寻址 基址寻址指令举例如下:基址寻址指令举例如下:LDRLDRR0,R1,#4 R0,R1,#4 ;R0=R1;R0=R1,R1R1R1R14 4 ;后索引基址寻址后索引基址寻址 ;ARM ;ARM这种自动索引机制不消耗这种自动索引机制不消耗 ;额外的时间额外的时间LDR R0LDR R0,R1,R2 R1,R2 ;R0=R1+R2;R0=R1+R21/2/202329 相对寻址是基址寻址的一种变通。由程序计数相对寻址是基
30、址寻址的一种变通。由程序计数器器PCPC提供基准地址,指令中的地址码字段作为偏移提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:相对寻址指令举例如下:BLSUBR1;调用到调用到SUBR1子程序子程序BEQLOOP;条件跳转到条件跳转到LOOP标号处标号处.LOOPMOVR6,#1.SUBR1.寻址方式分类相对寻址1/2/202330 堆栈是一个按特定顺序进行存取的存储区,操堆栈是一个按特定顺序进行存取的存储区,操作顺序为作顺序为“后进先出后进先出”。堆栈寻址是隐含的,它使。堆栈寻址是隐含
31、的,它使用一个专门的寄存器用一个专门的寄存器(堆栈指针堆栈指针)指向一块存储区域指向一块存储区域(堆栈堆栈),指针所指向的存储单元即是堆栈的栈顶。,指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈向下生长:向低地址方向生长,称为递减堆栈vARM中采用中采用LDMFD和和STMFD指令分别用来支持指令分别用来支持POP操操作(出栈)和作(出栈)和PUSH操作(进栈),操作(进栈),R13作为堆栈指针。作为堆栈指针。寻址方式分类堆栈寻址1/2/20
32、2331寻址方式分类堆栈寻址(续1)栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0 x123456780 x12345678堆栈压栈堆栈压栈1/2/202332栈顶SP栈顶SP栈底空堆栈栈底满堆栈 堆栈指针指向最后压入的堆栈的有效数据项,堆栈指针指向最后压入的堆栈的有效数据项,称为称为满堆栈满堆栈;堆栈指针指向下一个待压入数据的空;堆栈指针指向下一个待压入数据的空位置,称为位置,称为空堆栈空堆栈。寻址方式分类堆栈寻址(续2)0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈1/2/202333所以可以组合出四种类型的堆栈方式:满递增:堆栈向
33、上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类堆栈寻址(续3)1/2/202334 多寄存器寻址一次可传送几个寄存器值,允许一条指多寄存器寻址一次可传送几个寄存器值,允许一条指令传送令传送1616个寄存器的任何子集或所有寄存器。多寄存器寻个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例
34、如下:址指令举例如下:LDMIAR1!,R2-R7,R12 ;将将R1指向的单元中的数据读出到指向的单元中的数据读出到 ;R2R7、R12中中(R1自动加自动加4)STMIAR0!,R2-R7,R12 ;将寄存器将寄存器R2R7、R12的值保的值保 ;存到存到R0指向的存储单元中指向的存储单元中 ;(R0自动加自动加4)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器 寻址方式分类多寄存器寻址LDR R1!,R2-R4,R6 0 x01
35、0 x020 x030 x040 x400000101/2/2023354.3 ARM 指令集 数据处理指令大致可分为数据处理指令大致可分为3 3类:类:数据传送指令;数据传送指令;算术逻辑运算指令;算术逻辑运算指令;比较指令。比较指令。数据处理指令只能对寄存器的内容进行操数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有作,而不能对内存中的数据进行操作。所有ARMARM数据处理指令均可选择使用数据处理指令均可选择使用S S后缀,以使后缀,以使指令影响状态标志。指令影响状态标志。1/2/2023364.3.1 数据处理指令数据处理指令包括:数据处理指令包括:MOV MO
36、V 数据传送指令数据传送指令 MVN MVN 数据取反传送指令数据取反传送指令 CMP CMP 比较指令比较指令 CMN CMN 反值比较指令反值比较指令 TST TST 位测试指令位测试指令 TEQ TEQ 相等测试指令相等测试指令 ADD ADD 加法指令加法指令 ADC ADC 带进位加法指令带进位加法指令 SUB SUB 减法指令减法指令 SBC SBC 带借位减法指令带借位减法指令 RSB RSB 逆向减法指令逆向减法指令 RSC RSC 带借位的逆向减法指令带借位的逆向减法指令 AND AND 逻辑与指令逻辑与指令 ORR ORR 逻辑或指令逻辑或指令 EOR EOR 逻辑异或指令
37、逻辑异或指令 BIC BIC 位清除指令位清除指令 1/2/202337ARM数据处理指令指令编码指令执行的条件码I用于区别立即数(I为1)和寄存器移位(I为0)opcode数据处理指令操作码第二操作数Rd目标寄存器Rn第一操作数寄存器S设置条件码,与指令中的S位对应带进位加法ADC0101带进位减法指令SBC0110带进位逆向减法指令RSC0111位测试指令TST1000相等测试指令TEQ1001比较指令CMP1010负数比较指令CMN1011逻辑或操作指令ORR1100数据传送MOV1101位清除指令BIC1110数据非传送MVN1111加法运算指令ADD0100逆向减法指令RSB0011
38、减法运算指令SUB0010逻辑异或操作指令EOR0001逻辑与操作指令AND0000说明指令助记符操作码opcode操作码功能表1/2/202338助记符说明操作条件码位置MOV Rd,operand2数据传送Rdoperand2 MOVcondSMVN Rd,operand2数据非传送Rd(operand2)MVNcondSARM数据处理指令数据传送注:当后缀注:当后缀S S时,这些指令根据结果更新标志时,这些指令根据结果更新标志N N和和Z Z,在计算,在计算Operand2Operand2时更新标志时更新标志C C,不影响标志,不影响标志V V。1/2/202339助记符说明操作条件码位
39、置MOV Rd,operand2MOV Rd,operand2数据传送Rdoperand2 MOVcondSMVN Rd,operand2数据非传送Rd(operand2)MVNcondSARM数据处理指令数据传送 MOVMOV指令将立即数或寄存器传送到目标寄存器(指令将立即数或寄存器传送到目标寄存器(RdRd),可用于移位),可用于移位运算等操作。指令格式如下:运算等操作。指令格式如下:MOVcondS Rd,operand2 MOVMOV指令举例如下:指令举例如下:MOVR1,#0 xF000000B;R1=0 xF000000B;R1=0 xF000000B MOVR0,R1;R0=R1
40、R0=R1 MOVSR3,R1,LSL#2;R3=R12R3=R110,R110,则执行本指令则执行本指令 1/2/202343助记符说明操作条件码位置CMP Rn,operand2比较指令标志N、Z、C、VRn-operand2CMPcondCMN Rn,operand2CMN Rn,operand2负数比较指令标 志 N、Z、C、VRn+operand2CMNcondTST Rn,operand2位测试指令标志N、Z、C、VRn&operand2TSTcondTEQ Rn,operand2相等测试指令标志N、Z、C、VRn operand2TEQcondARM数据处理指令比较指令 负数比较
41、指令负数比较指令CMNCMN指令用于把一个寄存器的内容和另指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新一个寄存器的内容或立即数取反后进行比较,同时更新CPSRCPSR中中条件标志位的值。该指令实际完成操作数条件标志位的值。该指令实际完成操作数1 1和操作数和操作数2 2相加,并根相加,并根据结果更改条件标志位据结果更改条件标志位:CMNcondRn,operand2 应用示例:应用示例:CMNR0,#1;R0+1;R0+11/2/202344助记符说明操作条件码位置CMP Rn,operand2比较指令标志N、Z、C、VRn-operand2CMPcondCM
42、N Rn,operand2负数比较指令标 志 N、Z、C、VRn+operand2CMNcondTST Rn,operand2TST Rn,operand2位测试指令标志N、Z、C、VRn&operand2TSTcondTEQ Rn,operand2相等测试指令标志N、Z、C、VRn operand2TEQcondARM数据处理指令比较指令 位测试指令位测试指令TSTTST指令将寄存器指令将寄存器RnRn的值与的值与operand2operand2的值按位作逻辑的值按位作逻辑“与与”操作,根据操作的结果更新操作,根据操作的结果更新CPSRCPSR中的相应条件标志位,以便后面的指中的相应条件标志
43、位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:令根据相应的条件标志来判断是否执行。指令格式如下:TSTcond Rn,operand2 应用示例:应用示例:TSTR0,#0 x01;判断判断R0R0的最低位是否为的最低位是否为0 0 TSTR1,#0 x0F;判断判断R1R1的低的低4 4位是否为位是否为0 0 1/2/202345助记符说明操作条件码位置CMP Rn,operand2比较指令标志N、Z、C、VRn-operand2CMPcondCMN Rn,operand2负数比较指令标 志 N、Z、C、VRn+operand2CMNcondTST Rn,operand2
44、位测试指令标志N、Z、C、VRn&operand2TSTcondTEQ Rn,operand2TEQ Rn,operand2相等测试指令标志N、Z、C、VRn operand2TEQcondARM数据处理指令比较指令 相等测试指令相等测试指令TEQTEQ指令将寄存器指令将寄存器RnRn的值与的值与operand2operand2的值按位作逻的值按位作逻辑辑“异或异或”操作,根据操作的结果更新操作,根据操作的结果更新CPSRCPSR中的相应条件标志位,以便后中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:面的指令根据相应的条件标志来判断是否执行。指令格式如下:T
45、EQcond Rn,operand2 应用示例:应用示例:TEQR0,R1;比较比较R0R0与与R1R1是否相等是否相等1/2/202346助记符说明操作条件码位置ADD Rd,Rn,operand2加法运算指令RdRn+operand2ADDcondSSUB Rd,Rn,operand2减法运算指令RdRn-operand2SUBcondSRSB Rd,Rn,operand2逆向减法指令Rdoperand2-RnRSBcondSADC Rd,Rn,operand2带进位加法RdRn+operand2+CarryADCcondSSBC Rd,Rn,operand2带进位减法指令RdRn-ope
46、rand2-(NOT)CarrySBCcondSRSC Rd,Rn,operand2带进位逆向减法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM数据处理指令算术运算注:这些指令不直接影响注:这些指令不直接影响N N,Z Z,C C和和V V标志位,如果标志位,如果要影响标志位,则需要加要影响标志位,则需要加S S。1/2/202347助记符说明操作条件码位置ADD Rd,Rn,operand2ADD Rd,Rn,operand2加法运算指令RdRn+operand2ADDcondSSUB Rd,Rn,operand2减法运算指令RdRn-operand2SUBcon
47、dSRSB Rd,Rn,operand2逆向减法指令Rdoperand2-RnRSBcondSADC Rd,Rn,operand2带进位加法RdRn+operand2+CarryADCcondSSBC Rd,Rn,operand2带进位减法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd,Rn,operand2带进位逆向减法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM数据处理指令算术运算 加法运算指令加法运算指令ADDADD指令将指令将operand2operand2的值与的值与RnRn的值相加,结果保的值相加,结果保存到存到RdR
48、d寄存器。指令格式如下:寄存器。指令格式如下:ADDcondS Rd,Rn,operand2 应用示例:应用示例:ADDS R1,R1,#1020;R1=R1+1020;R1=R1+1020,并影响标志位,并影响标志位 ADD R1,R1,R2,LSL#2;R1=R1+R22;R1=R1+R22 1/2/202348助记符说明操作条件码位置ADD Rd,Rn,operand2加法运算指令RdRn+operand2ADDcondSSUB Rd,Rn,operand2SUB Rd,Rn,operand2减法运算指令RdRn-operand2SUBcondSRSB Rd,Rn,operand2逆向减
49、法指令Rdoperand2-RnRSBcondSADC Rd,Rn,operand2带进位加法RdRn+operand2+CarryADCcondSSBC Rd,Rn,operand2带进位减法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd,Rn,operand2带进位逆向减法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM数据处理指令算术运算 减法运算指令减法运算指令SUBSUB指令用寄存器指令用寄存器RnRn减去减去operand2operand2,结果保存到,结果保存到RdRd中。指令格式如下:中。指令格式如下:SUBcondS
50、 Rd,Rn,operand2 应用示例:应用示例:SUBSR0,R0,#240;R0=R0-240;R0=R0-240,并影响标志位,并影响标志位 SUBSR2,R1,R2;R2=R1-R2;R2=R1-R2 ,并影响标志位,并影响标志位 1/2/202349助记符说明操作条件码位置ADD Rd,Rn,operand2加法运算指令RdRn+operand2ADDcondSSUB Rd,Rn,operand2减法运算指令RdRn-operand2SUBcondSRSB Rd,Rn,operand2RSB Rd,Rn,operand2逆向减法指令Rdoperand2-RnRSBcondSADC