ARM微处理器的指令集指令系统

上传人:M****1 文档编号:568232559 上传时间:2024-07-23 格式:PPT 页数:146 大小:1.29MB
返回 下载 相关 举报
ARM微处理器的指令集指令系统_第1页
第1页 / 共146页
ARM微处理器的指令集指令系统_第2页
第2页 / 共146页
ARM微处理器的指令集指令系统_第3页
第3页 / 共146页
ARM微处理器的指令集指令系统_第4页
第4页 / 共146页
ARM微处理器的指令集指令系统_第5页
第5页 / 共146页
点击查看更多>>
资源描述

《ARM微处理器的指令集指令系统》由会员分享,可在线阅读,更多相关《ARM微处理器的指令集指令系统(146页珍藏版)》请在金锄头文库上搜索。

1、ARM ARM 微处理器的指令集微处理器的指令集q1.ARM1.ARM处理器寻址方式处理器寻址方式q2.ARM2.ARM指令集指令集Resources : http:/assembler/ARM 微处理器的指令集微处理器的指令集nARM微处理器的工作状态有两种:微处理器的工作状态有两种:nARM状态,此时处理器执行32位的、字对齐的ARM指令;nThumb状态,此时处理器执行16位的、半字对齐的Thumb指令。n在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。ARM 微处理器的指令集微处理器的指令集ARM指令集

2、支持指令集支持ARM核所有的特性,具有高核所有的特性,具有高效、快速的特点。效、快速的特点。nThumb指令集具有灵活、小巧的特点。指令集具有灵活、小巧的特点。ARM状态下的寄存器组织(2)37个个32位寄存器,位寄存器,其中其中31个为通用寄存个为通用寄存器,器,6个为状态寄存个为状态寄存器。器。用户模式、用户模式、系统模式系统模式快速中断快速中断模式模式管理模式管理模式数据访问数据访问终止模式终止模式外部中断外部中断模式模式未定义指未定义指令中止模令中止模式式未分组寄存器R0R7n在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊用途。n在中断或异常处理进行运行模

3、式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。分组寄存器R8R12nR8R12:每个寄存器对应两个不同的物理寄存器n当使用fiq模式时,访问寄存器R8_fiqR12_fiq;n当使用除fiq模式以外的其他模式时,访问寄存器R8_usrR12_usr。分组寄存器R13R14R13、R14:每个寄存器对应每个寄存器对应6个不同的物理寄存器个不同的物理寄存器其中的一个是用户模式与系统模式共用,另外其中的一个是用户模式与系统模式共用,另外5个个物理寄存器对应于其他物理寄存器对应于其他5种不同的运行模式种不同的运行模式堆栈指针R

4、13R13在在ARM指令中常用作堆栈指针,但这只是一指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆种习惯用法,用户也可使用其他的寄存器作为堆栈指针。栈指针。在在Thumb指令集中,某些指令强制性的要求使用指令集中,某些指令强制性的要求使用R13作为堆栈指针。作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理由于处理器的每种运行模式均有自己独立的物理寄存器寄存器R13,在初始化部分,都要初始化每种模在初始化部分,都要初始化每种模式下的式下的R13,这样,当程序的运行进入异常模式这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入时,可以将需要保护的寄存器

5、放入R13所指向的所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复堆栈中恢复子程序连接寄存器R14子程序连接寄存器或连接寄存器子程序连接寄存器或连接寄存器LR。当执行当执行BL子程序调用指令时,可以从子程序调用指令时,可以从R14中得到中得到R15(程程序计数器序计数器PC)的备份。在每一种运行模式下,都可用的备份。在每一种运行模式下,都可用R14保存子程序的返回地址,当用保存子程序的返回地址,当用BL或或BLX指令调用子程序指令调用子程序时,将时,将PC的当前值拷贝给的当前值拷贝给R14,执行完子程序后,又将执行完子程序后,又将R14的值

6、拷贝回的值拷贝回PC,即可完成子程序的调用返回。即可完成子程序的调用返回。BLSUB1SUB1:STMFDSP!, , LR /*将将R14存入堆栈存入堆栈*/LDMFDSP!,PC/*完成子程序返回完成子程序返回 */程序计数器PC(R15)ARM状态下,位状态下,位1:0为为0,位,位31:2用于保存用于保存PC;Thumb状态下,位状态下,位0为为0,位,位31:1用于保存用于保存PC;R15虽然也可用作通用寄存器,但一般不这么使用虽然也可用作通用寄存器,但一般不这么使用,因为,因为对对R15的使用有一些特殊的限制,当违反了这些限制时,的使用有一些特殊的限制,当违反了这些限制时,程序的执

7、行结果是未知的。程序的执行结果是未知的。由于由于ARM体系结构采用了多级流水线技术,对于体系结构采用了多级流水线技术,对于ARM指指令集而言,令集而言,PC总是指向当前指令的下两条指令的地址,总是指向当前指令的下两条指令的地址,即即PC的值为当前指令的地址值加的值为当前指令的地址值加8个字节。个字节。程序状态寄存器(CPSR/SPSR)n寄存器R16用作CPSR(当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态当前处理器模式标志位,以及其他一些相关的控制和状态位。位。每一种运行

8、模式下又都有一个专用的物理状态寄存器,称每一种运行模式下又都有一个专用的物理状态寄存器,称为为SPSR(备份的程序状态寄存器),异常发生时,备份的程序状态寄存器),异常发生时,SPSR用于保存用于保存CPSR的值,从异常退出时则可由的值,从异常退出时则可由SPSR来恢复来恢复CPSR。由于用户模式和系统模式不属于异常模式,他们没有由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问当在这两种模式下访问SPSR,结果是未知的。结果是未知的。1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类 寻寻址址方方式式是是根根据据指指令令中中给给出出的的地地址址码码字字

9、段段来来实实现现寻寻找找真真实实操操作作数数地地址址的的方方式式。ARMARM处处理理器具有器具有9 9种基本寻址方式。种基本寻址方式。1. 1.寄存器寻址;寄存器寻址; 2. 2.立即寻址;立即寻址;3.3.寄存器移位寻址;寄存器移位寻址;4.4.寄存器间接寻址;寄存器间接寻址;5.5.基址寻址;基址寻址;6.6.多寄存器寻址;多寄存器寻址;7.7.堆栈寻址;堆栈寻址;8.8.块拷贝寻址;块拷贝寻址;9.9.相对寻址。相对寻址。 操操作作数数的的值值在在寄寄存存器器中中,指指令令中中的的地地址址码码字字段段指指出出的的是是寄寄存存器器编编号号,指指令令执执行行时时直直接接取取出出寄寄存存器器

10、值值来来操操作作。寄寄存存器器寻寻址址指指令令举举例如下:例如下: MOV R1,R2 ;将将R2的值存入的值存入R1 SUB R0,R1,R2 ;将将R1的的值值减减去去R2的的值,结果保存到值,结果保存到R0 0xAA0x55R2R11 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类寄存器寻址寄存器寻址MOV R1,R20xAA 立立即即寻寻址址指指令令中中的的操操作作码码字字段段后后面面的的地地址址码码部部分分即即是是操操作作数数本本身身,也也就就是是说说,数数据据就就包包含含在在指指令令当当中中,取取出出指指令令也也就就取取出出了了可可以以立立即即使使用用的的操操作作数数

11、( (这这样样的的数数称称为为立即数立即数) )。立即寻址指令举例如下:。立即寻址指令举例如下: SUBSR0,R0,#1 ;R0减减1,结结果果放入放入R0,并且影响标志位,并且影响标志位MOV R0,#0xFF000 ;将将立立即即数数0xFF000装入装入R0寄存器寄存器 0x55R0MOV R0,#0xFF00程序存储1 ARM处理器寻址方式处理器寻址方式n寻址方式分类立即寻址MOV R0,#0xFF000xFF00从代码中获得数据 寄寄存存器器移移位位寻寻址址是是ARMARM指指令令集集特特有有的的寻寻址址方方式式。当当第第2 2个个操操作作数数是是寄寄存存器器移移位位方方式式时时,

12、第第2 2个个寄寄存存器器操操作作数数在在与与第第1 1个个操操作作数数结结合合之之前前,选选择择进进行行移移位位操操作作。寄寄存存器器移位寻址指令举例如下:移位寻址指令举例如下:MOV R0,R2,LSL #3;R2的的值值左左移移3位位,结结果果放放入入R0, ;即是即是R0=R28 ANDSR1,R1,R2,LSL R3;R2的值左移的值左移R3位,然后位,然后 ;和和R1相相“与与”操作,结果放入操作,结果放入R10x55R0R20x011 ARM处理器寻址方式处理器寻址方式n寻址方式分类寄存器移位寻址MOV R0,R2,LSL #30x080x08逻辑左移3位 寄寄存存器器间间接接寻

13、寻址址指指令令中中的的地地址址码码给给出出的的是是一一个个通通用用寄寄存存器器的的编编号号,所所需需的的操操作作数数保保存存在在寄寄存存器器指指定定地地址址的的存存储储单单元元中中,即即寄寄存存器器为为操操作作数的地址指针。例如:数的地址指针。例如: LDR R1,R2 ;将将R2指向的存储单元的数据指向的存储单元的数据;读出保存在读出保存在R1中中 SWP R1,R1,R2 ;将寄存器将寄存器R1的值和的值和R2;指定的存储单元的内容交换指定的存储单元的内容交换 0x55R0R2 0x400000000xAA0x400000001 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类

14、寄存器间接寻址寄存器间接寻址LDR R0,R20xAA 基基址址寻寻址址就就是是将将基基址址寄寄存存器器的的内内容容与与指指令令中中给给出出的的偏偏移移量量(4K4K)相相加加/ /减减,形形成成操操作作数数的的有有效效地地址址。基基址址寻寻址址用用于于访访问问基基址址附附近近的的存存储储单单元元,常常用用于于查查表表、数数组组操操作作、功功能能部部件件寄寄存存器器访访问问等等。寄寄存存器器间间接接寻寻址址是偏移量为是偏移量为0 0的基址加偏移寻址。的基址加偏移寻址。基址寻址指令举例如下基址寻址指令举例如下( (前索引寻址前索引寻址) ): LDR R2,R3,#0x0C ;读取读取R3+0x

15、0C地址上的地址上的 ;存储单元的内容,放入存储单元的内容,放入R2 STR R1,R0,#-4!;先先R0=R0-4,然后把,然后把R1的值的值;寄存到保存到寄存到保存到R0指定的存储单元指定的存储单元 1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类基址寻址基址寻址0x55R2R3 0x400000000xAA0x4000000CLDR R2,R3,#0x0C0xAA将R3+0x0C作为地址装载数据 基址寻址指令举例如下:基址寻址指令举例如下: LDR R0,R1,#4;R0=R1,R1R14 ;后索引基址寻址后索引基址寻址 LDR R0,R1,R2 ;R0=R1+R21

16、ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类基址寻址基址寻址 多多寄寄存存器器寻寻址址一一次次可可传传送送几几个个寄寄存存器器值值,允允许许一一条条指指令令传传送送1616个个寄寄存存器器的的任任何何子子集集或或所所有有寄寄存器。多寄存器寻址指令举例如下:存器。多寄存器寻址指令举例如下: LDMIAR1!,R2-R7,R12 ;将将R1指指向向的的单单元元中中的的数数据据读读出出到到R2R7、R12中中(R1自自动动加加4) STMIAR0!,R2-R7,R12 ;将将寄寄存存器器R2R7、R12的的值值保保存存到到R0指指向向的的存存储储; 单单元元中中(R0自动加自动加4)

17、0x40000000R1R20x?0x010x400000000x?R3R40x?R60x?0x020x030x040x400000040x400000080x4000000C存储器1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类多寄存器寻址多寄存器寻址LDMIA R1!,R2-R4,R6 0x010x020x030x040x40000010 堆堆栈栈是是一一个个按按特特定定顺顺序序进进行行存存取取的的存存储储区区,操操作作顺顺序序为为“后后进进先先出出” ” 。堆堆栈栈寻寻址址是是隐隐含含的的,它它使使用用一一个个专专门门的的寄寄存存器器( (堆堆栈栈指指针针) )指指向向一

18、一块块存存储储区区域域( (堆堆栈栈) ),指指针针所所指指向向的的存存储储单单元元即即是是堆堆栈栈的的栈栈顶顶。存存储器堆栈可分为两种:储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈向下生长:向低地址方向生长,称为递减堆栈1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类堆栈寻址堆栈寻址1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类堆栈寻址堆栈寻址栈底栈底栈顶栈顶栈区栈区SP堆栈存堆栈存储区储区栈顶栈顶栈底栈底栈区栈区SP向下向下增长增长向上向上增长增长0x1234

19、56780x12345678堆栈压栈堆栈压栈堆栈压栈堆栈压栈栈顶SP栈顶SP栈底栈底空堆栈空堆栈栈底栈底满堆栈满堆栈 堆堆栈栈指指针针指指向向最最后后压压入入的的堆堆栈栈的的有有效效数数据据项项,称称为为满满堆堆栈栈;堆堆栈栈指指针针指指向向下下一一个个待待压入数据的空位置,称为压入数据的空位置,称为空堆栈空堆栈。 1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类堆栈寻址堆栈寻址0x123456780x12345678栈顶栈顶SP0x12345678栈顶栈顶SP压栈压栈压栈压栈所以可以组合出四种类型的堆栈方式:所以可以组合出四种类型的堆栈方式:满满递递增增:堆堆栈栈向向上上增增

20、长长,堆堆栈栈指指针针指指向向内内含含有有效效数数据项的最高地址。指令如据项的最高地址。指令如LDMFALDMFA、STMFASTMFA等;等; 空空递递增增:堆堆栈栈向向上上增增长长,堆堆栈栈指指针针指指向向堆堆栈栈上上的的第第一个空位置。指令如一个空位置。指令如LDMEALDMEA、STMEASTMEA等;等; 满满递递减减:堆堆栈栈向向下下增增长长,堆堆栈栈指指针针指指向向内内含含有有效效数数据项的最低地址。指令如据项的最低地址。指令如LDMFDLDMFD、STMFDSTMFD等;等;空空递递减减:堆堆栈栈向向下下增增长长,堆堆栈栈指指针针向向堆堆栈栈下下的的第第一一个空位置。指令如个空

21、位置。指令如LDMEDLDMED、STMEDSTMED等。等。 1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类堆栈寻址堆栈寻址 多多寄寄存存器器传传送送指指令令用用于于将将一一块块数数据据从从存存储储器的某一位置拷贝到另一位置。器的某一位置拷贝到另一位置。 如:如:STMIAR0!,R1-R7;将将R1R7的的数数据据保保存存到到存存储储器器中中。存存储储指指针针R0在在保保存存第第一一个个值值之之后后增加,增长方向为向上增长。增加,增长方向为向上增长。1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类块拷贝寻址块拷贝寻址 相相对对寻寻址址是是基基址址寻寻址址的

22、的一一种种变变通通。由由程程序序计计数数器器PCPC提提供供基基准准地地址址,指指令令中中的的地地址址码码字字段段作作为为偏偏移移量量,两两者者相相加加后后得得到到的的地地址址即即为为操操作作数数的的有有效效地地址址。相对寻址指令举例如下:相对寻址指令举例如下: BL SUBR1;调用到调用到SUBR1子程序子程序 BEQLOOP;条件跳转到条件跳转到LOOP标号处标号处 .LOOP MOVR6,#1.SUBR1. 1 ARM处理器寻址方式处理器寻址方式n寻址方式分类寻址方式分类相对寻址相对寻址n1 ARM指令集指令集 简单的简单的ARM程序程序;文件名:文件名:TEST1.S;功能:实现两个

23、寄存器相加功能:实现两个寄存器相加 ;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段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 ;文件文件结结束束 使用“;”进

24、行注释标号顶格写实际代码段声明文件结束n简单的ARM程序;文件名:文件名:TEST1.S ;功能:实现两个寄存器相加功能:实现两个寄存器相加 ;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令START MOVR0,#0 ;设置参数设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序调用子程序ADD_SUB BLOOP ;跳转到跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R

25、0 = R0 + R1 MOVPC,LR ;子程序返回子程序返回 END ;文件文件结结束束 ARM指令小节目录指令小节目录1.1.指令格式指令格式2.2.条件码条件码3.3.存储器访问指令存储器访问指令4.4.数据处理指令数据处理指令5.5.乘法指令乘法指令6.ARM6.ARM分支指令分支指令7.7.杂项指令杂项指令8.8.伪指令伪指令 ARM ARM是三地址指令格式,指令的基本格式如下:是三地址指令格式,指令的基本格式如下:1 ARM指令集介绍指令集介绍nARM指令集指令集基本基本指令格式指令格式 S , 其其中中号号内内的的项项是是必必须须的的, 号号内内的的项项是是可可选选的的。各项的

26、说明如下:各项的说明如下:opcode:指令助记符;:指令助记符;cond:执行条件;执行条件;S:是否影响:是否影响CPSRCPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器; Rn:第:第1 1个操作数的寄存器;个操作数的寄存器;operand2:第:第2 2个操作数;个操作数;指令语法指令语法目标寄存器目标寄存器(Rd)源寄存器源寄存器1(Rn)源寄存器源寄存器2(Rm)ADD r3,r1,r2r3r1r2例例: ARMARM指令的基本格式如下:指令的基本格式如下:1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数 S , 灵灵活活的的使使用用第第2 2

27、个个操操作作数数“operand2”能能够够提高代码效率。它有如下的形式:提高代码效率。它有如下的形式:#immed_8r#immed_8r常数表达式;常数表达式;RmRm寄存器方式;寄存器方式;Rm,shiftRm,shift寄存器移位方式;寄存器移位方式;1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数#immed_8r#immed_8r常数表达式常数表达式例如:例如:ANDR1,R2,#0x0F说明:说明:ADD条件条件S , , dest = op_1 + op_2 ADD将把两个操作数加起来,把结果放置到目的寄存器中。将把两个操作数加起来,把结果放置到目的寄存

28、器中。操操作作数数 1 是是一一个个寄寄存存器器,操操作作数数 2 可可以以是是一一个个寄寄存存器器,被被移移位位的的寄寄存存器,或一个立即值器,或一个立即值: 1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数RmRm寄存器方式寄存器方式 在在寄寄存存器器方方式式下下,操操作作数数即即为为寄寄存存器的数值。器的数值。例如:例如:SUB R1,R1,R2说明:说明:SUBSUB条件条件S S , , , , destdest = op_1 - op_2 = op_1 - op_2 1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数Rm,shiftRm

29、,shift寄存器移位方式寄存器移位方式 将将寄寄存存器器的的移移位位结结果果作作为为操操作作数数(移移位位操操作作不不消消耗耗额额外外的的时时间间),但但RmRm值值保保持持不不变变,移移位方法如下:位方法如下:ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 1) 操作码操作码说明说明操作码操作码说明说明ASR #n算术右移算术右移n位位ROR #n循环右移循环右移n位位LSL #n逻辑左移逻辑左移n位位RRX带扩展的循环右移带扩展的循环右移1位位LSR #n逻辑右移逻辑右移n位位1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数LSL移位操作

30、:移位操作:0LSR移位操作:移位操作:0ASR移位操作:移位操作:ROR移位操作:移位操作:RRX移位操作:移位操作:CArithmetic Shift Right Logic Shift RightLogic Shift LeftRotate Right 1 ARM指令集介绍指令集介绍nARM指令集指令集第第2个操作数个操作数Rm,shiftRm,shift寄存器移位方式寄存器移位方式例如:例如:ADDR1,R1,R1,LSL #3 ;R1=R1+R1R3 ARM ARM指令的基本格式如下:指令的基本格式如下:1 ARM指令集介绍指令集介绍nARM指令集指令集条件码条件码 S , 使使用用

31、条条件件码码“cond”可可以以实实现现高高效效的的逻逻辑辑操操作作( (节节省省跳转和条件语句跳转和条件语句) ),提高代码效率。,提高代码效率。 所所有有的的ARMARM指指令令都都可可以以条条件件执执行行,而而ThumbThumb指指令令只只有有B B(跳跳转转)指指令令具具有有条条件件执执行行功功能能。如如果果指指令令不不标标明条件代码,将默认为无条件(明条件代码,将默认为无条件(ALAL)执行。)执行。操作码操作码条件助记符条件助记符标志标志含义含义0000EQZ=1相等相等0001NEZ=0不相等不相等0010CS/HSC=1无符号数大于或等于无符号数大于或等于0011CC/LOC

32、=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任何任何无条件执行无条件执行 (指令默认条件指令默认条件) 1111NV任何任何从不执行从不执行(不要使用不

33、要使用) 指令条件码表1 ARM指令集介绍指令集介绍nARM指令集指令集条件码条件码C C代码:代码:If(a b)a+;Elseb+;对应的汇编代码:对应的汇编代码:CMPR0,R1 ;R0(a)与)与R1(b)比较)比较ADDHI R0,R0,#1 ;若若R0R1,则,则R0=R0+1ADDLS R1,R1,#1 ;若若R01,则,则R1=R1+1示例:示例:CMP R1, R2 ;SET C ON R1-R2CMN R1, R2 ; SET C ON R1+R2TST R1, R2 ; SET C ON R1 AND R2TEQ R1, R2 ; SET C ON R1 XOR R21

34、ARM指令集介绍指令集介绍nARM指令集指令集存储器访问指令存储器访问指令 ARMARM处处理理器器是是典典型型的的RISCRISC处处理理器器,对对存存储储器器的的访访问问只只能能使使用用加加载载和和存存储储指指令令实实现现。RAMRAM存存储储空空间间及及I/OI/O映映射射空空间间统统一一编编址址,除除对对RAMRAM操操作作以以外外,对对外外围围IOIO、程程序序数数据据的的访访问均要通过加载问均要通过加载/ /存储指令进行。存储指令进行。 存存储储器器访访问问指指令令分分为为单单寄寄存存器器操操作作指指令令和和多寄存器操作指令多寄存器操作指令。助记符助记符说明说明操作操作条件码位置条

35、件码位置LDR Rd,addressing 加载字数据加载字数据RdRdaddressingaddressing,addressingaddressing索引索引LDRcondLDRcondLDRB Rd,addressing 加载无符号字节数据加载无符号字节数据RdRdaddressingaddressing,addressingaddressing索引索引LDRcondBLDRcondBLDRT Rd,addressing以用户模式加载字数据以用户模式加载字数据RdRdaddressingaddressing,addressingaddressing索引索引LDRcondTLDRcondT

36、LDRBT Rd, addressing 以用户模式加载无符号以用户模式加载无符号字节数据字节数据RdRdaddressingaddressing,addressingaddressing索引索引LDRcondBTLDRcondBTLDRH Rd, addressing 加载无符号半字数据加载无符号半字数据RdRdaddressingaddressing,addressingaddressing索引索引LDRcondHLDRcondHLDRSB Rd, addressing 加载有符号字节数据加载有符号字节数据RdRdaddressingaddressing,addressingaddress

37、ing索引索引LDRcondSBLDRcondSBLDRSH Rd, addressing加载有符号半字数据加载有符号半字数据 Rdaddressing,addressing索引索引 LDRcondSH ARM存储器访问指令存储器访问指令单寄存器加载单寄存器加载助记符助记符说明说明操作操作条件码位置条件码位置STR Rd, addressing 存储字数据存储字数据addressingaddressingRdRd,addressingaddressing索引索引STRcondSTRcondSTRB Rd,addressing 存储字节数据存储字节数据addressingaddressingRd

38、Rd,addressingaddressing索引索引STRcondBSTRcondBSTRT Rd,addressing 以以用用户户模模式式存存储储字字数数据据addressingaddressingRdRd, addressingaddressing索引索引STRcondTSTRcondTSTRBT Rd,addressing 以以用用户户模模式式存存储储字字节节数据数据addressingaddressingRdRd,addressingaddressing索引索引STRcondBTSTRcondBTSTRH Rd,addressing 存储半字数据存储半字数据addressing a

39、ddressing RdRd,addressingaddressing索引索引STRcondHSTRcondHARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储 LDR/STRLDR/STR指指令令用用于于对对内内存存变变量量的的访访问问、内内存存缓缓冲冲区区数数据据的的访访问问、查查表表、外外围围部部件件的的控控制制操操作作等等。若若使使用用LDRLDR指指令令加加载载数数据据到到PCPC寄寄存存器器,则则实实现现程程序跳转功能,这样也就实现了程序散转。序跳转功能,这样也就实现了程序散转。 所所有有单单寄寄存存器器加加载载/ /存存储储指指令令可可分分为为“字字和和无无符符号号字字节

40、节加加载载存存储储指指令令”和和“半字和有符号字节加载存储指令。半字和有符号字节加载存储指令。LDRLDR和和STRSTR字和无符号字节加载字和无符号字节加载/ /存储指令存储指令 LDRLDR指指令令用用于于从从内内存存中中读读取取单单一一字字或或字字节节数数据据存存入入寄寄存存器器中中,STRSTR指指令令用用于于将将寄寄存存器器中中的的单单一一字或字节数据保存到内存。指令格式如下:字或字节数据保存到内存。指令格式如下:ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储 LDRcondTRd, ;将指定地址上的将指定地址上的字数据字数据读入读入Rd STRcondTRd, ;将将R

41、d中的字数据存入指定地址中的字数据存入指定地址 LDRcondBTRd, ;将指定地址上的将指定地址上的字节数据字节数据读入读入Rd STRcondBTRd, ;将将Rd中的字节数据存入指定地址中的字节数据存入指定地址 其其中中,T T为为可可选选后后缀缀。若若指指令令有有T T,那那么么即即使使处处理理器器是是在在特特权权模模式式下下,存存储储系系统统也也将将访访问问看看成成是是在在用用户户模模式式下下进进行行的的。T T在在用用户户模模式式下下无无效效,不不能能与与前索引偏移一起使用前索引偏移一起使用T T。 ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储LDRLDR和和STR

42、STR字和无符号字节加载字和无符号字节加载/ /存储指令编码存储指令编码指令执行的条件码指令执行的条件码I I为为0 0时时,偏偏移移量量为为1212位位立立即即数数,为为1 1时时,偏偏移移量量为为寄寄存存器器移移位位P P表示前表示前/ /后变址后变址U表示加/减B B为为1 1表表示示字字节节访访问问,为为0 0表示字访问表示字访问WW表示回写表示回写为指令的寻址方式为指令的寻址方式RdRd为源为源/ /目标寄存器目标寄存器RnRn为基址寄存器为基址寄存器L L用用于于区区别别加加载载(L L为为1 1)或存储(或存储(L L为为0 0)ARM存储器访问指令存储器访问指令单寄存器存储单寄

43、存器存储LDRLDR和和STRSTR字和无符号字节加载字和无符号字节加载/ /存储指令存储指令 LDR/STRLDR/STR指指令令寻寻址址非非常常灵灵活活,它它由由两两部部分分组组成成,其其中中一一部部分分为为一一个个基基址址寄寄存存器器,可可以以为为任任一一个个通通用用寄寄存存器器;另另一一部部分分为为一一个个地地址址偏偏移移量量。地址偏移量有以下地址偏移量有以下3 3种格式:种格式: 立立即即数数。立立即即数数可可以以是是一一个个无无符符号号的的数数值值。这这个个数数据据可可以以加加到到基基址址寄寄存存器,也可以从基址寄存器中减去这个数值。器,也可以从基址寄存器中减去这个数值。 如:如:

44、LDR R1,R0,#0x12 ;R1-R0+0x12寄寄存存器器。寄寄存存器器中中的的数数值值可可以以加加到到基基址址寄寄存存器器,也也可可以以从从基基址址寄寄存存器器中中减去这个数值。减去这个数值。 如:如:LDR R1,R0,R2 ; R1-R0+R2 LDR R1,R0,-R2 ; R1-R0-R2寄寄存存器器及及移移位位常常数数。寄寄存存器器移移位位后后的的值值可可以以加加到到基基址址寄寄存存器器,也也可可以以从从基址寄存器中减去这个数值。基址寄存器中减去这个数值。 如:如:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4 LDRLDR和和STRSTR半字和有符号字节加

45、载半字和有符号字节加载/ /存储指令存储指令 这这类类LDR/STRLDR/STR指指令令可可加加载载有有符符号号半半字字或或字字节节,可可加加载载/ /存存储储无无符符号号半半字字。偏偏移移量量格格式式、寻寻址址方方式式与与加载加载/ /存储字和无符号字节指令相同。存储字和无符号字节指令相同。 ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储 LDRcondSB Rd,;将指定地址上的将指定地址上的有符号字节有符号字节读入读入Rd LDRcondSH Rd,;将指定地址上的将指定地址上的有符号半字有符号半字读入读入Rd LDRcondH Rd,;将指定地址上的将指定地址上的半字数据

46、半字数据读入读入Rd STRcondH Rd,;将将Rd中的中的半字数据存入半字数据存入指定地址指定地址注意注意:1. 1.有有符符号号位位半半字字/ /字字节节加加载载是是指指用用符符号号位位加加载载扩扩展展到到3232位位,无无符符号号半半字字加加载载是是指用零扩展到指用零扩展到3232位;位;2.2.半字读写的指定地址必须为半字读写的指定地址必须为偶数偶数,否则将产生不可靠的结果;,否则将产生不可靠的结果;ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储LDRLDR和和STRSTR半字和有符号字节加载半字和有符号字节加载/ /存储指令编码存储指令编码指令执行的条件码指令执行的条

47、件码I I为为0 0时时,偏偏移移量量为为1212位位立立即即数数,为为1 1时时,偏偏移移量量为为寄寄存存器器移移位位P P表示前表示前/ /后变址后变址U U表示加表示加/ /减减WW表示回写表示回写为指令的寻址方式为指令的寻址方式RdRd为源为源/ /目标寄存器目标寄存器RnRn为基址寄存器为基址寄存器L L用用于于区区别别加加载载(L L为为1 1)或存储(或存储(L L为为0 0)S S为为1 1表表示示有有符符号号访访问问,为为0 0表示无符号访问表示无符号访问H H为为1 1表表示示半半字字访访问问,为为0 0表示字节访问表示字节访问LDRLDR和和STRSTR指令应用示例:指令

48、应用示例:1. 1.加载加载/ /存储字和无符号字节指令存储字和无符号字节指令LDRR2,R5;将将R5指向地址的字数据存入指向地址的字数据存入R2STRR1,R0,#0x04;将将R1的数据存储到的数据存储到R0+0x04地址地址LDRBR3,R2,#-1 ;将将R2指向地址的字节数据存入指向地址的字节数据存入R3,R2R21STRBR0,R3,-R8 ASR 2 ;R0-R3-R8/4,存储存储R0的最低有效字节的最低有效字节2.2.加载加载/ /存储半字和有符号字节指令存储半字和有符号字节指令LDRSB R1,R0,R3;将将R0+R3地址上的字节数据存入地址上的字节数据存入R1,;高高

49、24位用符号扩展位用符号扩展LDRH R6,R2,#2;将将R2指向地址的半字数据存入指向地址的半字数据存入R6,高,高16位用位用0扩展扩展;读出后,读出后,R2=R2+2STRH R1,R0,#2!;将将R1的半字数据保存到的半字数据保存到R0+2地址,地址,;只修改低只修改低2字节数据,然后字节数据,然后R0=R0+2ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储n(3 3)LDRLDR和和STR STR -双双字字:加加载载/ /存存储储两两个个相相邻的寄存器,邻的寄存器,6464位双字。其句法有位双字。其句法有4 4种:种:nOp cond D RdOp cond D R

50、d,Rn Rn 零偏移零偏移nOp cond D RdOp cond D Rd,RnRn,offset ! offset ! 前索引偏移前索引偏移nOp cond D RdOp cond D Rd,label label 程序相对偏移程序相对偏移nOp cond D T Rd,Rn,offset 后索引偏移后索引偏移 ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储 其中:其中: RdRd加加 载载 / /存存 储储 寄寄 存存 器器 中中 的的 一一 个个 , 另另 一一 个个 是是R R(d+1d+1)。)。RdRd必须是偶数寄存器,且不是必须是偶数寄存器,且不是R14R14。

51、RnRn除除非非指指令令为为零零偏偏移移,或或不不带带写写回回的的前前索索引引,否则,否则,RnRn不允许与不允许与RdRd和和R R(d+1d+1)相同。)相同。 labellabellabellabel必必须须是是在在当当前前指指令令的的上上下下252252字字节节范范围内。围内。例如:例如:LDRD R6LDRD R6,R11 R11 ;R6R11R6R11,R7R11+4R7R11+4STRD R4,R9,#24 ;R4R9+24,R5R9+28ARM存储器访问指令存储器访问指令单寄存器存储单寄存器存储助记符助记符说明说明操作操作条件码位置条件码位置LDMmode Rn!,reglis

52、t 多寄存器加载多寄存器加载reglistreglistRn.Rn., RnRn回写等回写等LDMcondLDMcondmodemodeSTMmode Rn!,reglist 多寄存器存储多寄存器存储Rn.reglist,RnRn.reglist,Rn回写等回写等STMcondSTMcondmodemodeARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取 多多寄寄存存器器加加载载/ /存存储储指指令令可可以以实实现现在在一一组组寄寄存存器器和和一一块块连连续续的的内内存存单单元元之之间间传传输输数数据据。LDMLDM为为加加载载多多个个寄寄存存器器;STMSTM为为存存储储多多个个寄

53、寄存存器器。允允许许一一条条指指令令传传送送1616个个寄寄存存器器的的任任何何子子集集或或所所有有寄寄存存器器。它它们们主主要要用用于于现现场场保保护护、数数据据复制、常数传递等。复制、常数传递等。ARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取 多寄存器加载多寄存器加载/ /存储指令格式如下:存储指令格式如下: LDMcond Rn!,reglist STMcond Rn!,reglistcondcond:指令执行的条件;指令执行的条件;模式模式:控制地址的增长方式,一共有:控制地址的增长方式,一共有8 8种模式;种模式;! !:表示在操作结束后,将最后的地址写回:表示在操作结束

54、后,将最后的地址写回RnRn中;中;reglistreglist :表表示示寄寄存存器器列列表表,可可以以包包含含多多个个寄寄存存器器,它它们们使使用用“, ,”隔隔开开,如如R1,R2,R6-R9R1,R2,R6-R9,寄存器由小到大排列;寄存器由小到大排列;:可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能:可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能:1 1)若若opop是是LDMLDM且且寄寄存存器器列列表表包包含含R15R15时时,那那么么除除了了正正常常的的多多寄寄存存器器传传送送外外,还将还将SPSRSPSR也复制到也复制到CPSRCPSR中。这用于异常处

55、理返回,仅在异常模式下使用。中。这用于异常处理返回,仅在异常模式下使用。2 2)如如寄寄存存器器列列表表包包含含R15R15时时,数数据据传传入入或或传传出出的的是是用用户户模模式式下下的的寄寄存存器器,而而不是当前模式的寄存器。不是当前模式的寄存器。ARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取LDMLDM和和STMSTM多寄存器加载多寄存器加载/ /存储指令编码存储指令编码指令执行的条件码指令执行的条件码S S对对 应应 于于 指指 令令 中中 的的”符号符号P P表示前表示前/ /后变址后变址U U表示加表示加/ /减减WW表示回写表示回写寄存器列表寄存器列表RnRn为基址寄

56、存器为基址寄存器L L用用于于区区别别加加载载(L L为为1 1)或存储(或存储(L L为为0 0)ARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取 多多寄寄存存器器加加载载/ /存存储储指指令令的的8 8种种模模式式如如下下表表所所示示,右右边边四四种种为为堆堆栈栈操作、左边四种为数据传送操作。操作、左边四种为数据传送操作。模式模式说明说明模式模式说明说明IA每次传送后地址加每次传送后地址加4FD满递减堆栈满递减堆栈IB每次传送前地址加每次传送前地址加4ED空递减堆栈空递减堆栈DA每次传送后地址减每次传送后地址减4FA满递增堆栈满递增堆栈DB每次传送前地址减每次传送前地址减4EA空

57、递增堆栈空递增堆栈数据块传送操作数据块传送操作堆栈操作堆栈操作 进进行行数数据据复复制制时时,先先设设置置好好源源数数据据指指针针和和目目标标指指针针,然然后后使使用用块块拷拷贝贝寻寻址址指指令令LDMIA/STMIALDMIA/STMIA、LDMIB/STMIBLDMIB/STMIB、LDMDA/STMDALDMDA/STMDA、LDMDB/STMDBLDMDB/STMDB进行读取和存储进行读取和存储 。 进进行行堆堆栈栈操操作作操操作作时时,要要先先设设置置堆堆栈栈指指针针(SPSP),然然后后使使用用堆堆栈栈寻寻 址址 指指 令令 STMFD/LDMFD STMFD/LDMFD 、 ST

58、MED/LDMEDSTMED/LDMED、 STMFA/LDMFASTMFA/LDMFA和和STMEA/LDMEASTMEA/LDMEA实现堆栈操作。实现堆栈操作。ARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取数数据据块块传传送送指指令令操操作作过过程程如如右右图图所所示示,其其中中R1R1为为指指令令执执行行前前的的基基址址寄寄存存器器,R1R1则则为为指指令令执执行行后后的基址寄存器。的基址寄存器。R5R6R7R1R1指令STMIAR1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1R1指令STMDAR1!,R5-R74008H4004

59、H4000H4014H4010H400CHR5R6R7R1R1指令STMIBR1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1R1指令STMDBR1!,R5-R74008H4004H4000H4014H4010H400CHARM存储器访问指令存储器访问指令多寄存器存取多寄存器存取数据块传送数据块传送存储存储堆栈操作堆栈操作压栈压栈说明说明数据块传送数据块传送加载加载堆栈操作堆栈操作出栈出栈说明说明STMDASTMED空递减空递减LDMDALDMFA满递减满递减STMIASTMEA空递增空递增LDMIALDMFD满递增满递增STMDBSTMFD满递减满

60、递减LDMDBLDMEA空递减空递减STMIBSTMFA满递增满递增LDMIBLDMED空递增空递增;使用数据块传送指令进行堆栈操作使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆栈指令进行堆栈操作使用堆栈指令进行堆栈操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R6 两两段段代代码码的的执执行行结结果果是是一一样样的的,但但是是使使用用堆堆栈栈指指令令的的压压栈栈和和出出栈栈操操作作编编程程很很简简单单(只只要要前前后后一一致致即即可可),而而使使用用数数据据块块指指令令进进行行压压栈栈和出栈操作则需要考虑空与满

61、、加与减对应的问题。和出栈操作则需要考虑空与满、加与减对应的问题。 堆堆栈栈操操作作(详详见见“4.1 4.1 寻寻址址方方式式堆堆栈栈寻寻址址”)和和数数据据块块传传送送指指令令类似,也有类似,也有4 4种模式,它们之间的关系如下表所示:种模式,它们之间的关系如下表所示:助记符助记符说明说明操作操作条件码位置条件码位置SWP Rd,Rm,Rn 寄寄存存器器和和存存储储器器字字数数据交换据交换RdRdRnRn,RnRnRm Rm (Rn(RnRdRd或或Rm)Rm)SWPcondSWPcondSWPB Rd,Rm,Rn 寄寄存存器器和和存存储储器器字字节节数据交换数据交换RdRdRnRn,Rn

62、RnRm Rm (Rn(RnRdRd或或Rm)Rm)SWPcondBSWPcondBARMARM存储器访问指令存储器访问指令寄存器和存储器交换指令寄存器和存储器交换指令 SWPSWP指指令令用用于于将将一一个个内内存存单单元元( (该该单单元元地地址址放放在在寄寄存存器器RnRn中中) )的的内内容容读读取取到到一一个个寄寄存存器器RdRd中中,同同时时将将另另一一个个寄寄存存器器RmRm的的内内容容写写入入到该内存单元中。使用到该内存单元中。使用SWPSWP可实现信号量操作。可实现信号量操作。 指令格式如下:指令格式如下:SWPcondB Rd,Rm,Rn 其其中中,B B为为可可选选后后缀

63、缀,若若有有B B,则则交交换换字字节节,否否则则交交换换3232位位字字;RdRd用用于于保保存存从从存存储储器器中中读读入入的的数数据据;RmRm的的数数据据用用于于存存储储到到存存储储器器中中,若若RmRm与与RdRd相相同同,则则为为寄寄存存器器与与存存储储器器内内容容进进行行互互换换;RnRn为为要要进行数据交换的存储器地址,进行数据交换的存储器地址,RnRn不能与不能与RdRd和和RmRm相同。相同。 ARMARM存储器访问指令存储器访问指令寄存器和存储器交换指令寄存器和存储器交换指令SWPSWP和和SWPBSWPB寄存器和存储器交换指令编码寄存器和存储器交换指令编码指令执行的条件

64、码指令执行的条件码B B用用于于区区别别无无符符号号字字节节(B B为为1 1)或字(或字(B B为为0 0)RmRm源寄存器源寄存器RdRd目标寄存器目标寄存器RnRn为基址寄存器为基址寄存器SWPSWP指令应用示例:指令应用示例:SWPR1,R1,R0; ;将将R1R1的的内内容容与与R0R0指指向向的的存存储储单单元元的的内内容互换容互换 SWPB R1,R2,R0; ;将将R0R0指指向向的的存存储储单单元元低低字字节节数数据据读读取取到到R1R1中中 ; ;( (高高2424位清零位清零) ),并将,并将R2R2的内容写到该内存单元中的内容写到该内存单元中( (最低字节有效最低字节有

65、效) ) 1 ARM指令集介绍指令集介绍nARMARM指令集指令集ARMARM数据处理指令数据处理指令 数据处理指令大致可分为数据处理指令大致可分为3 3类:类: 数据传送指令;数据传送指令;算术逻辑运算指令;算术逻辑运算指令;比较指令。比较指令。 数数据据处处理理指指令令只只能能对对寄寄存存器器的的内内容容进进行行操操作作,而而不不能能对对内内存存中中的的数数据据进进行行操操作作。所所有有ARMARM数数据据处处理理指指令令均均可可选选择择使使用用S S后后缀缀,以以使使指令影响状态标志。指令影响状态标志。 ARM数据处理指令指令编码指令执行的条件码I用于区别立即数(I为1)和寄存器移位(I

66、为0)opcode数据处理指令操作码第二操作数Rd目标寄存器Rn第一操作数寄存器S设置条件码,与指令中的S位对应带进位加法ADC0101带进位减法指令SBC0110带进位逆向减法指令RSC0111位测试指令TST1000相等测试指令TEQ1001比较指令CMP1010负数比较指令CMN1011逻辑或操作指令ORR1100数据传送MOV1101位清除指令BIC1110数据非传送MVN1111加法运算指令ADD0100逆向减法指令RSB0011减法运算指令SUB0010逻辑异或操作指令EOR0001逻辑与操作指令AND0000说明指令助记符操作码opcode操作码功能表助记符助记符说明说明操作操作

67、条件码位置条件码位置MOV Rd,operand2 Rd,operand2数据传送数据传送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2 Rd,operand2数据非传送数据非传送RdRd(operand2)(operand2)MVNcondSMVNcondS ARMARM数据处理指令数据处理指令数据传送数据传送注:当后缀注:当后缀S S时,这些指令根据结果更新标时,这些指令根据结果更新标志志N N和和Z Z,在计算,在计算Operand2Operand2时更新标志时更新标志C C,不,不影响标志影响标志V V。助记符助记符说明说明

68、操作操作条件码位置条件码位置MOV Rd,operand2 Rd,operand2数据传送数据传送RdRdoperand2 operand2 MOVcondSMOVcondSMVN Rd,operand2 Rd,operand2数据非传送数据非传送RdRd(operand2)(operand2)MVNcondSMVNcondSARMARM数据处理指令数据处理指令数据传送数据传送 MOVMOV指指 令令 将将 8 8位位 图图 立立 即即 数数 ( 参参 看看 “第第 2 2操操 作作 数数 :#immed_8r#immed_8r常常数数表表达达式式 ”)或或寄寄存存器器传传送送到到目目标标寄寄

69、存存器器(RdRd),可用于移位运算等操作。指令格式如下:),可用于移位运算等操作。指令格式如下: MOVcondS Rd,operand2 MOVMOV指令举例如下:指令举例如下: MOVR11,#0xF000000B;R1= 0xF000000B ;R1= 0xF000000B MOVR0,R1;R0=R1R0=R1 MOVSR3,R1,LSL #2;R3=R12R3=R12,并影响标志位,并影响标志位 MOVPC,LR;PC=LRPC=LR,子程序返回,子程序返回 助记符说明操作条件码位置MOV Rd,operand2MOV Rd,operand2数据传送数据传送RdRdoperand2

70、 operand2 MOVcondSMOVcondSMVN Rd,operand2MVN Rd,operand2数据非传送数据非传送RdRd(operand2)(operand2)MVNcondSMVNcondSARMARM数据处理指令数据处理指令数据传送数据传送 MVNMVN指指令令将将8 8位位立立即即数数或或寄寄存存器器(operand2operand2)按按位位取取反反后后传传送送到到目目标标寄寄存存器器(RdRd),因因为为其其具具有有取取反反功功能能,所以可以装载范围更广的立即数。指令格式如下:所以可以装载范围更广的立即数。指令格式如下: MVNcondS Rd,operand2

71、MVNMVN指令举例如下:指令举例如下: MVNR1,#0xFF;R1=0xFFFFFF00R1=0xFFFFFF00 MVNR1,R2 ;将将R2R2按位取反,结果存到按位取反,结果存到R1R1助记符助记符说明说明操作操作条件码位置条件码位置ADD Rd, Rn, ADD Rd, Rn, operand2operand2加法运算加法运算指令指令RdRdRn+operand2Rn+operand2ADDcondSADDcondSSUB Rd, Rn, SUB Rd, Rn, operand2operand2减法运算减法运算指令指令RdRdRn-operand2Rn-operand2SUBcon

72、dSSUBcondSRSB Rd, Rn, RSB Rd, Rn, operand2operand2逆向减法逆向减法指令指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondSADC Rd, Rn, ADC Rd, Rn, operand2operand2带进位加带进位加法法RdRdRn+operand2+CarrRn+operand2+Carry yADCcondSADCcondSSBC Rd, Rn, SBC Rd, Rn, operand2operand2带进位减带进位减法指令法指令RdRdRn-operand2-Rn-operand2-(NOT)Carr

73、y(NOT)CarrySBCcondSSBCcondSRSC Rd, Rn, RSC Rd, Rn, operand2operand2带进位逆带进位逆向减法指向减法指令令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondSARMARM数据处理指令数据处理指令算术运算算术运算注:这些指令影响注:这些指令影响N,Z,C和和V标志位。标志位。助记符助记符说明说明操作操作条件码位置条件码位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法运算指令加法运算指令RdRdRn+operand2Rn

74、+operand2ADDcondSADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2减法运算指令减法运算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向减法指令逆向减法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondSADC Rd, Rn, operand2ADC Rd, Rn, operand2带进位加法带进位加法RdRdRn+operand2+CarryRn+operand2+Carr

75、yADCcondSADCcondSSBC Rd, Rn, operand2SBC Rd, Rn, operand2带进位减法指带进位减法指令令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondSRSC Rd, Rn, operand2RSC Rd, Rn, operand2带进位逆向减带进位逆向减法指令法指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondSARM数据处理指令算术运算 加加法法运运算算指指令令ADDADD指指令令将将opera

76、nd2operand2的的值值与与RnRn的的值值相相加加,结果保存到结果保存到RdRd寄存器。指令格式如下:寄存器。指令格式如下: 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 助记符助记符说明说明操作操作条件码位置条件码位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法运算指令加法运算指令RdRdRn+operand2Rn+operand2A

77、DDcondSADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2减法运算指令减法运算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向减法指令逆向减法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondSADC Rd, Rn, operand2ADC Rd, Rn, operand2带进位加法带进位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSA

78、DCcondSSBC Rd, Rn, operand2SBC Rd, Rn, operand2带进位减法指令带进位减法指令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondSRSC Rd, Rn, operand2RSC Rd, Rn, operand2带进位逆向减法带进位逆向减法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondSARMARM数据处理指令数据处理指令算术运算算术运算 减减法法运运算算指指令令SUBSUB指指令令用用寄寄

79、存存器器RnRn减减去去operand2operand2,结结果保存到果保存到RdRd中。指令格式如下:中。指令格式如下: SUBcondS Rd,Rn,operand2 应用示例:应用示例: SUBSR0,R0,#240;R0=R0-240 ;R0=R0-240 ,并影响标志,并影响标志位位 SUBSR2,R1,R2;R2=R1-R2;R2=R1-R2 ,并影响标志位,并影响标志位 助记符助记符说明说明操作操作条件码位置条件码位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法运算指令加法运算指令RdRdRn+operand2Rn+operand2ADDc

80、ondSADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2减法运算指令减法运算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向减法指令逆向减法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondSADC Rd, Rn, operand2ADC Rd, Rn, operand2带进位加法带进位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCc

81、ondSSBC Rd, Rn, operand2SBC Rd, Rn, operand2带进位减法指令带进位减法指令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondSRSC Rd, Rn, operand2RSC Rd, Rn, operand2带进位逆向减法带进位逆向减法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondSARM数据处理指令数据处理指令算术运算算术运算 逆逆向向减减法法运运算算指指令令RSBRSB指指令令将将oper

82、and2operand2的的值值减减去去RnRn,结结果果保保存存到到RdRd中中。指令格式如下:指令格式如下: RSBcondS Rd,Rn,operand2 应用示例:应用示例: RSB R3,R1,#0xFF00 ;R3=0xFF00-R1;R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R22)-R2;R1=(R210, R110, 则执行本指令则执行本指令 助记符助记符说明说明操作操作条件码位置条件码位置CMP Rn, operand2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn

83、-operand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& operand2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn oper

84、and2 operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 负负 数数 比比 较较 指指 令令 CMNCMN指指 令令 使使 用用 寄寄 存存 器器 RnRn的的 值值 加加 上上operand2operand2的的值值,根根据据操操作作的的结结果果更更新新CPSRCPSR中中的的相相应应条条件件标标志志位位。指令格式如下:指令格式如下: CMNcond Rn, operand2 例:例:CMNR0,#1 ; R0+1; R0+1,判断,判断R0R0是否为是否为1 1的补码的补码; ;如果是,则设置如果是,则设置Z Z标志位标志位助记符助记符说明

85、说明操作操作条件码位置条件码位置CMP Rn, operand2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn-operand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& ope

86、rand2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn operand2 operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 负负 数数 比比 较较 指指 令令 CMNCMN指指 令令 使使 用用 寄寄 存存 器器 RnRn的的 值值 加加 上上operand2operand2的的值值,根根据据操操作作的的结结果果更更新新CPSRCPSR中中的的相相应应条条件件标标志志位位。指令格式:指令格式: CMNcondRn, operan

87、d2注注意意:CMNCMN指指令令与与ADDSADDS指指令令的的区区别别在在于于CMNCMN指指令令不不保保存存运运算算结结果果。CMNCMN指指令令可可用用于于负负数数比比较较,比比如如CMN CMN R0,#1R0,#1指指令令则则表表示示R0R0与与-1 -1比较,若比较,若R0R0为为-1(-1(即即1 1的补码的补码) ),则,则Z Z置位;否则置位;否则Z Z复位。复位。 助记符助记符说明说明操作操作条件码位置条件码位置CMP Rn, operand2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn-oper

88、and2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& operand2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn operand2

89、operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 位位测测试试指指令令TSTTST指指令令将将寄寄存存器器RnRn的的值值与与operand2operand2的的值值按按位位作作逻逻辑辑“与与”操操作作,根根据据操操作作的的结结果果更更新新CPSRCPSR中中的的相相应应条条件件标标志位。指令格式如下:志位。指令格式如下:TSTcond Rn, operand2 例:例:TSTR0,#0x01; ; 判断判断R0R0的最低位是否为的最低位是否为0 0 TSTR1,#0x0F; ; 判断判断R1R1的低的低4 4位是否为位是否为0 0 助记符助记符

90、说明说明操作操作条件码位置条件码位置CMP Rn, operand2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn-operand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& o

91、perand2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn operand2 operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 位位测测试试指指令令TSTTST指指令令将将寄寄存存器器RnRn的的值值与与operand2operand2的的值值按按位位作作逻逻辑辑“与与”操操作作,根根据据操操作作的的结结果果更更新新CPSRCPSR中中的的相相应应条条件件标标志志位位。指令格式如下:指令格式如下: TSTcond Rn, ope

92、rand2注注意意:TSTTST指指令令与与ANDSANDS指指令令的的区区别别在在于于TSTTST指指令令不不保保存存运运算算结结果果。TSTTST指指令令通通常常与与EQEQ、NENE条条件件码码配配合合使使用用,当当所所有有测测试试位位均均为为0 0时时,EQEQ有有效效(Z=1Z=1),而而只只要要有一个测试位不为有一个测试位不为0 0,则,则NENE有效(有效(Z=0Z=0) 。 助记符助记符说明说明操作操作条件码位置条件码位置CMP Rn, operand2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn-op

93、erand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& operand2TSTcondTSTcondTEQ Rn, operand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn operand

94、2 operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 相相等等测测试试指指令令TEQTEQ指指令令将将寄寄存存器器RnRn的的值值与与operand2operand2的的值值按按位位作作逻逻辑辑“异异或或”操操作作,影影响响CPSRCPSR中中的的相相应应条条件件标标志志位位。指令格式如下:指令格式如下: TEQcond Rn, operand2 例:例:TEQR0,R1; ; 比较比较R0R0与与R1R1是否相等是否相等 ( (不影响不影响V V位位和和C C位位) )助记符助记符说明说明操作操作条件码位置条件码位置CMP Rn, operan

95、d2CMP Rn, operand2比较指令比较指令标标 志志 N N、 Z Z、 C C、V VRn-operand2Rn-operand2CMPcondCMPcondCMN Rn, operand2CMN Rn, operand2负数比较指令负数比较指令标标 志志 N N、 Z Z、 C C、V VRn+operand2Rn+operand2CMNcondCMNcondTST Rn, operand2TST Rn, operand2位测试指令位测试指令标标志志N N、Z Z、C C、V VRn Rn & operand2& operand2TSTcondTSTcondTEQ Rn, ope

96、rand2TEQ Rn, operand2相等测试指令相等测试指令标标志志N N、Z Z、C C、V VRn Rn operand2 operand2TEQcondTEQcondARMARM数据处理指令数据处理指令比较指令比较指令 相相等等测测试试指指令令TEQTEQ指指令令将将寄寄存存器器RnRn的的值值与与operand2operand2的的值值按按位位作作逻逻辑辑“异异或或”操操作作,根根据据操操作作的的结结果果更更新新CPSRCPSR中中的的相相应应条条件件标标志志位位,以以便便后后面面的的指指令令根根据据相相应应的的条条件件标标志志来来判判断是否执行。指令格式如下:断是否执行。指令格

97、式如下: TEQcond Rn, operand21 ARM指令集介绍指令集介绍nARMARM指令集指令集乘法指令乘法指令 ARM ARM具有三种乘法指令,分别为:具有三种乘法指令,分别为:32323232位乘法指令;位乘法指令;3232 32 32位乘加指令;位乘加指令;3232 32 32位结果为位结果为6464位的乘位的乘/ /乘加指令。乘加指令。ARMARM指令指令乘法指令乘法指令乘法指令编码乘法指令编码指令执行的条件码OpcodeOpcode乘乘 法法 指指令操作码令操作码S S设设置置条条件件码码,与与指令中的指令中的S S位对应位对应RmRm为被乘数寄存器为被乘数寄存器Rn/Rd

98、LoRn/RdLo为为 MLAMLA指指令令相相加加的的寄寄存存器器或或6464位位乘乘法法指指令令的的目目标寄存器(低标寄存器(低3232位)位)Rd/RdHi为目标寄存器或64位乘法指令的目标寄存器(高32位)RsRs为乘数寄存器为乘数寄存器64位有符号乘加指令SMLAL11164位有符号乘法指令SMULL11064位无符号乘加指令UMLAL10164位无符号乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000说明指令助记符操作码opcode操作码功能表操作码功能表助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs323

99、2位乘法指位乘法指令令RdRdRm*Rs Rm*Rs (Rd(RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指位乘加指令令RdRdRm*Rs+Rn Rm*Rs+Rn (Rd(RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号位无符号乘法指令乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondSUMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,R

100、dHi,Rm,Rs6464位无符号位无符号乘加指令乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RRm*Rs+(RdLo,RdHi)dHi)UMLALcondSUMLALcondSSMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号位有符号乘法指令乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondSSMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号位有符号乘加指令乘加指令(RdLo,RdHi) (Rd

101、Lo,RdHi) Rm*Rs+(RdLo,RRm*Rs+(RdLo,RdHi)dHi)SMLALcondSSMLALcondSARMARM指令指令乘法指令乘法指令助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,

102、RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondSUMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSUMLALcondSSMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位有符号乘法指

103、令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondSSMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号乘加指令位有符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLALcondSARMARM指令指令乘法指令乘法指令 3232位位乘乘法法指指令令MULMUL指指令令将将RmRm和和RsRs中中的的值值相相乘乘,结结果果的的低低3232位位保保存存到到RdRd中中。 Rd,Rm,RsRd,

104、Rm,Rs不不能能为为R15R15。只只影影响响CPSRCPSR中中的的NN位和位和Z Z位位,不影响,不影响V,C不确定不确定。指令格式如下:。指令格式如下:MULcondS Rd,Rm,Rs 例:例:MUL R1,R2,R3 ;R1=R2R3;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7;R0=R3R7,影响,影响CPSRCPSR中的中的NN位和位和Z Z位位 助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSML

105、A Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondSUMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*R

106、s+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSUMLALcondSSMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位有符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondSSMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号乘加指令位有符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLA

107、LcondSARM指令乘法指令 3232位位乘乘加加指指令令MLAMLA指指令令将将RmRm和和RsRs中中的的值值相相乘乘,再再将将乘乘积积加加上上第第3 3个个操操作作数数,结结果果的的低低3232位位保保存存到到RdRd中中。 Rd,Rm,RsRd,Rm,Rs,RnRn不不能能为为R15R15。只只影影响响CPSRCPSR中中的的NN位位和和Z Z位位,不不影影响响V V,C C不不确确定定。指令格式如下:指令格式如下: MLAcondS Rd,Rm,Rs,Rn 例:例:MLA R1,R2,R3,R0; R1=R2R3+R0; R1=R2R3+R0助记符助记符说明说明操作操作条件码位置条

108、件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondS U

109、MLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSUMLALcondS SMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位有符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondS SMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6

110、464位有符号乘加指令位有符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLALcondS ARM指令乘法指令 6464位位无无符符号号乘乘法法指指令令UMULLUMULL指指令令将将RmRm和和RsRs中中的的值值作作无无符符号号数数相相乘乘,结结果果的的低低3232位位保保存存到到RdLoRdLo中中,而而高高3232位位保保存存到到RdHiRdHi中中。 RdLo/HiRdLo/Hi,RmRm,RsRs不不能能为为R15R15。 RdLo/HiRdLo/Hi,RmRm必必须须是是不不同

111、同的的寄寄存存器器。只只影影响响CPSRCPSR中中的的NN位和位和Z Z位,标志位,标志C C和和V V不确定。指令格式如下:不确定。指令格式如下: UMULLcondS RdLo,RdHi,Rm,Rs 应用示例:应用示例: UMULL R0,R1,R5,R8; (R1; (R1、R0)=R5R8 R0)=R5R8 助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232

112、位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondS UMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)U

113、MLALcondSUMLALcondS SMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位有符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondS SMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号乘加指令位有符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLALcondS ARM指令乘法指令 6464位位无无符符号号

114、乘乘加加指指令令UMLALUMLAL指指令令将将RmRm和和RsRs中中的的值值作作无无符符号号数数相相乘乘,6464位位乘乘积积与与RdHiRdHi、RdLoRdLo相相加加,结结果果的的低低3232位位保保存存到到RdLoRdLo中中,而而高高3232位位保保存存到到RdHiRdHi中中。 RdLo/HiRdLo/Hi,RmRm,RsRs不不能能为为R15R15。 RdLo/HiRdLo/Hi,RmRm必必须须是是不不同同的的寄寄存存器器。只只影影响响CPSRCPSR中中的的NN位位和和Z Z位位,标标志志C C和和V V不不确确定定。指指令令格格式式如下:如下: UMLALcondS R

115、dLo,RdHi,Rm,Rs 应用示例:应用示例: UMLAL R0,R1,R5,R8;(R1;(R1、R0)=R5R8+(R1R0)=R5R8+(R1、R0) R0) 助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi

116、,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondS UMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSUMLALcondS SMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位

117、有符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondS SMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号乘加指令位有符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLALcondS ARM指令乘法指令 6464位位有有符符号号乘乘法法指指令令SMULLSMULL指指令令将将RmRm和和RsRs中中的的值值作作有有符符号号数数相相乘乘,结结果果的的低低3232位位保保存存到到

118、RdLoRdLo中中,而而高高3232位位保保存存到到RdHiRdHi中中。 RdLo/HiRdLo/Hi,RmRm,RsRs不不能能为为R15R15。 RdLo/HiRdLo/Hi,RmRm必必须须是是不不同同的的寄寄存存器器。只只影影响响CPSRCPSR中中的的NN位位和和Z Z位,标志位,标志C C和和V V不确定。指令格式如下:不确定。指令格式如下: SMULLcondS RdLo,RdHi,Rm,Rs 应用示例:应用示例: SMULLR2,R3,R7,R6; (R3; (R3、R2)=R7R6 R2)=R7R6 助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,Rs

119、MUL Rd,Rm,Rs3232位乘法指令位乘法指令RdRdRm*Rs (RdRm*Rs (RdRm)Rm)MULcondSMULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令RdRdRm*Rs+Rn (RdRm*Rs+Rn (RdRm)Rm)MLAcondSMLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs6464位无符号乘法指令位无符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs Rm*Rs UMULLcondSUMULLcondS UMLAL RdLo,RdHi,R

120、m,RsUMLAL RdLo,RdHi,Rm,Rs6464位无符号乘加指令位无符号乘加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)UMLALcondSUMLALcondS SMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs6464位有符号乘法指令位有符号乘法指令(RdLo,RdHi) (RdLo,RdHi) Rm*RsRm*RsSMULLcondSSMULLcondS SMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs6464位有符号乘加指令位有符号乘

121、加指令(RdLo,RdHi) (RdLo,RdHi) Rm*Rs+(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMLALcondS ARMARM指令指令乘法指令乘法指令 6464位位有有符符号号乘乘加加指指令令SMLALSMLAL指指令令将将RmRm和和RsRs中中的的值值作作有有符符号号数数相相乘乘,6464位位乘乘积积与与RdHiRdHi、RdLoRdLo相相加加,结结果果的的低低3232位位保保存存到到RdLoRdLo中中,而而高高3232位位保保存存到到RdHiRdHi中中。 RdLo/HiRdLo/Hi,RmRm,RsRs不不能能为为R15R15。 R

122、dLo/HiRdLo/Hi,RmRm必必须须是是不不同同的寄存器。只影响的寄存器。只影响CPSRCPSR中的中的NN位和位和Z Z位,标志位,标志C C和和V V不确定。指令格式如下:不确定。指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs 应用示例:应用示例: SMLALR2,R3,R7,R6; (R3; (R3、R2)=R7R6+(R3R2)=R7R6+(R3、R2) R2) 1 ARM指令集介绍指令集介绍nARMARM指令集指令集分支指令分支指令 在在ARMARM中中有有两两种种方方式式可可以以实实现现程程序序的的跳跳转转,一一种种是是使使用用分分支支指指令令直直接接

123、跳跳转转,另另一一种种则则是是直直接接向向PCPC寄寄存存器器赋赋值值实实现现跳跳转。转。 分支指令有以下三种:分支指令有以下三种:分支指令分支指令B B;带链接的分支指令带链接的分支指令BLBL;带状态切换的分支指令带状态切换的分支指令BXBX。ARMARM分支指令分支指令指令编码指令编码分支指令分支指令B B/ /BLBL指令编码格式指令编码格式指令执行的条件码指令执行的条件码L L区区别别B B指指令令(L L为为0 0)和和BLBL指令(指令(L L为为1 1)2424位位有有符符号号立立即即数数(偏移量)(偏移量)分支指令分支指令BXBX指令编码格式指令编码格式指令执行的条件码指令执

124、行的条件码RmRm目目标标地地址址寄寄存存器器,该寄存器装载跳转地址该寄存器装载跳转地址助记符助记符说明说明操作操作条件码位条件码位置置B labelB label分支指令分支指令PCPClabellabelBcondBcondBL labelBL label带带链链接接的的分分支支指令指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX RmBX Rm带带状状态态切切换换的的分支指令分支指令PCPCRmRm,切切换换处处理理器状态器状态BXcondBXcondARMARM指令指令分支指令分支指令助记符助记符说明说明操作操作条件码位置条件码位置B labelB

125、 label分支指令分支指令PCPClabellabelBcondBcondBL labelBL label带链接的分支指令带链接的分支指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX RmBX Rm带状态切换的分支指令带状态切换的分支指令PCPCRmRm,切换处理器状态,切换处理器状态BXcondBXcondARMARM指令指令分支指令分支指令 分分支支指指令令B B指指令令,该该指指令令跳跳转转范范围围限限制制在在当当前前指指令令的的32M32M字字节节地地址址内内(ARM(ARM指指令令为为字字对对齐齐,最最低低2 2位位地地址址固固定定为为0)0)

126、。指令格式如下:指令格式如下:Bcond Label 例:例:B WAITA; ; 跳转到跳转到WAITAWAITA标号处标号处 B0x1234; ; 跳转到绝对地址跳转到绝对地址0x12340x1234处处 BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC助记符助记符说明说明操作操作条件码位置条件码位置B labelB label分支指令分支指令PCPClabellabelBcondBcondBL labelBL label带链接的分支指令带链接的分支指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX

127、RmBX Rm带状态切换的分支指令带状态切换的分支指令PCPCRmRm,切换处理器状态,切换处理器状态BXcondBXcondARMARM指令指令分支指令分支指令 带带链链接接的的分分支支指指令令BLBL指指令令适适用用于于子子程程序序调调用用,使使用用该该指指令令后后,下下一一条条指指令令的的地地址址被被拷拷贝贝到到R14(R14(即即LR) LR) 连连接接寄寄存存器器中中,然然后后跳跳转转到到指指定定地地址址运运行程序。跳转范围限制在当前指令的行程序。跳转范围限制在当前指令的32M32M字节地址内。指令格式如下:字节地址内。指令格式如下:BLcond LabelAddr1LabelAdd

128、r2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2. 2. 程序跳转到目标地址程序跳转到目标地址LabelLabel继续执行,当子程继续执行,当子程序执行结束后,将序执行结束后,将LRLR寄寄存器内容存入存器内容存入PCPC,返回,返回调用函数继续执行调用函数继续执行应用示例(调用子程序):应用示例(调用子程序): BL Label助记符助记符说明说明操作操作条件码位置条件码位置B labelB label分支指令分支指令PCPClabellabelBcondBcondBL labelBL label带链接的分支指

129、令带链接的分支指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX RmBX Rm带带状状态态切切换换的的分分支支指令指令PCPCRmRm,切切换换处处理理器器状状态态BXcondBXcondARM指令指令分支指令分支指令 带带状状态态切切换换的的分分支支指指令令BXBX指指令令,该该指指令令可可以以根根据据跳跳转转地地址址(RmRm)的的最最低低位位来来切切换换处处理理器器状状态态。其其跳跳转转范范围围限限制制在在当当前前指指令令的的32M32M字字节节地地址址内内(ARM(ARM指令为字对齐,最低指令为字对齐,最低2 2位地址固定为位地址固定为0)0)。指

130、令格式如下:。指令格式如下:BXcond Rm跳转地址跳转地址Rm0跳转后跳转后CPSR标志标志T位位处理器状态处理器状态00ARM11Thumb助记符助记符说明说明操作操作条件码位置条件码位置B labelB label分支指令分支指令PCPClabellabelBcondBcondBL labelBL label带链接的分支指令带链接的分支指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX RmBX Rm带状态切换的分支指令带状态切换的分支指令PCPCRmRm,切切换换处处理理器器状状态态BXcondBXcondARMARM指令指令分支指令分支指令 带带

131、状状态态切切换换的的分分支支指指令令BXBX指指令令,该该指指令令可可以以根根据据跳跳转转地地址址(RmRm)的的最最低低位位来来切切换换处处理理器器状状态态。其其跳跳转转范范围围限限制制在在当当前前指指令令的的32M32M字字节节地地址址内内(ARM(ARM指指令令为为字字对对齐齐,最最低低2 2位位地地址址固固定定为为0)0)。 RmRm的的位位00不不用用作作地地址址的的一一部部分分。若若RmRm的的位位00为为1 1,则则指指令令将将CPSRCPSR中中的的标标志志T T置置位位,且且将将目目标标地地址址的的代代码码解解释释为为ThumbThumb代代码码;若若RmRm的的位位00为为

132、0 0,则则RmRm的的位位11就就不不能能为为1 1 。指指令令格格式如下:式如下:BXcond Rm例:例:ADRL R0,ThumbFun+1 ; ;将将ThumbThumb程序的入口地址加程序的入口地址加1 1存入存入R0R0 BX R0 ; ; 跳转到跳转到R0R0指定的地址,指定的地址, ; ;并根据并根据R0R0的最低位来切换处理器状态的最低位来切换处理器状态1 ARM指令集介绍指令集介绍nARMARM指令集指令集杂项指令杂项指令 ARMARM指指令令集集中中有有三三条条指指令令作作为为杂杂项项指指令令,在在实实际际应应用用中中这这三三条条指指令令非非常常重重要要。它它们们如如下

133、下所示:所示:助记符助记符说明说明操作操作条件码位条件码位置置SWI immed_24软中断指令软中断指令产产生生软软中中断断,处处理理器器进进入入管管理模式理模式SWIcondMRS Rd,psr读读状状态态寄寄存存器器指令指令Rdpsr, psr为为 CPSR或或SPSRMRScondMSR psr_fields,Rd/#immed_8r写写状状态态寄寄存存器器指令指令psr_fieldsRd/#immed_8r,psr为为CPSR或或SPSRMSRcondARMARM杂项指令杂项指令软中断指令软中断指令 SWISWI指指令令用用于于产产生生SWISWI异异常常,使使得得CPUCPU模模式

134、式变变换换到到管管理理模模式式,并并且且将将CPSRCPSR保保存存到到管管理理模模式式的的SPSRSPSR中中,然然后后程程序序跳跳转转到到SWISWI异异常入口。不影响条件码标志。常入口。不影响条件码标志。 该该指指令令主主要要用用于于用用户户程程序序调调用用操操作作系系统统的的系系统统服服务务,操操作作系系统在统在SWISWI异常处理程序中进行相应的系统服务。异常处理程序中进行相应的系统服务。SWIcond immed_24SWISWI指令格式指令格式SWISWI指令编码指令编码指令执行的条件码指令执行的条件码指指令令传传递递的的参参数数(2424位位立立即即数数,其其值值为为0 02

135、224241 1),执行时),执行时CPUCPU忽略该参数。忽略该参数。ARMARM杂项指令杂项指令软中断指令软中断指令 根根据据SWISWI指指令令传传递递的的参参数数SWISWI异异常常处处理理程程序序可可以以作作出出相相应应的处理。的处理。SWISWI指令传递参数有以下两种方法,指令传递参数有以下两种方法,指指令令中中的的2424位位立立即即数数指指定定了了用用户户请请求求的的服服务务类类型型,参参数数通通过通用寄存器传递。过通用寄存器传递。 MOV R0,#34; ;设置子功能号为设置子功能号为34 34 SWI 12; ;调用调用1212号软中断号软中断 指指令令中中的的2424位位

136、立立即即数数被被忽忽略略,用用户户请请求求的的服服务务类类型型由由寄寄存存器器R0R0的值决定,参数通过其它的通用寄存器传递。的值决定,参数通过其它的通用寄存器传递。 MOV R0,#12; ;调用调用1212号软中断号软中断 MOV R1,#34; ;设置子功能号为设置子功能号为34 34 SWI 0 ARMARM杂项指令杂项指令软中断指令软中断指令 在在SWISWI异常中断处理程序中,取出异常中断处理程序中,取出SWISWI指令中立即数的步骤为:指令中立即数的步骤为:首首先先确确定定引引起起软软中中断断的的SWISWI指指令令是是ARMARM指指令令还还是是ThumbThumb指指令令,这

137、这可可通通过对过对SPSRSPSR访问得到;访问得到;然后取得该然后取得该SWISWI指令的地址,这可通过访问指令的地址,这可通过访问LRLR寄存器得到;寄存器得到;接着读出该接着读出该SWISWI指令,分解出立即数。指令,分解出立即数。 SWI_Handler STMFD SP!, R0-R3, R12, LR; 现场保护现场保护 MRS R0, SPSR ; 读取读取SPSR STMFD SP!, R0 ; 保存保存SPSR TST R0, #0x20 ; 测试测试T标志位标志位 LDRNEH R0, LR,#-2 ; 若是若是Thumb指令,读取指令码指令,读取指令码(16位位) BIC

138、NE R0, R0, #0xFF00; 取得取得Thumb指令的指令的8位立即数(低位立即数(低8位)位) LDREQ R0, LR,#-4 ; 若是若是ARM指令,读取指令码指令,读取指令码(32位位) BICEQ R0, R0, #0xFF000000 ; 取得取得ARM指令的指令的24位立即数(低位立即数(低24位)位) . LDMFD SP!, R0-R3, R12, PC; SWI异常中断返回异常中断返回 NE:Z=0 EQ:Z=1ARMARM杂项指令杂项指令状态寄存器读指令状态寄存器读指令 在在ARMARM处处理理器器中中,只只有有MRSMRS指指令令可可以以对对状状态态寄寄存存器

139、器CPSRCPSR和和SPSRSPSR进进行行读读操操作作。通通过过读读CPSRCPSR可可以以了了解解当当前前处处理理器器的的工工作作状状态态。读读SPSRSPSR寄寄存存器器可可以以了了解解到到进进入入异异常常前前的的处处理理器器状状态态。该该指指令令不不影影响条件码。响条件码。MRScond Rd,psrMRSMRS指令格式指令格式指令对应编码指令对应编码指令执行的条件码指令执行的条件码目目标标寄寄存存器器,不不能为能为R15R15区区 别别 CPSRCPSR( 为为0 0) 和和 SPSRSPSR( 为为1 1)寄存器)寄存器ARMARM杂项指令杂项指令状态寄存器读指令状态寄存器读指令

140、 在在ARMARM处处理理器器中中,只只有有MRSMRS指指令令可可以以对对状状态态寄寄存存器器CPSRCPSR和和SPSRSPSR进进行行读读操操作作。通通过过读读CPSRCPSR可可以以了了解解当当前前处处理理器器的的工工作作状态。读状态。读SPSRSPSR寄存器可以了解到进入异常前的处理器状态。寄存器可以了解到进入异常前的处理器状态。MRScond Rd,psrMRS指令格式 应用示例:应用示例: MRS R1,CPSR; ; 将将CPSRCPSR状态寄存器读取,保存到状态寄存器读取,保存到R1R1中中 MRS R2,SPSR; ; 将将SPSRSPSR状态寄存器读取,保存到状态寄存器读

141、取,保存到R2R2中中ARM杂项指令状态寄存器写指令 在在ARMARM处处理理器器中中,只只有有MSRMSR指指令令可可以以对对状状态态寄寄存存器器CPSRCPSR和和SPSRSPSR进进行行写写操操作作。与与MRSMRS配配合合使使用用,可可以以实实现现对对CPSRCPSR或或SPSRSPSR寄寄存存器器的的读读- -修修改改- -写写操操作作,可以切换处理器模式、或者允许可以切换处理器模式、或者允许/ /禁止禁止IRQ/FIQIRQ/FIQ中断等。中断等。MSRcond psr_fields,#immed_8rMSR指令格式1MSRcond psr_fields,RmMSR指令格式2指令执

142、行的条件码指令执行的条件码CPSRCPSR或或SPSRSPSR指指定定传传送送的的区区域域,可可以以为为以以下下字字母母(必须小写)的一个或者组合:(必须小写)的一个或者组合:c c 控制域屏蔽字节控制域屏蔽字节(psr7.0)(psr7.0)x x 扩展域屏蔽字节扩展域屏蔽字节(psr15.8)(psr15.8)s s 状态域屏蔽字节状态域屏蔽字节(psr23.16)(psr23.16)f f 标志域屏蔽字节标志域屏蔽字节(psr31.24)(psr31.24)保保存存要要传传送送到到状状态态寄寄存存器器指指定定域域数数据据的源寄存器的源寄存器要要传传送送到到状状态态寄寄存存器指定域的立即数

143、器指定域的立即数ARMARM杂项指令杂项指令状态寄存器写指令状态寄存器写指令 在在ARMARM处处理理器器中中,只只有有MSRMSR指指令令可可以以对对状状态态寄寄存存器器CPSRCPSR和和SPSRSPSR进进行行写写操操作作。与与MRSMRS配配合合使使用用,可可以以实实现现对对CPSRCPSR或或SPSRSPSR寄寄存存器器的的读读- -修修改改- -写写操操作作,可以切换处理器模式、或者允许可以切换处理器模式、或者允许/ /禁止禁止IRQ/FIQIRQ/FIQ中断等。中断等。指令执行的条件码指令执行的条件码CPSRCPSR或或SPSRSPSR指指定定传传送送的的区区域域,可可以以为为以

144、以下下字字母母(必须小写)的一个或者组合:(必须小写)的一个或者组合:c c 控制域屏蔽字节控制域屏蔽字节(psr7.0)(psr7.0)x x 扩展域屏蔽字节扩展域屏蔽字节(psr15.8)(psr15.8)s s 状态域屏蔽字节状态域屏蔽字节(psr23.16)(psr23.16)f f 标志域屏蔽字节标志域屏蔽字节(psr31.24)(psr31.24)要要传传送送到到状状态态寄寄存存器指定域的立即数器指定域的立即数MSRMSR指令指令1 1编码编码MSRMSR指令指令2 2编码编码8_bit_immediate8_bit_immediate:8 8位位图立即数位位图立即数(1)(2)(

145、3)(4)ARM杂项指令杂项指令状态寄存器写指令状态寄存器写指令 在在ARMARM处处理理器器中中,只只有有MSRMSR指指令令可可以以对对状状态态寄寄存存器器CPSRCPSR和和SPSRSPSR进进行行写写操操作作。与与MRSMRS配配合合使使用用,可可以以实实现现对对CPSRCPSR或或SPSRSPSR寄寄存存器器的的读读- -修修改改- -写写操操作作,可以切换处理器模式、或者允许可以切换处理器模式、或者允许/ /禁止禁止IRQ/FIQIRQ/FIQ中断等。中断等。 应用示例应用示例1 1:; ;子程序:使能子程序:使能IRQIRQ中断中断ENABLE_IRQ MRS R0, CPSR

146、BIC R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR 应用示例应用示例2 2:; ;子程序:禁能子程序:禁能IRQIRQ中断中断DISABLE_IRQ MRS R0, CPSR ORR R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR 1. 1.将将CPSRCPSR寄存器内容读出到寄存器内容读出到R0R0;2.2.修改对应于修改对应于CPSRCPSR中的中的I I控制位;控制位;3.3.将修改后的值写回将修改后的值写回 CPSR CPSR寄存器寄存器的对应控制域;的对应控制域;4.4.返回上一层函数;返回上一层函数;1 ARM指令集介绍指令集

147、介绍nARMARM伪指令伪指令 ARMARM伪伪指指令令不不属属于于ARMARM指指令令集集中中的的指指令令,是是为为了了编编程程方方便便而而定定义义的的。伪伪指指令令可可以以像像其其它它ARMARM指指令令一一样样使使用用,但但在在编编译译时时这这些些指指令令将将被被等等效效的的一一条条或或多多条条ARMARM指指令令所所代代替替。ARMARM伪伪指指令令有有四四条条,分分别别为为ADRADR伪伪指指令令、ADRLADRL伪伪指指令令、LDRLDR伪伪指指令令、NOPNOP伪指令。伪指令。 ARMARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRADR伪伪指指令令将将基基于于PCPC

148、相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRADR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。通通常常,编编译译器器用用一一条条ADDADD指指令令或或SUBSUB指指令令来来实实现现该该ADRADR伪伪指指令令的的功功能能,若若不不能能用一条指令实现,则产生错误,编译失败。用一条指令实现,则产生错误,编译失败。 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为

149、-255-255255255;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-1020-102010201020;ADRADR伪指令格式伪指令格式ADRcond register,expr指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRADR伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRADR伪伪指指令令被被编编译译器器替替换

150、换成成一一条条合合适适的的指指令令。通通常常,编编译译器器用用一一条条ADDADD指指令令或或SUBSUB指指令令来来实实现现该该ADRADR伪伪指指令令的的功功能能,若若不不能能用一条指令实现,则产生错误,编译失败。用一条指令实现,则产生错误,编译失败。应用示例(源程序):应用示例(源程序):使使用用伪伪指指令令将将程程序序标标号号DelayDelay的的地地址址存存入入R1R1 . ADR R1,Delay .Delay MOV R0,r14 . .0x20 ADD r1,pc,#0x3c . .0x64 MOV r0,r14 .ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRA

151、DR伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRADR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。通通常常,编编译译器器用用一一条条ADDADD指指令令或或SUBSUB指指令令来来实实现现该该ADRADR伪伪指指令令的的功功能能,若若不不能能用一条指令实现,则产生错误,编译失败。用一条指令实现,则产生错误,编译失败。 . ADR R1,Delay .Delay MOV R0,r14 .应用示例(源程序):应用

152、示例(源程序):编译后的反汇编代码:编译后的反汇编代码:使使用用伪伪指指令令将将程程序序标标号号DelayDelay的地址存入的地址存入R1R1地址地址程序代码程序代码ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRADR伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRADR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。通通常常,编编译译器器用用一一条条ADDADD指指令令或或SUBSUB指指令令来来实实

153、现现该该ADRADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 . ADR R1,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序): .0x20 ADD r1,pc,#0x3c . .0x64 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使使用用伪伪指指令令将将程程序序标标号号DelayDelay的地址存入的地址存入R1R1ADRADR伪指令被汇编成一条指令伪指令被汇编成一条指令ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRADR伪伪指指令令将将基基

154、于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRADR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。通通常常,编编译译器器用用一一条条ADDADD指指令令或或SUBSUB指指令令来来实实现现该该ADRADR伪伪指指令令的的功功能能,若若不不能能用一条指令实现,则产生错误,编译失败。用一条指令实现,则产生错误,编译失败。 应用示例应用示例2 2(查表):(查表): ADR R0,DISP_TAB; ; 加载转换表地址加载转换表地址 LD

155、RB R1,R0,R2 ; ; 使用使用R2R2作为参数,进行查表作为参数,进行查表 DISP_TAB DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRLADRL伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中,比比ADRADR伪伪指指令令可可以以读读取取更更大大范范围围的的地地址址 。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRLADRL伪伪指指令令被被编编译译器器替替换换成成两两

156、条条合合适适的的指指令令。若若不不能能用两条指令实现,则产生错误,编译失败。用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRLADRL伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-64K-64K64K64K;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-256K-256K256K256K;ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 AD

157、RLADRL伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中,比比ADRADR伪伪指指令令可可以以读读取取更更大大范范围围的的地地址址 。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRLADRL伪伪指指令令被被编编译译器器替替换换成成两两条条合合适适的的指指令令。若若不不能能用两条指令实现,则产生错误,编译失败。用两条指令实现,则产生错误,编译失败。 . ADRL R1,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):使使用用伪伪指指令令将将程

158、程序序标标号号DelayDelay的地址存入的地址存入R1R1ARM伪指令中等范围的地址读取 ADRLADRL伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中,比比ADRADR伪伪指指令令可可以以读读取取更更大大范范围围的的地地址址 。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRLADRL伪伪指指令令被被编编译译器器替替换换成成两两条条合合适适的的指指令令。若若不不能能用两条指令实现,则产生错误,编译失败。用两条指令实现,则产生错误,编译失败。 . ADRL R1,Delay .De

159、lay MOV R0,r14 .应用示例(源程序):应用示例(源程序): .0x20 ADD r1,pc,#400x24 ADD r1,r1,#FF00 .0xFF68 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使使用用伪伪指指令令将将程程序序标标号号DelayDelay的地址存入的地址存入R1R1地址地址程序代码程序代码ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRLADRL伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄存存器器中中,比比ADRADR伪伪指指令令可可

160、以以读读取取更更大大范范围围的的地地址址 。在在汇汇编编编编译译器器编编译译源源程程序序时时,ADRLADRL伪伪指指令令被被编编译译器器替替换换成成两两条条合合适适的的指指令令。若若不不能能用两条指令实现,则产生错误,编译失败。用两条指令实现,则产生错误,编译失败。 . ADRL R1,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序): . 0x20 ADD r1,pc,#400x24 ADD r1,r1,#FF00 .0xFF68 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使使用用伪伪指指令令将将程程序序标标号号DelayDel

161、ay的地址存入的地址存入R1R1ADRLADRL伪指令被汇编成两条指令伪指令被汇编成两条指令ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDRLDR伪伪指指令令用用于于加加载载3232位位的的立立即即数数或或一一个个地地址址值值到到指指定定寄寄存存器器。在在汇汇编编编编译译源源程程序序时时,LDRLDR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。若若加加载载的的常常数数未未超超出出MOVMOV或或MVNMVN的的范范围围,则则使使用用MOVMOV或或MVNMVN指指令令代代替替该该LDRLDR伪伪指指令令,否否则则汇汇编编器器将将常常量量放放入入数数据据缓缓冲

162、冲区区,并并使使用用一一条条程程序序相相对对偏偏移移的的LDRLDR指令从数据缓冲区读出常量。指令从数据缓冲区读出常量。LDRcond register,=expr | label_exprLDRLDR伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器基基于于PCPC的的地地址址表表达达式式或外部表达式或外部表达式注意注意:1.1.从指令位置到数据缓冲区的偏移量必须小于从指令位置到数据缓冲区的偏移量必须小于4KB4KB;2.2.与与ARMARM指令的指令的LDRLDR相比,伪指令的相比,伪指令的LDRLDR的参数有的参数有“=”“=”号。号。ARM伪指令伪指令

163、大范围的地址读取大范围的地址读取 LDRLDR伪伪指指令令用用于于加加载载3232位位的的立立即即数数或或一一个个地地址址值值到到指指定定寄寄存存器器。在在汇汇编编编编译译源源程程序序时时,LDRLDR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。若若加加载载的的常常数数未未超超出出MOVMOV或或MVNMVN的的范范围围,则则使使用用MOVMOV或或MVNMVN指指令令代代替替该该LDRLDR伪伪指指令令,否否则则汇汇编编器器将将常常量量放放入入数数据据缓缓冲冲区区,并并使使用用一一条条程程序序相相对对偏偏移移的的LDRLDR指指令令从从数数据据缓缓冲冲区区读读出常量

164、。出常量。应用示例(加载常量):应用示例(加载常量):LDR R2, =0xFF0 ;MOV R2, #0xFF0LDR R0, =0xFF000000 ;MOV R0, #0xFF000000LDR R1, =0xFFFFFFFE ;MVN R1, #0x1ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDRLDR伪伪指指令令用用于于加加载载3232位位的的立立即即数数或或一一个个地地址址值值到到指指定定寄寄存存器器。在在汇汇编编编编译译源源程程序序时时,LDRLDR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。若若加加载载的的常常数数未未超超出出MOVMOV或

165、或MVNMVN的的范范围围,则则使使用用MOVMOV或或MVNMVN指指令令代代替替该该LDRLDR伪伪指指令令,否否则则汇汇编编器器将将常常量量放放入入数数据据缓缓冲冲区区,并并使使用用一一条条程程序序相相对对偏偏移移的的LDRLDR指指令令从从数数据据缓缓冲区读出常量。冲区读出常量。例(加载地址):例(加载地址): . LDR R1,=InitStack .InitStack MOV R0, LR .使使用用伪伪指指令令将将程程序序标标号号InitStackInitStack的的地址存入地址存入R1R1ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDRLDR伪伪指指令令用用于于加加

166、载载3232位位的的立立即即数数或或一一个个地地址址值值到到指指定定寄寄存存器器。在在汇汇编编编编译译源源程程序序时时,LDRLDR伪伪指指令令被被编编译译器器替替换换成成一一条条合合适适的的指指令令。若若加加载载的的常常数数未未超超出出MOVMOV或或MVNMVN的的范范围围,则则使使用用MOVMOV或或MVNMVN指指令令代代替替该该LDRLDR伪伪指指令令,否否则则汇汇编编器器将将常常量量放放入入数数据据缓缓冲冲区区,并并使使用用一一条条程程序序相相对对偏偏移移的的LDRLDR指令从数据缓冲区读出常量。指令从数据缓冲区读出常量。应用示例(加载地址):应用示例(加载地址):编译后的反汇编代

167、码:编译后的反汇编代码: . LDR R1,=InitStack .InitStack MOV R0, LR . .0x60 LDR R1,0xb4 .0x64 MOV R0, LR .0xb4 DCD 0x64使使用用伪伪指指令令将将程程序序标标号号InitStackInitStack的地址存入的地址存入R1R1地址地址程序代码程序代码ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDRLDR伪伪指指令令用用于于加加载载3232位位的的立立即即数数或或一一个个地地址址值值到到指指定定寄寄存存器器。在在汇汇编编编编译译源源程程序序时时,LDRLDR伪伪指指令令被被编编译译器器替替换换成成

168、一一条条合合适适的的指指令令。若若加加载载的的常常数数未未超超出出MOVMOV或或MVNMVN的的范范围围,则则使使用用MOVMOV或或MVNMVN指指令令代代替替该该LDRLDR伪伪指指令令,否否则则汇汇编编器器将将常常量量放放入入数数据据缓缓冲冲区区,并并使使用用一一条条程程序序相相对对偏偏移移的的LDRLDR指令从数据缓冲区读出常量。指令从数据缓冲区读出常量。应用示例(加载地址):应用示例(加载地址):编译后的反汇编代码:编译后的反汇编代码: . LDR R1,=InitStack .InitStack MOV R0, LR . .0x60 LDR R1,0xb4 .0x64 MOV R

169、0, LR .0xb4 DCD 0x64使使用用伪伪指指令令将将程程序序标标号号InitStackInitStack的地址存入的地址存入R1R1LDRLDR伪伪指指令令被被汇汇编编成成一一条条LDRLDR指指令令,并并在在数数据据缓缓冲冲区区中中定定义义了了一一个个常常量量,该常量为该常量为InitStackInitStack标号的地址标号的地址ARM伪指令伪指令空操作伪指令空操作伪指令 NOPNOP伪伪指指令令在在汇汇编编时时将将会会被被代代替替成成ARMARM中中的的空空操操作作,比比如如可可能能是是“MOV R0,R0”“MOV R0,R0”指令等。指令等。NOPNOP可用于延时操作。可

170、用于延时操作。NOPNOPNOP伪指令格式伪指令格式应用示例(延时子程序):应用示例(延时子程序): mov R1,#0x1234Delay NOP; ;空操作空操作 NOP NOP SUBS R1,R1,#1; ;循环次数减一循环次数减一 BNE Delay ; ;如果循环没有结束,跳转如果循环没有结束,跳转DelayDelay继续继续 MOV PC,LR ; ;子程序返回子程序返回ARM汇编程序设计汇编程序设计n由于高级编程语言隐藏了由于高级编程语言隐藏了CPUCPU执行指令执行指令的许多细节,因此在只关心系统所具有功的许多细节,因此在只关心系统所具有功能的系统中,采用高级语言编写程序更为

171、能的系统中,采用高级语言编写程序更为合适。但是,合适。但是,CPUCPU执行指令的细节差异会执行指令的细节差异会反应在系统的非功能特性上,例如系统程反应在系统的非功能特性上,例如系统程序的规模和运行速度。因此,掌握汇编语序的规模和运行速度。因此,掌握汇编语言程序设计对于嵌入式系统的设计者来说言程序设计对于嵌入式系统的设计者来说是非常必要的。是非常必要的。 nARMARM汇编程序中每一行的通用格式为:汇编程序中每一行的通用格式为:n 标号标号 指令指令| |指示符指示符| |伪指令伪指令 ;注解;注解 。n在在ARMARM汇编语言源程序中,除了标号和注释外,汇编语言源程序中,除了标号和注释外,指

172、令、伪指令和指示符都必须有前导空格,而不指令、伪指令和指示符都必须有前导空格,而不能顶格书写。如果每一行的代码太长,可以使用能顶格书写。如果每一行的代码太长,可以使用字符字符“”“”将其分行书写,并允许有空行。指令助将其分行书写,并允许有空行。指令助记符、指示符和寄存器名既可以用大写字母,也记符、指示符和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。注释从可以用小写字母,但不能混用。注释从“;”开开始,到该行结束为止。始,到该行结束为止。 n标号代表一个地址,段内标号的地址值在汇编时标号代表一个地址,段内标号的地址值在汇编时确定,段外标号的地址值在链接时确定。确定,段外标号的地址值在

173、链接时确定。ARM汇编程序设计汇编程序设计 AREA Word, CODE, READONLY ; name this block of codenum EQU 20 ; Set number of words to be copied ENTRY ; mark the first instruction to callstart LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to c

174、opywordcopy LDR r3, r0, #4 ; a word from the source STR r3, r1, #4 ; store a word to the destination SUBS r2, r2, #1 ; decrement the counter BNE wordcopy ; . copy morestop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x123456 ; ARM semihosting SW

175、I AREA BlockData, DATA, READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ENDARM汇编程序设计汇编程序设计符号类型符号类型指示符指示符功能功能符号定义指符号定义指示符示符GBLA声明和初始化一个全局算术变量,初始值为声明和初始化一个全局算术变量,初始值为0GBLL声明和初始化一个全局逻辑变量,初始值为声明和初始化一个全局逻辑变量,初始值为FALSEGBLS声明和初始化一个全局字符串变量,初始值为空声明和初始化一

176、个全局字符串变量,初始值为空LCLA声明和初始化一个局部算术变量,初始值为0。局部算术变量只能在宏中进行声明。LCLL声明和初始化一个局部逻辑变量,初始值为FALSE。局部逻辑变量只能在宏中进行声明。LCLS声明和初始化一个局部字符串变量,初始值为空。局部字符串变量只能在宏中进行声明。SETA给一个局部或全局算术变量置值给一个局部或全局算术变量置值SETL给一个局部或全局逻辑变量置值给一个局部或全局逻辑变量置值SETS给一个局部或全局字符串变量置值给一个局部或全局字符串变量置值RLIST给寄存器集命名给寄存器集命名CN给一个协处理器寄存器命名给一个协处理器寄存器命名CP给一个特定协处理器命名,

177、协处理器号为给一个特定协处理器命名,协处理器号为015DN给一个双精度给一个双精度VFP寄存器命名寄存器命名SN给一个单精度给一个单精度VFP寄存器命名寄存器命名FN给一个特定的浮点寄存器命名给一个特定的浮点寄存器命名ARM汇编程序设计汇编程序设计数数据据定定义义指指示示符符LTORGLTORG指示汇编器汇编当前文字池指示汇编器汇编当前文字池 或MAP置存储映射的起点到一个特定的地址置存储映射的起点到一个特定的地址# # 或或FIELDFIELD描述指示符所定义的存储映射中的空间描述指示符所定义的存储映射中的空间% % 或或SPACESPACE定义一块值为定义一块值为0 0的存储器区域的存储器

178、区域= = 或或DCBDCB分配一个或多个字节分配一个或多个字节& & 或或DCDDCD分配一个或多个字,从分配一个或多个字,从4 4字节边界开始字节边界开始DCDUDCDU分配一个或多个字,但不一定从分配一个或多个字,但不一定从4 4字节边界开始字节边界开始DCDODCDO分配以字边界开始的存储区域,并指定初始值为到静态基址寄存器的偏移DCFDDCFD分配给双精度浮点数一段以字边界开始的内存区域DCFDUDCFDU分配给双精度浮点数一段以任意边界开始的内存区域DCFSDCFS分配给单精度浮点数一段以字边界开始内存区域分配给单精度浮点数一段以字边界开始内存区域DCFSUDCFSU分配给单精浮点

179、数一段任意边界开始的内存区域分配给单精浮点数一段任意边界开始的内存区域DCIDCI分配以字边界开始的存储区域,并指定初始值。标记此地址存储的是代码而不是数据DCQDCQ分配给双精度浮点数一段以4字节边界开始的内存区域DCQUDCQU分配给双精度浮点数一段以任意边界开始的内存区域DCW分配给一个或多个半字以半字边界开始的内存区域DCWU分配给一个或多个半字以任意边界开始的内存区域ARM汇编程序设计汇编程序设计汇汇编编控控制制指指示示符符 或或IF这这三三个个符符号号连连用用,进进行行条条件件汇编汇编| 或或ELSE 或或ENDIFMACRO这这二二个个符符号号连连用用,定定义义一一个个宏定义宏定

180、义MENDMEXIT用来在结束前退出宏定义用来在结束前退出宏定义WHILE这这二二个个符符号号连连用用,进进行行重重复复汇编汇编WENDARM汇编程序设计汇编程序设计报报告告指指示示符符ASSERT对对于于声声明明错错误误,在在第第二二次次汇汇编编时产生错误信息时产生错误信息! 或或INFO在汇编时显示信息在汇编时显示信息OPT可在源代码中设置列表选项可在源代码中设置列表选项TTL在在一一个个列列表表文文件件每每页页的的开开始始插插入入一一个个标标题题,每每一一页页的的标标题题在在下一个下一个TTL之前都有效之前都有效SUBT在在一一个个列列表表文文件件的的页页中中设设置置一一个个子子标标题题

181、,每每一一页页的的子子标标题题在在下一个下一个SUBT之前都有效之前都有效ARM汇编程序设计汇编程序设计杂杂项项指指示示符符ALIGN从一个字边界开始AREA指示汇编器汇编一段新的代码或数据部分CODE16指示汇编器将随后的指令作为16位Thumb指令CODE32指示汇编器将随后的指令作为32位ARM指令END表示源程序的结束ENTRY指向程序的入口,一个源文件中只能有一个ENTRY*或EQU对一个常量赋予一个符号名EXPORT或GLOBAL说明了由链接器在目标和库文件中使用的符号IMPORT或EXTERN提供汇编器在当前汇编中未曾定义的符号名GET或INCLUDE包含一个文件,在GET处汇编

182、包含的文件INCBIN包含一个未被汇编过的文件KEEP指示汇编器保留符号表中的局部符号NOFP在汇编语言程序中禁止浮点指令REQUIRE指示两段之间的依赖关系REQUIRE8指示当前文件请求堆栈为8字节对准PRESERVE8指示当前文件保持堆栈为8字节对准RN给特定的寄存器命名ROUT标记局部标号使用范围的界面ARM汇编程序设计汇编程序设计n预定义变量预定义变量1nARM汇汇编编器器对对ARM的的寄寄存存器器进进行行了了预预定定义义,所所有有的的寄寄存存器器和和协协处处理理器器名名都都是是大大小小写写敏敏感感的的。预预定义的寄存器如下:定义的寄存器如下:nR0R15和和r0r15;na1a4(

183、参参数数、结结果果或或临临时时寄寄存存器器,与与r0r3同同义);义);nv1v8(变量寄存器,与(变量寄存器,与r4r11同义);同义);nsb和和SB(静态基址寄存器,与(静态基址寄存器,与r9同义);同义);nsl和和SL(堆栈限制寄存器,与(堆栈限制寄存器,与r10同义);同义);nfp和和FP(帧指针,与(帧指针,与r11同义);同义);ARM汇编程序设计汇编程序设计n预定义变量预定义变量2nip和和IP(过程调用中间临时寄存器,与(过程调用中间临时寄存器,与r12同义);同义);nsp和和SP(堆栈指针,与(堆栈指针,与r13同义);同义);nlr和和LR(链接寄存器,与(链接寄存

184、器,与r14同义);同义);npc和和PC(程序计数器,与(程序计数器,与r15同义);同义);ncpsr和和CPSR(程序状态寄存器);(程序状态寄存器);nspsr和和SPSR(程序状态寄存器);(程序状态寄存器);nf0f7和和F0F7(FPA寄存器);寄存器);ns0s31和和S0S31(VFP单精度寄存器);单精度寄存器);nd0d15和和D0D15(VFP双精度寄存器);双精度寄存器);np0p15(协处理器(协处理器015););nc0c15(协处理器寄存器(协处理器寄存器015)。)。 ARM汇编程序设计汇编程序设计n内置变量内置变量1 1nARMARM汇汇编编器器所所定定义义

185、的的内内置置变变量量如如表表4-4-1 1所所示示。值值得得注注意意的的是是内内置置变变量量的的设设置置不不能能用用SETASETA、SETLSETL或或SETSSETS等等指指示示符符来来设设置置,只只能能用用于于表表达达式式或或条条件件语语句句。例如:例如:nIF ARCHITECTURE = “4T”IF ARCHITECTURE = “4T”ARM汇编程序设计汇编程序设计变量变量含义含义PC或或.当前指令的地址当前指令的地址VAR或或存储区位置计数器的当前值存储区位置计数器的当前值TRUE逻辑常量真逻辑常量真FALSE逻辑常量假逻辑常量假OPT当当前前设设置置列列表表选选项项值值,OP

186、T用用来来保保存存当当前前列列表表选选项项,改变选项值,恢复它的原始值改变选项值,恢复它的原始值CONFIG如如果果汇汇编编器器汇汇编编ARM代代码码,则则值值为为32;如如果果汇汇编编器汇编器汇编Thumb代码,则值为代码,则值为16ENDIAN如如果果汇汇编编器器在在大大端端模模式式下下,则则值值为为big;如如果果汇汇编编器在小端模式下,则值为器在小端模式下,则值为littleARMARM汇编程序设计汇编程序设计表表4-1 内置变量内置变量CODESIZE如如果果汇汇编编器器汇汇编编ARM代代码码,则则值值为为32;如如果果汇汇编编器汇编器汇编Thumb代码,则值为代码,则值为16,与,

187、与CONFIG同义同义CPU选定的选定的CPU名,缺省时为名,缺省时为ARM7TDMIFPU选定的选定的FPU名,缺省时为名,缺省时为SoftVFPARCHITECTURE选选定定的的ARM体体系系结结构构的的值值;3,3M,4,4T和和4TxMPCSTOREOFFSETSTR pc,或或STM Rb,PC指指令令的地址和的地址和PC存储值之间的偏移量存储值之间的偏移量ARMASM_VERSION或或| ads $ version |ARM汇编器的版本号,为整数汇编器的版本号,为整数ARM汇编程序设计汇编程序设计表表4-1 内置变量(续)内置变量(续)n常量常量n十进制,如:十进制,如:123

188、,1,0n十六进制,如:十六进制,如:0x123,0xab,0x7bnn_XXX,n表示表示n进制,从进制,从29:XXX是具体的数是具体的数n字符串:由一对双引号及双引号之间字符串组成,字符串:由一对双引号及双引号之间字符串组成,并包含并包含C中的转义字符。中的转义字符。n逻辑常量为逻辑常量为TRUE和和FALSE。ARM汇编程序设计n宏定义及使用宏定义及使用n与与C语言中的语言中的define相似,仅在源程序中做字符替换相似,仅在源程序中做字符替换n以以MACRO指示符开始,以指示符开始,以MEND结束,例:结束,例:ARM汇编程序设计Macro$labelTestAndBranch $d

189、est, $reg, $cc$labelCMP $reg, #0B$cc $destMENDTestTestAndBranch NonZero, R0, NENonZeroTestCMP R0, #0BNE NonZeroNonZeron内嵌汇编内嵌汇编n在在C和和C语言中嵌入汇编语言可以实现一些高级语言中没有的功能。语言中嵌入汇编语言可以实现一些高级语言中没有的功能。n语法语法_asm _ (“instruction . instruction”); /Linux gcc中支持中支持_asminstruction instruction ; /ADS中支持中支持 asm(“instructi

190、on ; instruction”); /ARM C中使用中使用 ARM汇编程序设计nC语言中内嵌汇编示例语言中内嵌汇编示例 (ADS可编译通过可编译通过)ARM汇编程序设计汇编程序设计#include void my_strcpy(char* src, const char* dst) int ch; _asmloop:LDRB ch, src, #1STRB ch, dst, #1CMP ch, #0BNE loop ;int main(void) const char* a = Hello World!; char b20; _asmMOV R0, aMOV R1, bBL my_str

191、cpy, R0, R1 ; printf(Original String: %sn,a); printf(“Copied String: %sn,b); return 0;nC语言中调用汇编程序语言中调用汇编程序ARM汇编程序设计#include extern void strcopy(char *d, const char *s);int main() const char *srcstr = First string - source; char dststr = Second string - destination; /* dststr is an array since were g

192、oing to change it */ printf(Before copying:n); printf( %sn %sn,srcstr,dststr); strcopy(dststr,srcstr); printf(After copying:n); printf( %sn %sn,srcstr,dststr); return 0; AREA SCopy, CODE, READONLY EXPORT strcopystrcopy ; r0 points to destination string ; r1 points to source string LDRB r2, r1,#1 ; l

193、oad byte and update address STRB r2, r0,#1 ; store byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; keep going if not MOV pc,lr ; Return END根据根据ATPCS标准,函数前标准,函数前4个参数通过个参数通过R0R3来传递,其它参数通过堆栈来传递,其它参数通过堆栈(FD)传递传递ARM汇编程序设计汇编程序设计n在在c程序中声明的全局变量可以被汇编程序通过地址间程序中声明的全局变量可以被汇编程序通过地址间

194、接访问。具体访问方法如下:接访问。具体访问方法如下:n使用使用IMPORT伪操作声明该全局变量。伪操作声明该全局变量。n使用使用LDR伪指令读取该全局变量的内存地址,通常该全局变量伪指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在程序的数据缓冲池中(的内存地址值存放在程序的数据缓冲池中(literal pool)。)。n根据该数据的类型,使用相应的根据该数据的类型,使用相应的LDR伪指令读取该全局变量的伪指令读取该全局变量的值;使用相应的值;使用相应的STR指令;修改该全局变量的值。指令;修改该全局变量的值。n各数据类型及对应的各数据类型及对应的LDR/STR指令如下:指令如下:

195、对于无符号的对于无符号的char类型的变量通过指令类型的变量通过指令LDRB/STRB来读来读/写。写。对于无符号的对于无符号的short类型的变量通过指令类型的变量通过指令LDRH/STRH来读来读/写。写。对于对于int类型的变量通过指令类型的变量通过指令LDR/STR来读来读/写写ARM汇编程序设计对于有符号的对于有符号的char类型的变量通过指令类型的变量通过指令LDRSB来读取。来读取。对于有符号的对于有符号的char类型的变量通过指令类型的变量通过指令STRB来写入。来写入。对于有符号的对于有符号的short类型的变量通过指令类型的变量通过指令LDRSH来读取。来读取。对于有符号的

196、对于有符号的short类型的变量通过指令类型的变量通过指令STRH来写入。来写入。对于小于对于小于8个字的结构型变量,可以通过一条个字的结构型变量,可以通过一条LDM/STM指令指令来读来读/写整个变量。写整个变量。对于结构型变量的数据成员,可以使用相应的对于结构型变量的数据成员,可以使用相应的LDR/STR指令指令来访问,这时必须知道该数据成员相对于结构型变量开始地来访问,这时必须知道该数据成员相对于结构型变量开始地址的偏移量。址的偏移量。ARM汇编程序设计n在汇编程序中访问在汇编程序中访问c程序全局变量的例子。程序中变量程序全局变量的例子。程序中变量globvl是在是在c程序中声明的全局变

197、量。在汇编程序中首先用程序中声明的全局变量。在汇编程序中首先用IMPORT伪操作声明该变量;再将其内存地址读入到寄存器伪操作声明该变量;再将其内存地址读入到寄存器R1中;再中;再将其值读入到寄存器将其值读入到寄存器R0中;修改后再将寄存器中;修改后再将寄存器R0的值赋于变的值赋于变量量globvl。程序如下。程序如下。nAREA globals, CODE, READONLYEXPORT asmsubIMPORT globvlasmsubLDR r1, =globvlLDR r0, r1ADD r0, r0, #2STR r0, r1MOV pc, lrEND ARM汇编程序设计n汇编语言中调

198、用汇编语言中调用C语言中定义的函数语言中定义的函数n汇编程序的设计要遵循汇编程序的设计要遵循ATPCS,保证程序调用时参数的正,保证程序调用时参数的正确传递。在汇编程序中使用确传递。在汇编程序中使用IMPORT伪操作声明将要调用伪操作声明将要调用c程序。下面是一个汇编程序调用程序。下面是一个汇编程序调用c程序的例子。其中在汇编程序的例子。其中在汇编程序中设置好各参数的值。本例中有程序中设置好各参数的值。本例中有5个参数,分别使用寄个参数,分别使用寄存器存器R0存放第一个参数,存放第一个参数,R1存放第存放第2个参数,个参数,R2存放第存放第3个个参数,参数,R3存放第存放第4个参数,第个参数,

199、第5个参数利用数据栈传送。由个参数利用数据栈传送。由于利用数据栈传递参数,在程序调用结束后要调用数据栈于利用数据栈传递参数,在程序调用结束后要调用数据栈指针。指针。 注:详细内容参加ARM体系结构与编程一书ARM汇编程序设计/c程序程序g()返回()返回5个整数的和个整数的和int g(int a, int b, int c, int d, int e)return a + b + c + d + e;汇编程序调用汇编程序调用c程序程序g()计算()计算5个整数个整数i, 2*i, 3*i, 4*i, 5*i的和的和EXPORT fAREA f, CODE, READONLYIMPORT g

200、;使用伪操作数;使用伪操作数IMPORT声明声明c程序程序g()()STR lr, sp,#-4! ;保存返回地址;保存返回地址ADD r1, r0, r0 ;假设进入程序;假设进入程序f时,时,r0中的值为中的值为i,r1值设为值设为2*iADD r2, r1, r0 ;r2的值设为的值设为3*iADD r3, r1, r2 ;r3的值设为的值设为5*iSTR r3, sp, #-4! ;第五个参数;第五个参数5*i通过数据栈传递通过数据栈传递ADD r3, r1, r1 ;r4值设为值设为4*iBL g ;调用;调用c程序程序g()()ADD sp, sp, #4 ;调整数据栈指针,准备返回;调整数据栈指针,准备返回LDR pc, sp, #4 ;返回;返回END

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号