




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 ARM指令系统与汇编程序设计4.1 ARM指令集概述4.1.1 ARM指令集主要特征ARM指令集所具有的主要特征归纳如下:1.ARM处理器中包含大量寄存器,这些寄存器在指令集中都可用于多种用途(目的寄存器、源寄存器、地址指针等);2.ARM指令集中所有指令均可条件执行,即依据条件域设定条件满足与否来决定是否执行;3.ARM处理器采用Load/Store体系结构(指令集为加载/存储型),即ARM指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,存储器访问需要通过专门的加载/存储指令来实现;4.ARM指令集均为“3地址”指令,指令中有两个源操作数寄存器和一个结果寄存器,且均可独立设定;5.ARM处理器的ALU操作和移位操作可同时完成,即在单时钟周期内执行单条指令可同时完成一项普通的移位操作和一项普通ALU操作。6.ARM处理器可通过协处理器指令使ARM指令集得以扩展,包括在编程模式下增加新的寄存器和数据类型;7.ARM处理器在Thumb体系结构中以高密度16位压缩形式表示指令集(Thumb指令集)。4.1.2ARM指令基本格式ARM指令的助记符格式为: S ,; 注释举例:ADDEQS R1,R2,#5; R1=R2+5其中,表示“操作码”(如ADD),后缀表示“条件域”(如EQ表示该指令只有当CPSR中Z标志置位才执行),后缀S表示指令执行结果将影响CPSR寄存器值;空格之后的表示“目的寄存器”(如R1),第一个逗号之后表示“第一操作数1(操作数1)”(如R2),第二个逗号之后的表示“第二操作数(操作数2)”(如#5表示立即数5)。分号之后为“注释”,由文字和符号组成(如R1=R2+5)。 4.1.3ARM指令条件码域当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位条件码,位于指令的最高4位31:28,可表示16种条件,每一种条件用两个英文字符(大写)表示,作为指令助记符的后缀。例如,跳转指令B加上后缀EQ之后变为BEQ,表示“相等则跳转”(即当CPSR中的Z标志置位时发生跳转)。16种条件标志码中只有15种(表4.1)可供使用,第16种(1111)为暂时不能使用(系统保留)。表4.1 ARM指令条件码(15项)条件码助记符后缀标 志含 义0000EQZ 置位相等0001NEZ 清零不相等0010CSC 置位无符号数大于或等于0011CCC 清零无符号数小于0100MIN 置位负数0101PLN 清零正数或零0110VSV 置位溢出0111VCV 清零未溢出1000HIC 置位,Z 清零无符号数大于1001LSC 清零,Z 置位无符号数小于或等于1010GEN 等于V带符号数大于或等于1011LTN 不等于V带符号数小于1100GTZ 清零(且N等于V)带符号数大于1101LEZ 置位(或N不等于V)带符号数小于或等于1110AL忽略无条件执行4.2 ARM寻址方式所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下9种寻址方式。4.2.1 立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如:ADD R0, R0, 0x3f; R0R00x3f该指令的第二个源操作数即为立即数,须以“”为前缀,对于以十六进制表示的立即数,还要求在“”之后加上“0x”或“&”标识符。4.2.2 寄存器寻址寄存器寻址即寄存器中的数值作为操作数,这种寻址方式是各类处理器都采用的一种方式,也是一种执行效率较高的寻址方式。例如:ADD R0, R1, R2; R0R1R2该指令的所有操作数均在寄存器中,实际执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。4.2.3 寄存器移位寻址寄存器移位寻址的操作数由寄存器的数值做相应移位而得到。移位操作在指令中以助记符形式给出,而移位的位数可用立即数或寄存器寻址方式表示。ARM处理器支持的移位操作共有5种,分别是逻辑左移(LSL)、逻辑右移(LSR)、算术右移(ASR)、循环右移(ROR) 和带扩展的循环右移(RRX),括号内为相应操作的助记符,各种移位操作所实现的功能详见本节4.3.8。举例如下:ADD R0,R1,R2,ROR R3; R0=R1R2循环右移R3位MOV R0,R1,LSL 3; R0=R1逻辑左移3位4.2.4 寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如:ADD R0, R1, R2; R0R1R2该指令中的第二操作数以寄存器R2的值作为地址,利用这个地址在存储器中取得,实际执行效果是将这个操作数与R1相加,结果存入寄存器R0中。4.2.5 基址变址寻址基址变址寻址就是将寄存器(基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式:LDR R0, R1,4; R0R14LDR R0, R1,4!; R0R14、R1R14LDR R0, R1,4; R0R1、R1R14LDR R0, R1,R2; R0R1R2第一条指令将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中;第二条指令与第一条指令的区别在于将所取得的操作数存入寄存器R0之后,再将R1的内容自增4个字节;第三条指令先以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0,然后将R1的内容自增4个字节;第四条指令将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。4.2.6 多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器(最多16个)值的传送。例如:LDMIA R0, R1, R2, R3, R4; R1R0,R2R04,R3R08,R4R012指令LDM的后缀IA 表示,在每次执行完加载/存储操作之后,R0按字长度自增4个字节,因此,该条指令可将连续16个存储单元的值传送到R1R4。4.2.7 相对寻址相对寻址以程序计数器PC当前值为基地址、把指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下子程序调用(跳转指令BL)即采用相对寻址方式。BL NEXT; 跳转到子程序NEXT处执行4.2.8 块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。例如:LDMIA R0,R1-R5;从以R0的值为起始地址的存储单元中取出5个字的数据STMIA R1,R1-R5;将取出的数据存入以R1的值为起始地址的存储单元中4.2.9 堆栈寻址堆栈是一种“先进后出”(FILO)的特殊数据结构。它使用堆栈指针(专用寄存器)指示当前操作位置(总是指向栈顶),当堆栈指针指向最后压入堆栈的数据单元时,称为“满堆栈”,而当堆栈指针指向下一个将要放入数据的空位置(空单元)时,称为“空堆栈”;同时,根据堆栈的生成方式又分为“升序堆栈(由低地址向高地址生成)”和“降序堆栈(高地址向低地址生成)”。如此,ARM处理器支持的堆栈共有“满递增”、“满递减”、“空递增”和“空递减”4种堆栈寻址方式或堆栈类型。例如:STMFD R13!,R0,R1,R2,R3,R4;将R0-R4中的数据压入堆栈(R13为堆栈指针)LDMFD R13!,R0,R1,R2,R3,R4;将数据出栈(恢复R0-R4原先的值)4.3 ARM指令分类介绍ARM处理器指令集由“跳转指令”、“数据处理指令”、“乘法指令与乘加指令”、“程序状态寄存器(CPSR或SPSR)访问指令”、“加载/存储指令”、“批量加载/存储指令”、“数据交换指令”、“移位指令(操作)”、“协处理器指令”和“异常产生指令”10类构成,ARM指令助记符及指令功能如表4.2所示。分类介绍如下:表4.2 ARM 指令及功能描述(按分类顺寻排列)助记符指令功能描述助记符指令功能描述B跳转SMUAL64位有符号数乘加运算BL带返回的跳转UMULL64位无符号数乘法运算BLX带返回和状态切换的跳转UMUAL64位无符号数乘加运算BX带状态切换的跳转MRSCPSR或SPSR内容传送到通用寄存器MOV数据传送MSR通用寄存器内容传送到CPSR或SPSR MVN数据取反传送LDR存储器字数据传送到寄存器(字加载)CMP比较LDRB存储器字节数据传送到寄存器(字节加载)CMN比较反值LDRH存储器半字数据传送到寄存器(半字加载)TST位测试STR寄存器字数据传送到存储器(字存储)TEQ相等测试STRB寄存器字节数据传送到存储器(字节存储)ADD加法运算STRH寄存器半字数据传送到存储器(半字存储)ADC带进位加法运算LDM加载多个寄存器(批量字数据加载)SUB减法运算STM存储多个字数据(批量字数据存储)SBC带借位减法运算SWP字交换(寄存器与存储器之间)RSB逆向减法运算SWPB字节交换(寄存器与存储器之间)RSC带借位逆向减法运算CDP协处理器数据操作(向协处理器下达操作命令)AND与运算LDC存储器字数据传送到协处理器寄存器(字加载)ORR或运算STC协处理器寄存器字数据送到存储器(字存储)EOR异或运算MCRARM寄存器字数据传送到协处理器寄存器BIC位清零MRC协处理器寄存器字数据传送到ARM寄存MUL32 位乘法运算SWI软件中断MLA32位乘加运算BKPT断点中断SMULL64位有符号数乘法运算注. 6种移位为指令中可选操作,未列入指令列表中。4.3.1 跳转指令在ARM程序中实现程序流程跳转的方法有两种。其一是采用ARM指令集中专门的跳转指令,其二是直接向程序计数器PC写入跳转目标地址值。采用向程序计数器PC写入跳转目标地址值的方法,可以实现在4GB地址空间的任意跳转,跳转之前结合“MOV LR, PC”等指令,可以保存返回地址值,从而实现在4GB连续线性地址空间的子程序调用。而采用跳转指令可以完成从当前指令向前或向后32MB地址空间的跳转。跳转指令共有4条,分别是“单纯跳转指令(B)”、“带返回的跳转指令(BL)”、“带返回和状态切换的跳转指令(BLX)”和“带状态切换的跳转指令(BX)”。B/BL/BLX/BX格式统一为:B/BL/BLX/BX 目标地址跳转指令中的目标地址是当前PC值的偏移量(有效偏移为26位带符号数,可实现前后32MB地址空间跳转),而绝对地址须由汇编器按照相对寻址方式计算得到。遇到一条“单纯跳转指令(B)”,ARM处理器将立即跳转到指定目标地址执行。B跳转指令示例:B Label; 无条件跳转到标号Label处执行BEQ Label; 若CPSR寄存器中的Z条件码置位, 程序跳转到标号Label 处执行遇到一条“带返回的跳转指令(BL)”,ARM处理器在跳转之前会将PC当前值保存在R14寄存器中,从而可以通过将R14的内容重新加载到PC中,返回到跳转指令之后的那条指令处执行。所以,BL跳转指令是实现子程序调用的常用手段,子程序返回可通过把寄存器R14值复制到PC来完成。BL跳转指令示例:BL Label; 程序无条件跳转到标号Label处执行, 同时将当前PC值保存到R14遇到一条“带返回和状态切换的跳转指令(BLX)”,ARM处理器除了在跳转之前将PC当前值保存在R14寄存器中,还会将处理器的工作状态由ARM状态切换到Thumb状态。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX跳转指令同时实现子程序调用和处理器工作状态切换。遇到一条“带状态切换的跳转指令(BX)”,ARM处理器立即跳转到指定目标地址执行,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。4.3.2 数据处理指令ARM处理器支持的数据处理指令共有16条,可分为数据传送指令、算术逻辑运算指令和比较指令等。介绍如下:(1)MOV/ MVN(数据传送指令/数据取反传送指令)的格式为:MOV/MVNS 目的寄存器,源操作数MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器,助记符S后缀表示指令运行结果影响CPRS中条件标志位。MVN与MOV的区别仅在于把一个被“按位取反”的值传送到目的寄存器中。MOV指令示例:MOV R1, R0; 将寄存器R0的值传送到寄存器R1MOV PC, R14; 将寄存器R14 的值传送到PC(常用于子程序返回)MOV R1, R0, LSL3; 将寄存器R0的值左移3位之后传送到R1MVN指令示例:MVN R0, 0; 将立即数0 按位取反之后传送到寄存器R0中, 完成后R0=-1(2)CMP/ CMN(比较指令/反值比较指令)的格式为:CMP/CMN 操作数1,操作数2 CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位。该指令实际完成一次减法运算,但只根据结果更改条件标志位,而不存储结果。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作数2(GT条件满足),则此后带GT后缀的指令将会执行。CMN与CMP的区别仅在于先把一个寄存器的内容和另一个寄存器的内容或立即数取反后再进行比较,实际完成操作数1和操作数2相加,并根据结果更改条件标志位。CMP指令示例:CMP R1, R0; 将寄存器R1的值与寄存器R0的值相减,根据结果设置CPSR 标志位CMP R1,100; 将寄存器R1的值与立即数100相减,根据结果设置CPSR标志位CMN指令示例:CMN R1, R0; 将寄存器R1的值与寄存器R0的值相加,根据结果设置CPSR标志位CMN R1,100; 将寄存器R1 的值与立即数100相加,根据结果设置CPSR标志位(3)TST/ TEQ(位测试指令/相等测试指令)的格式为:TST/ TEQ 操作数1,操作数2TST指令把一个寄存器的内容和另一个寄存器的内容或立即数进行“按位与运算”,并根据运算结果更新CPSR中条件标志位,操作数1为待测试数据,而操作数2为一个位掩码。与TST指令所不同的是,TEQ指令进行“按位异或运算”。TST指令一般用来检测是否设置了特定的位;而TEQ指令通常用于比较操作数1和操作数2是否相等。TST指令示例:TST R1, %1; 测试R1中最低位是否置位(%表示二进制数)TST R1, 0xffe;将R1的值与0xffe按位相与,根据结果设置CPSR标志位TEQ指令示例:TEQ R1, R2; 将R1的值与R2的值按位异或,根据结果设置CPSR标志位。该指令用于比较R1和R2的内容是否相同(相同则Z标志置位)。(4)ADD/ADC(加法指令/带进位加法指令)的格式为:ADD/ADCS 目的寄存器, 操作数1, 操作数2ADD指令把操作数1加上操作数2,并将结果存放到目的寄存器中,可用于有符号数或无符号数加法运算。操作数1应该是寄存器,操作数2可以是寄存器,也可以是被移位的寄存器或一个立即数。与ADD指令有所不同的是,ADC指令还要加上CPSR中的C条件标志位,这样就可以做比32位大的数的加法运算,助记符S后缀表示运行结果影响CPRS中条件标志位。ADD指令示例:ADD R0, R1, R2; R0 = R1 + R2ADD R0, R1, #256; R0 = R1 + 256ADD R0, R2, R3, LSL#1; R0 = R2 + (R3 1)ADC指令示例:ADDS R0, R4, R8; 加第一个字,更改进位标志位ADCS R1, R5, R9; 加第二个字(带进位),更改进位标志位ADCS R2, R6, R10; 加第三个字(带进位),更改进位标志位ADC R3, R7, R11; 加第四个字(带进位)以上指令序列完成两个128位数(4个字)的加法运算,第一个数由高到低存放在寄存器R7R4中,第二个数由高到低存放在寄存器R11R8中,运算结果由高到低存放在寄存器R3R0中。(5)SUB/SBC(减法指令/带借位减法指令)的格式为:SUB/SBCS 目的寄存器, 操作数1, 操作数2SUB指令把操作数1减去操作数2,并将结果存放到目的寄存器中,可用于有符号数或无符号数减法运算。操作数1应该是寄存器,操作数2可以是寄存器,也可以是被移位的寄存器或一个立即数。与SUB指令有所不同的是,SBC指令还要减去CPSR中的C条件标志位的反码,SBC指令使用进位标志来表示借位,这样就可以做大于32位的减法运算。助记符S后缀表示运行结果影响CPRS中条件标志位。SUB指令示例:SUB R0, R1, R2; R0 = R1 - R2SUB R0, R1, #256; R0 = R1 - 256SUB R0, R2, R3, LSL#1; R0 = R2 - (R3 1)SBC指令示例:SBCS R0, R1, R2; R0 = R1 - R2 - !C(前缀!表示取反),更改进位标志位(6)RSB/RSC(逆向减法指令/带借位的逆向减法指令)的格式为:RSB/RSCS 目的寄存器, 操作数1, 操作数2RSB指令把操作数2减去操作数1,并将结果存放到目的寄存器中,可用于有符号数或无符号数的减法运算。操作数1应该是寄存器,操作数2可以是寄存器,也可以是被移位的寄存器或一个立即数。与RSB指令有所不同的是,RSC指令还要减去CPSR中的C条件标志位的反码,RSC指令使用进位标志来表示借位,这样就可以做大于32位的减法运算。助记符S后缀表示运行结果影响CPRS中条件标志位。RSB指令示例:RSB R0, R1, R2; R0 = R2 R1RSB R0, R1, #256; R0 = 256 R1RSB R0, R2, R3, LSL#1; R0 = (R3 1) - R2RSC指令示例:RSC R0, R1, R2; R0 = R2R1- !C(前缀!表示取反)(7)AND/ORR/EOR(逻辑与指令/逻辑或指令/逻辑异或指令)的格式为:AND/ORR/EORS 目的寄存器, 操作数1, 操作数2AND/ORR/EOR 指令分别用于对两个操作数进行逻辑“与”/“或”/“异或”运算,并把结果放置到目的寄存器中。操作数1应该是寄存器,操作数2可以是寄存器,也可以是被移位的寄存器或一个立即数。AND指令常用于屏蔽操作数1的某些位(0),ORR指令常用于设置操作数1的某些位(1),EOR指令则常用于反转操作数1的某些位(1)。助记符S后缀表示运行结果影响CPRS中条件标志位。AND指令示例:AND R0, R0, 3; 保持R0中0、1 位不变,其余位均清零ORR指令示例:ORR R0, R0, 3; 设置R0中0、1 位(1), 其余位保持不变EOR指令示例:EOR R0, R0, 3; 反转R0中0、1 位,其余位保持不变(8)BIC(位清除指令)的格式为: BICS 目的寄存器, 操作数1, 操作数2BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应该是寄存器,操作数2可以是寄存器,也可以是被移位的寄存器或一个立即数。操作数2为32位掩码,如果在掩码中设置了某一位(1),则清除这一位,未设置的掩码位(0)保持不变。BIC指令示例:BIC R0, R0, %1011; 清除R0中0、1、3位, 其余位保持不变4.3.3 乘法指令与乘加指令ARM处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。分别介绍如下: (1)MUL(32位乘法指令/32位乘加指令)的格式为:MULS 目的寄存器, 操作数1, 操作数2MUL指令完成操作数1与操作数2的乘法运算,并把运算结果(32位)放置到目的寄存器中。其中,操作数1和操作数2均为32位的有符号数或无符号数。助记符MUL的S后缀表示运行结果影响CPSR中相应的条件标志位。MUL指令示例:MUL R0, R1, R2; R0 = R1R2MULS R0, R1, R2; R0 = R1R2,结果影响CPSR中相关条件标志位(2)MLA(32位乘加指令)的格式为:MLAS 目的寄存器, 操作数1, 操作数2, 操作数3MLA指令完成操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把运算结果(32位)放置到目的寄存器中。其中,操作数1和操作数2均为32位的有符号数或无符号数。助记符MAL的S后缀表示运行结果影响CPSR中相应的条件标志位。MAL指令示例:MLA R0, R1, R2, R3; R0 = R1R2 + R3MLAS R0, R1, R2, R3; R0 = R1R2 + R3,结果影响CPSR中相关条件标志位(3)SMULL(64位有符号数乘法指令)的格式为:SMULLS 目的寄存器Low, 目的寄存器低High, 操作数1, 操作数2SMULL指令完成操作数1与操作数2的乘法运算,并把也运算结果(64位)的低32位放置到目的寄存器Low中、高32位放置到目的寄存器High中。其中,操作数1和操作数2均为32位的有符号数。助记符SMULL的S后缀表示运行结果影响CPSR中相应的条件标志位。SMULL指令示例:SMULL R0, R1, R2, R3; R0 = (R2R3)低32位,R1 = (R2R3)高32位(4)SMLAL(64位有符号数乘加指令)的格式为:SMLALS 目的寄存器Low, 目的寄存器低High, 操作数1, 操作数2SMLAL指令完成操作数1与操作数2的乘法运算,并把运算结果(64位)的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中、高32位同目的寄存器High中的值相加后又放置到目的寄存器High中。其中,操作数1和操作数2均为32位的有符号数。对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位;对于目的寄存器High,在指令执行前存放64位加数的高32 位,指令执行后存放结果的高32位。助记符SMLAL的S后缀表示运行结果影响CPSR中相应的条件标志位。SMLAL指令示例:SMLAL R0, R1, R2, R3; R0 = (R2R3)低32位R0,R1 = (R2R3)高32位R1(5)UMULL(64位无符号数乘法指令)的格式为:UMULLS 目的寄存器Low, 目的寄存器低High, 操作数1, 操作数2与SMULL指令的不同之处仅在于,UMULL指令中的操作数1和操作数2均为32位的无符号数。(6)UMLAL(64位无符号数乘加指令)的格式为:UMLALS 目的寄存器Low, 目的寄存器低High, 操作数1, 操作数2与SMLAL指令的不同之处仅在于,UMLAL指令中的操作数1和操作数2均为32位的有符号数。4.3.4 程序状态寄存器访问指令(1)MRS(程序状态寄存器到通用寄存器的数据传送指令)的格式为:MRS条件后缀 通用寄存器, 程序状态寄存器(CPSR或SPSR)MRS指令将程序状态寄存器(CPSR或SPSR)的内容传送到通用寄存器中。使用该指令的情况一般有两种,一种是需要改变程序状态寄存器内容,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器;另一种是需要保存程序状态寄存器内容(异常处理或进程切换时),可先用该指令将程序状态寄存器内容读到通用寄存器中,然后保存。MRS指令示例:MRS R0, CPSR; 将CPSR内容传送到R0中MRS R0, SPSR; 将SPSR内容传送到R0中(2)MSR(程序状态寄存器到通用寄存器的数据传送指令)的格式为:MSR 程序状态寄存器(CPSR或SPSR)_, 操作数MSR指令将操作数的内容传送到程序状态寄存器(CPSR或SPSR)的特定域中。其中,操作数可以为通用寄存器或立即数。用于指明程序状态寄存器中需要操作的位,32位程序状态寄存器可分为4个域:位31:24为条件标志位域(用f表示);位23:16为状态位域(用s表示);位15:8为扩展位域(用x表示);位7:0为控制位域(用c表示)MSR指令通常用于恢复或改变程序状态寄存器内容,使用时通常要指明操作域。MSR指令示例:MSR CPSR, R0; 将R0的内容传送到CPSR中MSR SPSR, R0; 将R0的内容传送到SPSR中MSR CPSR_c, R0; 将R0的内容传送到SPSR中,但仅修改CPSR的控制位域4.3.5 加载/存储指令ARM处理器支持的载/存储指令共有6条。加载指令用于将存储器中的数据传送到寄存器,存储指令则用于将寄存器中的数据传送到存储器中。分别介绍如下:(1)LDR/LDRB/LDRH(字数据加载指令/字节数据加载指令/半字数据加载指令)的格式为:LDR/ LDRB/LDRH 目的寄存器, LDR指令从存储器中将一个32位的字数据传送到目的寄存器中,通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。LDR指令比较常用,且寻址方式灵活多样。LDR指令示例:LDR R0, R1; R1间址字数据读入R0LDR R0, R1, R2; R1+R2间址字数据读入R0LDR R0, R1,8; R1+8间址字数据读入R0LDR R0, R1, R2!; R1+R2间址字数据读入R0,并将新地址R1+R2写入R1LDR R0, R1,8!; R1间址字数据读入R0,并将新地址R1+8写入R1LDR R0, R1, R2 ; R1间址字数据读入R0, 并将新地址R1R2写入R1LDR R0, R1, R2, LSL2!; R1R24间址字数据读入R0,并将新地址写入R1LDR R0, R1, R2, LSL2 ; R1间址字数据读入R0,并将新地址R1R24写入R1与LDR指令不同的是,LDRB指令传送到目的寄存器的仅仅是一个字节数据(8位),同时将目的寄存器的高24位清零,LDRB指令通常用于从存储器中读取字节数据到通用寄存器,然后对数据进行处理。LDRB指令示例:LDRB R0, R1; R1间址字节数据读入R0,并将R0高24位清零LDRB R0, R1, 8 ; R18间址字节数据读入R0,并将R0高24位清零与LDR指令不同的是,LDRH指令传送到目的寄存器的仅仅是一个半字数据(16位),同时将目的寄存器的高16位清零。LDRH指令通常用于从存储器中读取半字数据到通用寄存器,然后对数据进行处理。LDRH指令示例:LDRH R0, R1; R1 间址半字数据读入R0,并将R0高16位清零LDRH R0, R1, 8; R18简址半字数据读入R0, 并将R0 高16位清零LDRH R0, R1, R2 ; R1R2简址半字数据读入R0, 并将R0高16位清零(2)STR/STRB/STRH(字数据存储指令/字节数据存储指令/半字数据存储指令)的格式为:STR/STRB/STRH 源寄存器, STR指令用于从源寄存器中将一个32位的字数据传送到存储器中,STR指令比较常用,且寻址方式灵活多样。使用方式与LDR指令相似。STR指令示例:STR R0, R1, 8; R0中字数据写入R1间址存储器中, 并将新地址R18写入R1STR R0, R1, 8; R0中字数据写入R18间址存储器中与STR指令不同的是,STRB指令用于从源寄存器中将一个字节数据(8位)传送到存储器中,该字节数据为源寄存器的低8位。STRB指令示例:STRB R0, R1; R0中字节数据写入R1间址存储器中STRB R0, R1, 8; R0 中字节数据写入R18 间址存储器中与STR指令不同的是,STRH指令用于从源寄存器中将一个半字数据(16位)传送到存储器中,该半字数据为源寄存器的低16位。STRH指令示例:STRH R0, R1; R0中半字数据写入R1间址存储器中STRH R0, R1, 8; R0中半字数据写入R18间址存储器中4.3.6 批量数据加载/存储指令ARM处理器支持的批量数据加载/存储指令共有2条。批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器;批量数据存储指令则用于将多个寄存器中的数据传送到一片连续的存储器中。LDM/STM(批量数据加载指令/批量数据存储指令)的格式为:LDM/STM类型 基址寄存器!, 寄存器列表LDM/STM指令从基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,常见用途是将多个寄存器内容入栈或出栈(堆栈寻址)。LDM/STM助记符的类型为必选后缀,共有以下8种选择: IA 正方向后调整(每次数据传送之后存储器地址加4)IB 正方向前调整(每次数据传送之前存储器地址加4)DA 反方向后调整(每次数据传送之后存储器地址减4)DB 反方向前调整(每次数据传送前存储器地址减4)FD 满递减堆栈(栈指针指向上次写入的最后一个数据单元,降序堆栈栈)ED 空递减堆栈(栈指针指向第一个空闲单元,降序堆栈)FA 满递增堆栈(栈指针指向上次写入的最后一个数据单元,升序堆栈)EA 空递增堆栈(栈指针指向第一个空闲单元,升序堆栈)。采用不同的类型后缀,可以生成4种批量数据加载指令(LDMIA、LDMIB、LDMDA、 LDMDB),4种批量数据存储指令(STMIA、STMIB、STMDA、STMDB),4种入栈指令(LDMFD、LDMED、LDMFA 、LDMEA)和4种出栈指令(STMFD、STMED、STMFA 、STMEA)供选用。基地址寄存器后缀!为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器内容保持不变。寄存器列表后缀也为可选后缀,当指令为LDM且寄存器列表中包含R15时,选用该后缀时表示除正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。须注意,基址寄存器不允许选用R15(PC)。寄存器列表可以是R0R15的任意组合。其中,连续多个寄存器列表须用“-”连接;不连续的多个寄存器列表须用“,”连接。LDM/STM指令示例:STMFD R13!, R0, R4-R12, LR ; 将R0, R4至R12, LR的内容压入堆栈中LDMFD R13!, R0, R4-R12, PC; 将堆栈内容恢复到R0, R4至R12, LR中4.3.7 数据交换指令ARM处理器支持的数据交换指令共有2?条,用于在存储器和寄存器之间交换数据。数据交换指令有如下两条:(1)SWP(字数据交换指令)的格式为:SWP 目的寄存器, 源寄存器1, 源寄存器2SWP指令实现源寄存器2所指向存储器中的字数据与源寄存器2中数据的交换,同时将源寄存器2所指向存储器中的字数据送入目的寄存器中。若源寄存器1和目的寄存器为同一个寄存器时,SWP指令实现源寄存器1与源寄存器2所指向存储器的字数据交换。SWP指令示例:SWP R0, R1, R2; R2指向存储器与R1字数据交换(同时送R0)SWP R0, R0, R1; R1指向存储器与R0字数据交换(2)SWPB(字节数据交换指令)的格式为:SWP条件B 目的寄存器, 源寄存器1, 源寄存器2与SWP指令唯一不同的是,SWPB指令实现的是字节数据的交换。SWPB指令示例:SWPB R0, R0, R1;R1 指向存储单元与R0低8 位交换SWPB R0, R1, R2; R2指向存储单元与R1低8位交换(同时送R0且高24位清零) 4.3.8 移位操作(非独立执行)ARM处理器内嵌的桶型移位器(Barrel Shifter)支持数据的各种移位操作。移位操作在ARM指令集中不作为单独指令使用,而只作为格式中的一个特殊字段,表示为指令中可选操作选项。移位操作包括6种类型,格式统一为:通用寄存器, 移位操作助记符 操作数其中,操作数可以是通用寄存器,也可以是立即数(031),其值决定移动操作位数。6种移位操作的助记符及具体操作说明如下:LSL 逻辑左移(向左移位,低位以零来填充)ASL 算术左移(与LSL等价,两者可以自由互换)LSR 逻辑右移(向右移位,左端以零来填充,最高位为零)ASR 算术右移(向右移位,左端以原第31位值填充,以使符号位保持不变)ROR 循环右移(向右循环移位,左端用右端移出位填充,最低位移至最高位)RRX 带扩展的循环右移(向右循环移位,左端以进位位C值填充,最低位移至C)LSL操作示例(ASL操作效果相同):MOV R0, R1, LSL#2; 将R1内容左移两位之后传送到R0(最低两位以零填充)LSR操作示例:MOV R0, R1, LSR#2; 将R1内容右移两位后传送到R0(最高两位以零填充)ASR操作示例:MOV R0, R1, ASR#2; 将R1内容右移两位后传送到R0(最高两位以原第31位值填充)ROR操作示例:MOV R0, R1, ROR#2; 将R1 内容循环右移两位后传送到R0RRX操作示例:MOV R0, R1, RRX#2; 将R1内容进行带扩展的循环右移两位后传送到R04.3.9 协处理器指令ARM处理器支持多达16个协处理器,用于各种协处理操作,每个协处理器只执行针对自身的协处理指令。协处理器指令的主要用途是:其一,在ARM处理器对协处理器初始化操作阶段进行相关数据处理;其二,用于ARM寄存器与协处理器寄存器之间的数据传输;其三,用于ARM协处理器寄存器与存储器之间的数据传输。ARM协处理器指令共有5条。分别介绍如下:(1)CDP(协处理器数据操作指令)的格式为:CDP 协处理器编码, 操作码1, 目的寄存器, 源寄存器1, 源寄存器2, 操作码2ARM处理器利用CDP指令通知指定协处理器执行特定操作。CDP指令不涉及ARM处理器中的寄存器和存储器,指令中的“目的寄存器”和“源寄存器”均为协处理器中的寄存器;该指令中的操作码1和操作码2也均为协处理器的操作码,是协处理器将要执行的操作。CDP指令示例:CDP P3, 2, C12, C10, C3, 4; 通知协处理器P3 完成初始化操作(2)LDC(协处理器数据加载指令)的格式为:LDCL 协处理器编码, 目的寄存器, 源寄存器LDC指令用于将源寄存器(ARM中)所指向存储器中的字数据传送到目的寄存器(协处理器中),若协处理器不能成功完成传送操作,则产生“未定义指令”异常。其中,指令助记符LDC的L后缀表示指令为长读取操作,用于双精度数据传输。LDC指令示例:LDC P3, C4, R0; 将R0指向存储器中字数据传送到协处理器P3寄存器C4中(3)STC(协处理器数据存储指令)的格式为: STCL 协处理器编码, 源寄存器, 目的寄存器STC指令用于将源寄存器(协处理器中)中字数据传送到目的寄存器(ARM中)所指向存储器中,若协处理器不能成功完成传送操作,则产生“未定义指令”异常。其中,指令助记符STC的L后缀表示的意思与LDC指令相同。STC指令示例:STC P3, C4, R0 ; 将协处理器P3 寄存器C4 中字数据传送到R0指向存储器中(4)MCR(ARM寄存器到协处理器寄存器的数据传送指令)的格式为:MCR 协处理器编码, 操作码1, 源寄存器, 目的寄存器1, 目的寄存器2, 操作码2MCR指令用于将ARM寄存器的数据传送到协处理器寄存器中。指令中的“源寄存器”为ARM寄存器,而“目的寄存器”为协处理器寄存器;指令中的操作码1和操作码2均为协处理器的操作码,是协处理器将要执行的操作。MCR指令示例:MCR P3, 3, R0, C4, C5, 6; R0经过协处理器3和6操作的结果送到C4 和C5(5)MRC(协处理器寄存器到ARM 寄存器的数据传送指令)的格式为:MRC 协处理器编码, 操作码1, 目的寄存器, 源寄存器1, 源寄存器2, 操作码2MRC指令用于将协处理器寄存器中的数据传送到ARM寄存器中。指令中的“目的寄存器”为ARM寄存器,而“源寄存器”为协处理器寄存器;指令中的操作码1和操作码2均为协处理器的操作码,是协处理器将要执行的操作。MRC指令示例:MRC P3, 3, R0, C4, C5, 6; 协处理器P3中C4和C5经过3和6操作的结果送到R0在执行以上协处理器指令过程中,若协处理器不能成功完成相应的操作,均会产生“未定义指令”异常。其中,MCR和MRC指令在ARM处理器与系统控制协处理器P15的数据传输中经常采用。4.3.10 异常产生指令ARM微处理器所支持的异常指令只有SWI(软件中断)和BKPT(断点中断)两条。(1)SWI(软件中断指令)的格式为:SWI 24 位立即数SWI指令用于产生软件中断,以便用户程序能调用操作系统例程,在SWI异常处理程序中提供相应的系统服务,SWI指令中的24位立即数指定用户程序调用系统例程的类型,相关参数由通用寄存器传递。当24位立即数被忽略时,类型由通用寄存器R0内容决定,而参数由其他通用寄存器传递。SWI指令示例:SWI 0x02; 调用编号为02的系统例程SWI调用的系统例程举例:文件器SWI 辅助读写磁盘、设置属性等; 打印机驱动器SWI 辅助使用打印并行端口; TCP/IP 协议栈SWI 用TCP/IP 协议在 Internet上发送和接收数据(2)BKPT(断点中断指令)的格式为:BKPT 16位立即数BKPT指令产生软件断点中断,可用于程序调试,16位立即数用于保存软件调试中额外的断点信息。4.4 Thumb指令及应用 为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令(指令编码为16位长度)。与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大节省了系统的存储空间。但由于Thumb 指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,实现特定的程序功能所需的Thumb指令的条数较ARM指令增多。一般情况下,Thumb指令与ARM指令的时间效率和空间效率的关系如表4.3所示。显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。表4.3 ARM指令与Thumb指令时空效率对比比较项目ARM指令Thumb指令代码存储空间代码占用空间大可节省代码占用空间约30%-40%程序中指令数程序中指令数较少指令数多出约30%-40%32位存储器指令执行速度执行速度可提高约40%执行速度较慢16位存储器指令执行速度执行速度较慢执行速度可提高约40%-50%存储器功耗存储器功耗较高存储
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工园区工业固废填埋场项目实施方案(模板)
- 供水管网升级改造工程可行性研究报告(仅供参考)
- 初中生交通安全教育
- 唯美美术教育课件
- 行为规范教育主题班会
- 电子科技大学中山学院《新闻传播学类专业导论》2023-2024学年第二学期期末试卷
- 天津天狮学院《兽医病理解剖学》2023-2024学年第二学期期末试卷
- 南华大学船山学院《互换性与测量基础》2023-2024学年第二学期期末试卷
- 清远职业技术学院《主任级管理的艺术》2023-2024学年第二学期期末试卷
- 重庆城市科技学院《园林工程(园林水景工程)》2023-2024学年第二学期期末试卷
- 《一带一路主题乐园规划》课件
- 2025新能源汽车技术的应急管理策略试题及答案
- 八年级下学期家长会课件《携手同行共筑梦想》
- 建筑劳务分包合同中的税务问题3篇
- 【课件】Unit+7+A+Day+to+Remember+Section+A(1a-1d)+课件+2024-2025学年人教版英语七年级下册
- 2024-2025人教版一年级下册数学期末考试卷附答案 (三套)
- 2024年国网吉林喆森产业管理有限公司招聘真题
- 消防作战训练安全常识及灾情处置考试题库
- 教育培训机构加盟经营合同书
- 2025年共青团入团积极分子考试题库及答案
- 2025年人教版小学二年级下册奥林匹克数学竞赛测试卷(附参考答案)
评论
0/150
提交评论