收藏 分享(赏)

ARM指令系统与汇编程序设计.doc

上传人:yjrm16270 文档编号:8553107 上传时间:2019-07-02 格式:DOC 页数:44 大小:582.50KB
下载 相关 举报
ARM指令系统与汇编程序设计.doc_第1页
第1页 / 共44页
ARM指令系统与汇编程序设计.doc_第2页
第2页 / 共44页
ARM指令系统与汇编程序设计.doc_第3页
第3页 / 共44页
ARM指令系统与汇编程序设计.doc_第4页
第4页 / 共44页
ARM指令系统与汇编程序设计.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、第 4 章 ARM 指令系统与汇编程序设计4.1 ARM 指令集概述4.1.1 ARM 指令集主要特征ARM 指令集所具有的主要特征归纳如下:1.ARM 处理器中包含大量寄存器,这些寄存器在指令集中都可用于多种用途(目的寄存器、源寄存器、地址指针等) ;2.ARM 指令集中所有指令均可条件执行,即依据条件域设定条件满足与否来决定是否执行;3.ARM 处理器采用 Load/Store 体系结构(指令集为加载/存储型) ,即 ARM 指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,存储器访问需要通过专门的加载/存储指令来实现;4.ARM 指令集均为“3 地址”指令,指令中有两个源操作数

2、寄存器和一个结果寄存器,且均可独立设定;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 表示该指令只

3、有当 CPSR 中 Z 标志置位才执行) ,后缀S 表示指令执行结果将影响 CPSR 寄存器值;空格之后的表示“目的寄存器” (如 R1) ,第一个逗号之后 表示“第一操作数 1(操作数 1) ”(如 R2) ,第二个逗号之后的 表示“第二操作数(操作数 2) ”(如#5 表示立即数 5) 。分号之后为“注释” ,由文字和符号组成(如 R1=R2+5) 。 4.1.3ARM 指令条件码域当处理器工作在 ARM 状态时,几乎所有的指令均根据 CPSR 中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条 ARM 指令包含 4 位条件码,位于指令的最

4、高 4 位31:28,可表示 16 种条件,每一种条件用两个英文字符(大写)表示,作为指令助记符的后缀。例如,跳转指令 B 加上后缀EQ 之后变为 BEQ,表示“相等则跳转 ”(即当 CPSR 中的 Z 标志置位时发生跳转) 。16 种条件标志码中只有 15 种(表 4.1)可供使用,第 16 种(1111)为暂时不能使用(系统保留)。表 4.1 ARM 指令条件码(15 项)条件码 助记符后缀 标 志 含 义0000 EQ Z 置位 相等0001 NE Z 清零 不相等0010 CS C 置位 无符号数大于或等于0011 CC C 清零 无符号数小于0100 MI N 置位 负数0101 P

5、L N 清零 正数或零0110 VS V 置位 溢出0111 VC V 清零 未溢出1000 HI C 置位, Z 清零 无符号数大于1001 LS C 清零, Z 置位 无符号数小于或等于1010 GE N 等于 V 带符号数大于或等于1011 LT N 不等于 V 带符号数小于1100 GT Z 清零 (且 N 等于 V) 带符号数大于1101 LE Z 置位 (或 N 不等于 V) 带符号数小于或等于1110 AL 忽略 无条件执行4.2 ARM 寻址方式所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM 指令系统支持如下 9 种寻址方式。4.2.1 立即寻址

6、立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如:ADD R0, R0, 0x3f; R0R00x3f该指令的第二个源操作数即为立即数,须以“”为前缀,对于以十六进制表示的立即数,还要求在“”之后加上“0x”或“ R0R1R2该指令的所有操作数均在寄存器中,实际执行效果是将寄存器 R1 和 R2 的内容相加,其结果存放在寄存器 R0 中。4.2.3 寄存器移位寻址寄存器移位寻址的操作数由寄存器的数值做相应移位而得到。移位操作在指令中以助记符形式给出,而移位的位数可用立即数或寄存器

7、寻址方式表示。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 的值

8、作为地址,利用这个地址在存储器中取得,实际执行效果是将这个操作数与 R1 相加,结果存入寄存器 R0 中。4.2.5 基址变址寻址基址变址寻址就是将寄存器(基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式:LDR R0, R1,4; R0R1 4LDR R0, R1,4!; R0R1 4、R1R1 4LDR R0, R1,4; R0R1、R1R1 4LDR R0, R1,R2; R0R1 R2第一条指令将寄存器 R1 的内容加上 4 形成操作数的有效地址,从而取得操作数存入寄存器

9、 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 表示,在每

10、次执行完加载/ 存储操作之后,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 的值为

11、起始地址的存储单元中4.2.9 堆栈寻址堆栈是一种“先进后出” (FILO )的特殊数据结构。它使用堆栈指针(专用寄存器)指示当前操作位置(总是指向栈顶) ,当堆栈指针指向最后压入堆栈的数据单元时,称为“满堆栈” ,而当堆栈指针指向下一个将要放入数据的空位置(空单元)时,称为“空堆栈”;同时,根据堆栈的生成方式又分为“升序堆栈(由低地址向高地址生成) ”和“降序堆栈(高地址向低地址生成) ”。如此,ARM 处理器支持的堆栈共有“满递增” 、 “满递减” 、 “空递增”和“空递减”4 种堆栈寻址方式或堆栈类型。例如:STMFD R13!,R0,R1,R2,R3,R4; 将 R0-R4 中的数据压

12、入堆栈(R13 为堆栈指针)LDMFD R13!,R0,R1,R2,R3,R4; 将数据出栈(恢复 R0-R4 原先的值)4.3 ARM 指令分类介绍ARM 处理器指令集由“跳转指令”、 “数据处理指令”、 “乘法指令与乘加指令”、 “程序状态寄存器(CPSR 或 SPSR)访问指令 ”、 “加载/存储指令” 、 “批量加载/存储指令”、 “数据交换指令”、 “移位指令(操作) ”、 “协处理器指令”和“异常产生指令 ”10 类构成,ARM 指令助记符及指令功能如表 4.2 所示。分类介绍如下:表 4.2 ARM 指令及功能描述(按分类顺寻排列)助记符 指令功能描述 助记符 指令功能描述B 跳

13、转 SMUAL 64 位有符号数乘加运算BL 带返回的跳转 UMULL 64 位无符号数乘法运算BLX 带返回和状态切换的跳转 UMUAL 64 位无符号数乘加运算BX 带状态切换的跳转 MRS CPSR 或 SPSR 内容传送到通用寄存器MOV 数据传送 MSR 通用寄存器内容传送到 CPSR 或 SPSR MVN 数据取反传送 LDR 存储器字数据传送到寄存器(字加载)CMP 比较 LDRB 存储器字节数据传送到寄存器(字节加载)CMN 比较反值 LDRH 存储器半字数据传送到寄存器(半字加载)TST 位测试 STR 寄存器字数据传送到存储器(字存储)TEQ 相等测试 STRB 寄存器字节

14、数据传送到存储器(字节存储)ADD 加法运算 STRH 寄存器半字数据传送到存储器(半字存储)ADC 带进位加法运算 LDM 加载多个寄存器(批量字数据加载)SUB 减法运算 STM 存储多个字数据(批量字数据存储)SBC 带借位减法运算 SWP 字交换(寄存器与存储器之间)RSB 逆向减法运算 SWPB 字节交换(寄存器与存储器之间)RSC 带借位逆向减法运算 CDP 协处理器数据操作(向协处理器下达操作命令)AND 与运算 LDC 存储器字数据传送到协处理器寄存器(字加载)ORR 或运算 STC 协处理器寄存器字数据送到存储器(字存储)EOR 异或运算 MCR ARM 寄存器字数据传送到协

15、处理器寄存器BIC 位清零 MRC 协处理器寄存器字数据传送到 ARM 寄存MUL 32 位乘法运算 SWI 软件中断MLA 32 位乘加运算 BKPT 断点中断SMULL 64 位有符号数乘法运算 注. 6 种移位为指令中可选操作,未列入指令列表中。4.3.1 跳转指令在 ARM 程序中实现程序流程跳转的方法有两种。其一是采用 ARM 指令集中专门的跳转指令,其二是直接向程序计数器 PC 写入跳转目标地址值。采用向程序计数器 PC 写入跳转目标地址值的方法,可以实现在 4GB 地址空间的任意跳转,跳转之前结合“MOV LR, PC”等指令,可以保存返回地址值,从而实现在 4GB 连续线性地址

16、空间的子程序调用。而采用跳转指令可以完成从当前指令向前或向后 32MB 地址空间的跳转。跳转指令共有 4条,分别是“单纯跳转指令(B ) ”、 “带返回的跳转指令( BL) ”、 “带返回和状态切换的跳转指令(BLX) ”和“带状态切换的跳转指令(BX) ”。B/BL/BLX/BX 格式统一为:B/BL/BLX/BX 目标地址跳转指令中的目标地址是当前 PC 值的偏移量(有效偏移为 26 位带符号数,可实现前后 32MB 地址空间跳转) ,而绝对地址须由汇编器按照相对寻址方式计算得到。遇到一条“单纯跳转指令(B) ”,ARM 处理器将立即跳转到指定目标地址执行。B 跳转指令示例:B Label

17、; 无条件跳转到标号 Label 处执行BEQ Label; 若 CPSR 寄存器中的 Z 条件码置位, 程序跳转到标号 Label 处执行遇到一条“带返回的跳转指令(BL ) ”,ARM 处理器在跳转之前会将 PC 当前值保存在R14 寄存器中,从而可以通过将 R14 的内容重新加载到 PC 中,返回到跳转指令之后的那条指令处执行。所以,BL 跳转指令是实现子程序调用的常用手段,子程序返回可通过把寄存器 R14 值复制到 PC 来完成。BL 跳转指令示例:BL Label; 程序无条件跳转到标号 Label 处执行, 同时将当前 PC 值保存到 R14遇到一条“带返回和状态切换的跳转指令(B

18、LX) ”,ARM 处理器除了在跳转之前将PC 当前值保存在 R14 寄存器中,还会将处理器的工作状态由 ARM 状态切换到 Thumb 状态。因此,当子程序使用 Thumb 指令集,而调用者使用 ARM 指令集时,可以通过 BLX跳转指令同时实现子程序调用和处理器工作状态切换。遇到一条“带状态切换的跳转指令(BX) ”,ARM 处理器立即跳转到指定目标地址执行,目标地址处的指令既可以是 ARM 指令,也可以是 Thumb 指令。4.3.2 数据处理指令ARM 处理器支持的数据处理指令共有 16 条,可分为数据传送指令、算术逻辑运算指令和比较指令等。介绍如下:(1)MOV/ MVN(数据传送指

19、令 /数据取反传送指令)的格式为: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 按位取反之后

20、传送到寄存器 R0 中, 完成后 R0=-1(2)CMP/ CMN (比较指令/ 反值比较指令)的格式为:CMP/CMN 操作数 1,操作数 2CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR 中条件标志位。该指令实际完成一次减法运算,但只根据结果更改条件标志位,而不存储结果。标志位表示的是操作数 1 与操作数 2 的关系(大、小、相等) ,例如,当操作数 1 大于操作数 2(GT 条件满足) ,则此后带 GT 后缀的指令将会执行。 CMN 与 CMP的区别仅在于先把一个寄存器的内容和另一个寄存器的内容或立即数取反后再进行比较,实际完成操作数 1 和操

21、作数 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 指令把一个寄存器

22、的内容和另一个寄存器的内容或立即数进行“按位与运算” ,并根据运算结果更新 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 的值按位异或,根

23、据结果设置 CPSR 标志位。该指令用于比较 R1 和 R2 的内容是否相同(相同则 Z 标志置位) 。(4)ADD/ADC(加法指令/带进位加法指令)的格式为:ADD/ADCS 目的寄存器, 操作数 1, 操作数 2ADD 指令把操作数 1 加上操作数 2,并将结果存放到目的寄存器中,可用于有符号数或无符号数加法运算。操作数 1 应该是寄存器,操作数 2 可以是寄存器,也可以是被移位的寄存器或一个立即数。与 ADD 指令有所不同的是,ADC 指令还要加上 CPSR 中的 C 条件标志位,这样就可以做比 32 位大的数的加法运算,助记符 S 后缀表示运行结果影响CPRS 中条件标志位。ADD

24、指令示例:ADD R0, R1, R2; R0 = R1 + R2ADD R0, R1, #256; R0 = R1 + 256ADD R0, R2, R3, LSL#1; R0 = R2 + (R3 , 操作数MSR 指令将操作数的内容传送到程序状态寄存器(CPSR 或 SPSR)的特定域中。其中,操作数可以为通用寄存器或立即数。用于指明程序状态寄存器中需要操作的位,32 位程序状态寄存器可分为 4 个域:位31:24为条件标志位域(用 f 表示) ;位23:16为状态位域(用 s 表示) ;位15:8为扩展位域(用 x 表示);位7:0为控制位域(用 c 表示)MSR 指令通常用于恢复或改

25、变程序状态寄存器内容,使用时通常要指明操作域。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 目的寄

26、存器, 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 R

27、0, R1,8!; R1 间址字数据读入 R0,并将新地址 R1+8 写入 R1LDR R0, R1, R2 ; R1 间址字数据读入 R0, 并将新地址 R1R2 写入 R1LDR R0, R1, R2, LSL2!; R1 R24 间址字数据读入 R0,并将新地址写入 R1LDR R0, R1, R2, LSL2 ; R1 间址字数据读入 R0,并将新地址 R1R24 写入 R1与 LDR 指令不同的是,LDRB 指令传送到目的寄存器的仅仅是一个字节数据(8 位) ,同时将目的寄存器的高 24 位清零,LDRB 指令通常用于从存储器中读取字节数据到通用寄存器,然后对数据进行处理。LDRB

28、指令示例: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; R1 8 简址半字数据读入 R0, 并将 R0 高 16 位清零LDR

29、H R0, R1, R2 ; R1 R2 简址半字数据读入 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 指令不同的是,ST

30、RB 指令用于从源寄存器中将一个字节数据(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 处理

31、器支持的批量数据加载/存储指令共有 2 条。批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器;批量数据存储指令则用于将多个寄存器中的数据传送到一片连续的存储器中。LDM/STM(批量数据加载指令/批量数据存储指令)的格式为:LDM/STM类型 基址寄存器!, 寄存器列表 LDM/STM 指令从基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,常见用途是将多个寄存器内容入栈或出栈(堆栈寻址) 。LDM/STM 助记符的 类型为必选后缀,共有以下 8 种选择: IA 正方向后调整(每次数据传送之后存储器地址加 4)IB 正方向前调整(每次数据传送之前存储器地址加

32、 4)DA 反方向后调整(每次数据传送之后存储器地址减 4)DB 反方向前调整(每次数据传送前存储器地址减 4)FD 满递减堆栈(栈指针指向上次写入的最后一个数据单元,降序堆栈栈)ED 空递减堆栈(栈指针指向第一个空闲单元,降序堆栈)FA 满递增堆栈(栈指针指向上次写入的最后一个数据单元,升序堆栈)EA 空递增堆栈(栈指针指向第一个空闲单元,升序堆栈)。采用不同的类型后缀,可以生成 4 种批量数据加载指令(LDMIA、LDMIB 、LDMDA 、 LDMDB),4 种批量数据存储指令(STMIA、STMIB、STMDA、STMDB),4 种入栈指令(LDMFD、LDMED 、LDMFA 、LD

33、MEA)和 4 种出栈指令( STMFD、STMED、STMFA 、STMEA)供选用。基地址寄存器后缀! 为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器内容保持不变。寄存器列表后缀 也为可选后缀,当指令为 LDM 且寄存器列表中包含 R15 时,选用该后缀时表示除正常的数据传送之外,还将 SPSR 复制到 CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。须注意,基址寄存器不允许选用 R15(PC ) 。寄存器列表可以是R0R15 的任意组合。其中,连续多个寄存器列表须用“ -”连接;不连续的多个寄存器列表须用

34、“,”连接。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 所指向存储器中的字数

35、据送入目的寄存器中。若源寄存器 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, R

36、1, R2; R2 指向存储单元与 R1 低 8 位交换 (同时送 R0 且高 24 位清零) 4.3.8 移位操作(非独立执行)ARM 处理器内嵌的桶型移位器(Barrel Shifter)支持数据的各种移位操作。移位操作在 ARM 指令集中不作为单独指令使用,而只作为格式中的一个特殊字段,表示为指令中可选操作选项。移位操作包括 6 种类型,格式统一为:通用寄存器, 移位操作助记符 操作数其中,操作数可以是通用寄存器,也可以是立即数(031) ,其值决定移动操作位数。6 种移位操作的助记符及具体操作说明如下:LSL 逻辑左移(向左移位,低位以零来填充)ASL 算术左移(与 LSL 等价,两者

37、可以自由互换)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#

38、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 协处理器寄存器与存储器之

39、间的数据传输。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(协处理器数据加

40、载指令)的格式为:LDCL 协处理器编码, 目的寄存器, 源寄存器LDC 指令用于将源寄存器(ARM 中)所指向存储器中的字数据传送到目的寄存器(协处理器中) ,若协处理器不能成功完成传送操作,则产生“未定义指令”异常。其中,指令助记符 LDC 的L后缀表示指令为长读取操作,用于双精度数据传输。LDC 指令示例:LDC P3, C4, R0; 将 R0 指向存储器中字数据传送到协处理器 P3 寄存器 C4 中(3)STC(协处理器数据存储指令)的格式为: STCL 协处理器编码, 源寄存器, 目的寄存器STC 指令用于将源寄存器(协处理器中)中字数据传送到目的寄存器(ARM 中)所指向存储器中

41、,若协处理器不能成功完成传送操作,则产生“未定义指令”异常。其中,指令助记符 STC 的L后缀表示的意思与 LDC 指令相同。STC 指令示例:STC P3, C4, R0 ; 将协处理器 P3 寄存器 C4 中字数据传送到 R0 指向存储器中(4)MCR (ARM 寄存器到协处理器寄存器的数据传送指令)的格式为:MCR 协处理器编码, 操作码 1, 源寄存器, 目的寄存器 1, 目的寄存器 2, 操作码 2MCR 指令用于将 ARM 寄存器的数据传送到协处理器寄存器中。指令中的“源寄存器”为 ARM 寄存器,而“目的寄存器”为协处理器寄存器;指令中的操作码 1 和操作码 2 均为协处理器的操

42、作码,是协处理器将要执行的操作。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,

43、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 位立即数指

44、定用户程序调用系统例程的类型,相关参数由通用寄存器传递。当 24 位立即数被忽略时,类型由通用寄存器 R0 内容决定,而参数由其他通用寄存器传递。SWI 指令示例:SWI 0x02; 调用编号为 02 的系统例程SWI 调用的系统例程举例:文件器 SWI 辅助读写磁盘、设置属性等; 打印机驱动器 SWI 辅助使用打印并行端口; TCP/IP 协议栈 SWI 用 TCP/IP 协议在 Internet 上发送和接收数据(2)BKPT(断点中断指令)的格式为:BKPT 16 位立即数BKPT 指令产生软件断点中断,可用于程序调试,16 位立即数用于保存软件调试中额外的断点信息。4.4 Thumb

45、指令及应用 为兼容数据总线宽度为 16 位的应用系统,ARM 体系结构除了支持执行效率很高的 32位 ARM 指令集以外,同时支持 16 位的 Thumb 指令(指令编码为 16 位长度) 。与等价的32 位代码相比较,Thumb 指令集在保留 32 代码优势的同时,大大节省了系统的存储空间。但由于 Thumb 指令的长度为 16 位,即只用 ARM 指令一半的位数来实现同样的功能,实现特定的程序功能所需的 Thumb 指令的条数较 ARM 指令增多。一般情况下,Thumb 指令与 ARM 指令的时间效率和空间效率的关系如表 4.3 所示。显然,ARM 指令集和 Thumb 指令集各有其优点,

46、若对系统的性能有较高要求,应使用 32 位的存储系统和 ARM 指令集,若对系统的成本及功耗有较高要求,则应使用 16 位的存储系 统 和 Thumb 指 令 集 。 当 然 ,若 两 者 结 合 使 用 , 充 分 发 挥 其 各 自 的 优 点 , 会 取 得 更 好 的 效 果。表 4.3 ARM 指令与 Thumb 指令时空效率对比比较项目 ARM 指令 Thumb 指令代码存储空间 代码占用空间大 可节省代码占用空间约 30%-40%程序中指令数 程序中指令数较少 指令数多出约 30%-40%32 位存储器指令执行速度 执行速度可提高约 40% 执行速度较慢16 位存储器指令执行速度

47、 执行速度较慢 执行速度可提高约 40%-50%存储器功耗 存储器功耗较高 存储器功耗可降低约 30%为实现 16 位的指令长度,Thumb 指令集舍弃了 ARM 指令集的一些特性:一是“条件执行” ,即 Thumb 指令均无条件执行(除跳转指令 B 之外) ;二是“3 地址”格式,即大多数 Thumb 数据处理指令均采用 2 地址格式(其中一个寄存器既是源寄存器又是目的寄存器)。此外,Thumb 指令集访问高寄存器(R8-R15 )受到一定限制(只有 MOV、ADD 和CMP 这 3 条指令可以访问) 。Thumb 指令集是 ARM 指令集的子集(压缩形式) ,所有 Thumb 指令都有对应

48、的 ARM指令(反之不然) ,而且 ARM 的编程模型也只适用于 Thumb。但 Thumb 指令集不是一个完整的体系,Thumb 指令集中没有“协处理器指令” 、 “访问程序状态字(CPSR 或 SPSR)指令” 、 “乘加指令”和“64 位乘法指令” ,一般不能仅用 Thumb 指令编写完整的汇编程序,通常采用 Thumb 指令实现通用功能,必要时借助于完善的 ARM 指令集来实现其他特殊功能。特别需要强调,异常运行模式下,处理器自动进入 ARM 状态,故必须采用 ARM 指令来编写异常处理程序。在编写 Thumb 指令时,须先要使用伪操作 CODEl6 声明(编写 ARM 指令时使用伪操作 CODE32 声明) ,在 ARM 指令中可使用 BX 指令跳转到 Thumb 指令(切换处理器运行状态) 。在应用程序的编写过程中,只要遵循过程调用规则 AAPCS(详见 4.5.6) ,Thumb子程序和 ARM 子程序就可以互相调用。Thumb 指令集如表 44 所列,与 ARM 指令集的区别主要有以下几点:除跳转指令(B)以外,其余指令均为 “无条件执行” ;绝大多数数据处理指令采用 2 地址格式而非 3 地址格式;只有 MOV、ADD 和 CMP 指令可以访问高寄存器(R8R15) ;访问低寄存器(R0R7)的数据处理指令总是影响 ALU 条件标志;访问高寄存器(R8R

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报