版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ARM汇编伪指令(转载)2007-09-06 19:26其他常用的伪指令 还有一些其他的伪指令,在汇编程序中经常会被使用,包括以下几条: AREA ALIGN CODE16 、 CODE32 ENTRY END EQU EXPORT (或 GLOBAL ) IMPORT EXTERN GET (或 INCLUDE ) INCBIN RN ROUT 1、 AREA 语法格式: AREA 段名 属性 1 ,属性 2 , AREA 伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。 属性字段表示该代码段(或数据段)的相关属性,多个属性
2、用逗号分隔。常用的属性如下: CODE 属性:用于定义代码段,默认为 READONLY 。 DATA 属性:用于定义数据段,默认为 READWRITE 。 READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。 ALIGN 属性:使用方式为 ALIGN 表达式。在默认时, ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 31 ,相应的对齐方式为 2 表达式次方。 COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的 C
3、OMMON 段共享同一段存储单元。 一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。 使用示例: AREA Init , CODE , READONLY 该伪指令定义了一个代码段,段名为 Init ,属性为只读 2、 ALIGN 语法格式: ALIGN 表达式 ,偏移量 ALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式 | 。其中,表达式的值用于指定对齐方式,可能的取值为 2 的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方
4、式为: 2 的表达式次幂偏移量。 使用示例: AREA Init , CODE , READONLY , ALIEN 3 ;指定后面的指令为 8 字节对齐。 指令序列 END 3、 CODE16、CODE32 语法格式: CODE16 (或 CODE32 ) CODE16 伪指令通知编译器,其后的指令序列为 16 位的 Thumb 指令。 CODE32 伪指令通知编译器,其后的指令序列为 32 位的 ARM 指令。 若在汇编源程序中同时包含 ARM 指令和 Thumb 指令时,可用 CODE16 伪指令通知编译器其后的指令序列为 16 位的 Thumb 指令, CODE32 伪指令通知编译器其
5、后的指令序列为 32 位的 ARM 指令。因此,在使用 ARM 指令和 Thumb 指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。 使用示例: AREA Init , CODE , READONLY CODE32 ;通知编译器其后的指令为 32 位的 ARM 指令 LDR R0 , NEXT 1 ;将跳转地址放入寄存器 R0 BX R0 ;程序跳转到新的位置执行,并将处理器切换到 Thumb 工作状态 CODE16 ;通知编译器其后的指令为 16 位的 Thumb 指令 NEXT LDR R3,0x3FF END ;程序结束
6、 4、 ENTRY 语法格式: ENTRY ENTRY 伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个 ENTRY (也可以有多个,当有多个 ENTRY 时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个 ENTRY (可以没有)。 使用示例: AREA Init , CODE , READONLY ENTRY ;指定应用程序的入口点 5、 END 语法格式: END END 伪指令用于通知编译器已经到了源程序的结尾。 使用示例: AREA Init , CODE , READONLY END ;指定应用程序的结尾 6、 EQU 语法格式: 名称 EQU 表
7、达式 ,类型 EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于 C 语言中的 define 。 其中 EQU 可用 “ * ” 代替。 名称为 EQU 伪指令定义的字符名称,当表达式为 32 位的常量时,可以指定表达式的数据类型,可以有以下三种类型: CODE16 、 CODE32 和 DATA 使用示例: Test EQU 50 ;定义标号 Test 的值为 50 Addr EQU 0x55 , CODE32 ;定义 Addr 的值为 0x55 ,且该处为 32 位的 ARM 指令。 7、 EXPORT(或GLOBAL) 语法格式: EXPORT 标号 WEAK EXP
8、ORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号在程序中区分大小写, WEAK 选项声明其他的同名标号优先于该标号被引用。 使用示例: AREA Init , CODE , READONLY EXPORT Stest ;声明一个可全局引用的标号Stest END 8、 IMPORT 语法格式: IMPORT 标号 WEAK IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。 标号在程序中区分大小写, WEAK
9、选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。 使用示例: AREA Init , CODE , READONLY IMPORT Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义 END 9、 EXTERN 语法格式: EXTERN 标号 WEAK EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区
10、分大小写, WEAK 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。 使用示例: AREA Init , CODE , READONLY EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义 END10、 GET(或INCLUDE) 语法格式: GET 文件名 GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。 汇编程序中常用的方法是
11、在某源文件中定义一些宏指令,用 EQU 定义常量的符号名称,用 MAP和 FIELD 定义结构化的数据类型,然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 “ include ” 相似。 GET 伪指令只能用于包含源文件,包含目标文件需要使用 INCBIN 伪指令 使用示例: AREA Init , CODE , READONLY GET a1.s ;通知编译器当前源文件包含源文件a1.s GE T C:a2.s ;通知编译器当前源文件包含源文件C: a2.s END 11、 INCBIN 语法格式: INCBIN 文件名 INCBIN 伪指令用于将一个目标文
12、件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。 使用示例: AREA Init , CODE , READONLY INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat INCBIN C:a2.txt ;通知编译器当前源文件包含文件C:a2.txt END 12、 RN 语法格式: 名称 RN 表达式 RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。 使用示例: Temp RN R0 ;将R0 定义一个别名Temp 13、 R
13、OUT 语法格式: 名称 ROUT ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ,而使用 ROUT 后,局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。第3节 ARM指令集 推荐给好友 打印 加入收藏 更新于2008-08-07 23:31:14 SPSR CPSR MRC ARM指令集 6种类型(53种主要助记符) : 数据处理指令(22种主要助记符) 跳转指令(4种主要助记符) Load/Store指令(16种主要助记符) 程序状态寄存器指令(2种主要助记符) 协处理器指令(5种主要助记符) 软件中断指令 (
14、2种主要助记符) 数据处理指令 数据处理指令大致可分为3类: 数据传送指令; 算术逻辑运算指令; 乘法指令 比较指令。 数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。 数据处理指令1 MOV 数据传送指令 格式:MOV S , ; 功能:Rdop1 op1可以是寄存器、被移位的寄存器或立即数。 例如: MOV R0,5 ;R0=5 MOV R0,R1 ;R0=R1 MOV R0,R1,LSL5 ;R0=R1左移5位 数据处理指令2 2MVN 数据取反传送指令 格式:MVN S , ; 功能:将op1表示的值传送到
15、目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1; op1可以是寄存器、被移位的寄存器或立即数。 例如: MVN R0,0 ;R0=-1 数据处理指令3 3ADD 加法指令 格式:ADD S , , ; 功能:RdRn+op2 op2可以是寄存器,被移位的寄存器或立即数。 例如: ADD R0,R1,5 ;R0=R1+5 ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,R2,LSL5 ;R0=R1+R2左移5位 数据处理指令4 4ADC 带进位加法指令 格式:ADC S , , ; 功能:RdRn+op2+carry op2可以是寄存器、被移位的寄存器或立即数;c
16、arry为进位标志值。该指令用于实现超过32位的数的加法。 例如: 第一个64位操作数存放在寄存器R2,R3中; 第二个64位操作数存放在寄存器R4,R5中; 64位结果存放在R0,R1中。 64位的加法可由以下语句实现: ADDS R0,R2,R4 ;低32位相加,S表示结果影响条件标志位的值 ADC R1,R3,R5 ;高32位相加 数据处理指令5 5SUB 减法指令 格式:SUB S , , ; 功能:RdRn-op2 op2可以是寄存器、被移位的寄存器或立即数。 例如: SUB R0,R1,5 ;R0=R1-5 SUB R0,R1,R2 ;R0=R1-R2 SUB R0,R1,R2,L
17、SL5 ;R0=R1-R2左移5位 数据处理指令6 6RSB 反向减法指令 格式:RSB S , , ; 功能:同SUB指令,但倒换了两操作数的前后位置,即Rdop2-Rn。 例如: RSB R0,R1,5 ;R0=5-R1 RSB R0,R1,R2 ;R0=R2-R1 RSB R0,R1,R2,LSL5 ;R0=R2左移5位-R1 数据处理指令7 7SBC 带借位减法指令 格式:SBC S , , ; 功能:RdRn-op2-!carry op2可以是寄存器、被移位的寄存器或立即数。 SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
18、 例如: 第一个64位操作数存放在寄存器R2,R3中; 第二个64位操作数存放在寄存器R4,R5中; 64位结果存放在R0,R1中。 64位的减法(第一个操作数减去第二个操作数)可由以下语句实现: SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值 SBC R1,R3,R5; 高32位相减 数据处理指令8 8RSC 带借位的反向减法指令 格式:RSC S , , ; 功能:同SBC指令,但倒换了两操作数的前后位置,即Rdop2-Rn-!carry。 例如: 前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为: SUBS R0,R2,R4; 低32位相减,S表示结
19、果影响寄存器CPSR的值 RSC R1,R5,R3; 高32位相减 数据处理指令乘法指令 ARM7TDMI具有三种乘法指令,分别为: 3232位乘法指令; 32 32位乘加指令; 32 32位结果为64位的乘/乘加指令。 数据处理指令9 9MUL 32位乘法指令 格式:MUL S , , ; 功能:RdRnop2 该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。 例如: MULS R0,R1,R2 ;R0R1R2,结果影响寄存器CPSR的值 数据处理指令10 10MLA 32位乘加指令 格式:MLA S , , , ; 功能
20、:RdRnop2+op3 op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。 例如: MLA R0,R1,R2,R3 ;R0R1R2+R3 数据处理指令11 11SMULL 64位有符号数乘法指令 格式: SMULL S , , , ; 功能:Rdh RdlRnop2 Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。 例如: SMULL R0,R1,R2,R3 ;R0R2R3的低32位 ;R1R2R3的高32位 数据处理指令12 12SMLAL 64位有符号数乘加指令 格式: SMLAL S , , , ; 功能:Rdh RdlRnop2+
21、Rdh Rdl Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数,Rdh Rdl的值为64位的加数。 例如: SMLAL R0,R1,R2,R3 ;R0R2R3的低32位+R0 ;R1R2R3的高32位+R1 数据处理指令13 13UMULL 64位无符号数乘法指令 格式: UMULL S , , , ; 功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。 例如: UMULL R0,R1,R2,R3 ;R0R2R3的低32位 ;R1R2R3的高32位 其中R2,R3的值为无符号数 数据处理指令14 14UMLAL 64位无符号数乘加指令 格式: UMLAL
22、 S , , , ; 功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,Rdh Rdl的值为64位无符号数。 例如: UMLAL R0,R1,R2,R3 ;R0R2R3的低32位+R0 ;R1R2R3的高32位+R1 其中R2,R3的值为32位无符号数 R1,R0的值为64位无符号数 数据处理指令15 15AND 逻辑与指令 格式:AND S , , ; 功能:RdRn AND op2 op2可以是寄存器,被移位的寄存器或立即数。一般用于清除Rn的特定几位。 例如: AND R0,R0,5 ;保持R0的第0位和第2位,其余位清0 数据处理指令16 16ORR 逻辑或指令 格式
23、:ORR S , , ; 功能:RdRn OR op2 op2可以是寄存器、被移位的寄存器或立即数。一般用于设置Rn的特定几位。 例如: ORR R0,R0,5 ;R0的第0位和第2位设置为1,其余位不变 数据处理指令17 17EOR 逻辑异或指令 格式:EOR S , , ; 功能:RdRn EOR op2 op2可以是寄存器、被移位的寄存器或立即数。一般用于将Rn的特定几位取反。 例如: EOR R0,R0,5 ;R0的第0位和第2位取反,其余位不变 数据处理指令18 18BIC 位清除指令 格式:BIC S , , ; 功能:RdRn AND (!op2 用于清除寄存器Rn中的某些位,并
24、把结果存放到目的寄存器Rd中. 操作数op2是一个32位掩码(mask),如果在掩码中设置了某一位,则清除Rn中的这一位;未设置的掩码位指示Rn中此位保持不变。其中,op2可以是寄存器、被移位的寄存器或立即数。 例如: BIC R0,R0,5 ;R0中第0位和第2位清0,其余位不变 数据处理指令19 19CMP 比较指令 格式:CMP , ; 功能:Rn-op1 该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。 该指令不需要显式地指定S后缀来更改状态标志。其中,操作数op1为寄存器或立即数。 例如: CMP R0,5 ;计算R0-5,根据结果设置条件标志位 ADDG
25、T R0,R0,5 ;如果R05,则执行ADDGT指令 数据处理指令20 20CMN 反值比较指令 格式:CMN , ; 功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。 例如: CMN R0,5 ;把R0与-5进行比较 数据处理指令21 21TST 位测试指令 格式:TST , ; 功能: Rn AND op1 根据结果更新CPSR中条件标志位的值,但不存储结果。 用于检查寄存器Rn是否设置了op1中相应的位。 例如: TST R0,5 ;测试R0中第0位和第2位是否为1 数据处理指令22 22TEQ 相等测试指令 格式:TEQ , ; 功能: Rn EOR op1 将寄存器
26、Rn的值和操作数op1所表示的值按位作逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果。 用于检查寄存器Rn的值是否和op1所表示的值相等。 例如: TEQ R0,5 ;判断R0的值是否和5相等 跳转指令 跳转指令用于实现程序的跳转和程序状态的切换。 ARM程序设计中,实现程序跳转有两种方式: (1)跳转指令, (2)直接向程序寄存器PC(R15)中写入目标地址值。 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转。 使用跳转指令,其跳转空间受到限制。 跳转指令1 1B 跳转指令 格式:B ; 功能: PC= PC+ addr左移两位 addr的值是相
27、对当前PC(即寄存器R15)的值的一个偏移量,而不是一个绝对地址,它是24位有符号数。实际地址的值由汇编器来计算. addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。 跳转的范围为-32MB+32MB。 例如: B exit; 程序跳转到标号exit处 exit 跳转指令2 2BL 带返回的跳转指令 格式:BL ; 功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。 该指令用于实现子程序调用,程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现。 例如: BL func; 调用子程序func fu
28、nc MOV R15,R14; 子程序返回 跳转指令2 由于返回地址保存在寄存器里,在保存R14之前不应再调用下一级的嵌套子程序;否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。这时一般是把R14压入存储器中的堆栈。由于子程序经常还需要一些工作寄存器,所以可使用多寄存器存储指令同时把这些寄存器中原有的数据一起存储。 例如: BL SUB1 SUB1 STMFD R13!,R0-R2,R14;保存工作和链接寄存器 BL SUB2 SUB2 对于不调用其他子程序的子程序(叶子程序),不需要保存R14,因为它不会被覆盖。 跳转指令3 3BLX 带返回和状态切换的跳转指令 格式:B
29、LX ; 或BLX ; 功能:处理器跳转到目标地址处,并将PC(寄存器R15)的值保存到LR寄存器(R14)中。 若为第二种格式,寄存器Rn的值是转移目标,Rn的第0位拷贝到CPSR中的T位(决定是继续执行还是切换到Thumb指令),31:0位移入PC; 如果Rn0是1,则处理器切换执行Thumb指令,并在Rn中的地址开始执行,但是需将最低为清零;如果Rn0是0,则处理器继续执行ARM指令,并在Rn中的地址处开始执行,但需将Rn1清零。 该指令用于子程序调用和程序状态的切换。 例如: BLX T16; 跳转到标号T16处执行,T16后面的指令为Thumb指令 CODE16 T16 后面指令为T
30、humb指令 跳转指令4 4BX 带状态切换的跳转指令 格式:BX ; 功能:处理器跳转到目标地址处,从那里继续执行; 目标地址为寄存器Rn的值和0xFFFFFFFE作与操作的结果。 目标地址处的指令可以是ARM指令,也可以是Thumb 指令。 例如: ADR R0,exit ;标号exit处的地址装入R0中 BX R0 ;跳转到exit处 Load/Store指令 Load/Store指令用于寄存器和内存间数据的传送。 Load用于把内存中的数据装载到寄存器中。 Store用于把寄存器中的数据存入内存。 该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中
31、时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。 Load/Store指令分为3类: (1)单一数据传送指令(LDR和STR等) (2)多数据传送指令(LDM和STM) (3)数据交换指令(SWP和SWPB) 条件执行的举例 将流程图对应GCD算法转换成 1 普通汇编代码 2ARM 汇编代码. 只使用 CMP, B 及 SUB指令 条件执行的举例 普通汇编代码 gcd cmp r0, r1 ;reached the end? beq stop blt less ;if r0 r1 sub r0, r0, r1 ;subtract r1 from r0 bal gcd
32、 less sub r1, r1, r0 ;subtract r0 from r1 bal gcd stop ARM 代码 gcd cmp r0, r1 ;if r0 r1 subgt r0, r0, r1 ;subtract r1 from r0 sublt r1, r1, r0 ;else subtract r0 from r1 bne gcd ; Load/Store指令1-1 1LDR 字数据加载指令 格式:LDR , ; 功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。 地址addr可以是一个简单的值、一个偏移量,或者是一
33、个被移位的偏移量。 寻址方式: Rn:基址寄存器。 Rm:变址寄存器。 Index:偏移量,12位的无符号数。 LDR Rd,Rn ;把内存中地址为Rn的字数据装入寄存器Rd中 LDR Rd,Rn,Rm ;将内存中地址为Rn+Rm的字数据装入寄存器Rd中 Load/Store指令1-2 LDR Rd,Rn,index ;将内存中地址为Rn+index的字数据装入Rd中 LDR Rd,Rn,Rm,LSL5 ;将内存中地址为Rn+Rm32的字数据装入Rd LDR Rd,Rn,Rm ! ;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn LDR Rd,Rn,index ! ;将
34、内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn LDR Rd,Rn,Rm,LSL5! ;将内存中地址为Rn+Rm32的字数据装入Rd,并将新地址Rn+Rm32写入Rn Load/Store指令1-3 LDR Rd,Rn,Rm ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn LDR Rd,Rn,index ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn LDR Rd,Rn,Rm,LSL5 ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm32写入Rn 例如: LDR R0,R1,R2,LSL
35、5! ; 将内存中地址为R1+R232的字数据装入寄存器R0,并将新地址R1+R232写入R1 Load/Store指令2 LDRB 字节数据加载指令 格式:LDR B , ; 功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。 例如: LDRB R0,R1 ;将内存中起始地址为R1的一个字节数据装入R0中 Load/Store指令3 3LDRBT 用户模式的字节数据加载指令 格式:LDR BT , ; 功能:同LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。 Load/Store指令4 4LDRH 半
36、字数据加载指令 格式:LDR H , ; 功能:同LDR指令,但该指令只是从内存读取一个16位的半字数据而不是一个32位的字数据,并将Rd的高16位清0。 例如: LDRH R0,R1 ;将内存中起始地址为R1的一个半字数据装入R0中 Load/Store指令5 5LDRSB 有符号的字节数据加载指令 格式:LDR SB , ; 功能:同LDRB指令,但该指令将寄存器Rd的高24位设置成所装载的字节数据符号位的值。 例如: LDRSB R0,R1 ;将内存中起始地址为R1的一个字节数据装入R0中,R0的高24位设置成该字节数据的符号位 Load/Store指令6 6LDRSH 有符号的半字数据
37、加载指令 格式:LDR SH , ; 功能:同LDRH指令,但该指令将寄存器Rd的高16位设置成所装载的半字数据符号位的值。 例如: LDRSH R0,R1 ;将内存中起始地址为R1的一个16位半字数据装入R0中,R0的高16位设置成该半字数据的符号位 Load/Store指令7 7LDRT 用户模式的字数据加载指令 格式:LDR T , ; 功能:同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。 addr所表示的有效地址必须是字对齐的,否则从内存中读出的数值需进行循环右移操作。 Load/Store指令8 8STR 字数据存储指令 格式:STR , ; 功能:
38、把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。 地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。 寻址方式同LDR指令。 例如: STR R0,R1,5! ;把R0中的字数据保存到以R1+5为地址的内存中,然后R1R1+5 STR指令应用举例 STR指令应用举例 Load/Store指令9 9STRB 字节数据存储指令 格式:STR B , ; 功能:把寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中。 其他用法同STR指令。 例如: STRB R0,R1 ;将寄存器R0中的低8位数据存入R1表示
39、的内存地址中 Load/Store指令10 10STRBT 用户模式的字节数据存储指令 格式:STR BT , ; 功能:同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 Load/Store指令11 11STRH 半字数据存储指令 格式:STR H , ; 功能:把寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的。 其他用法同STR指令。 例如: STRH R0,R1 ;将寄存器R0中的低16位数据存入R1表示的内存地址中 存储格式对于加载/存储指令的影响 Load/Store指令12 12STRT
40、用户模式的字数据存储指令 格式:STR T , ; 功能:同STR指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 Load/Store指令13-1 13LDM 批量数据加载指令 格式: LDM !, ; 功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。 该指令一般用于多个寄存器数据的出栈。 type字段种类: IA:每次传送后地址加1。 IB:每次传送前地址加1。 DA:每次传送后地址减1。 DB:每次传送前地址减1。 FD:满递减堆栈。 ED:空递减堆栈。 FA:满递增堆栈。 EA:空递
41、增堆栈。 注意:有一个约定,编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。 Load/Store指令13-2 例如 LDMIA/IB/DA/DB R13!,R0-R1,R3; 各指令执行完后,结果如图所示。 Load/Store指令13-4 FD、ED、FA和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。 一个满栈的栈指针指向上次写的最后一个数据单元. 空栈的栈指针指向第一个空闲单元。 一个降序栈是在内存中反向增长而升序栈在内存中正向增长。 Load/Store指令13-5 格式: LDM !, ; !:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。
42、 :当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模式下的寄存器,否则指示指令执行时,将寄存器SPSR的值复制到CPSR中。 Load/Store指令14-1 14STM 批量数据存储指令 格式:STM !, ; 功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。 该指令一般用于多个寄存器数据的入栈。 :指示指令所用的寄存器为用户模式下的寄存器。 其他参数用法同LDM指令。 例如: STMEA R13!,R0-R12,PC ;将寄存器R0R12以及程序计数器PC的值保存到R13指示的堆栈中 Load/St
43、ore指令14-2 举例:其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器 Load/Store指令14-3 堆栈操作和数据块传送指令类似,也有4种模式,它们之间的关系如下表所示: Load/Store指令15 15SWP 字数据交换指令 格式:SWP , , ; 功能: Rdop2,op2op1 从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中。 op1,op2均为寄存器。 例如: SWP R0,R1,R2 ;将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中 Load/St
44、ore指令16 16SWPB 字节数据交换指令 格式:SWP B , , ; 功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到同一内存地址中。 例如: SWPB R0,R1,R2 ;将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节数据保存到R2所表示的内存单元中 程序状态寄存器指令 用于状态寄存器和通用寄存器间传送数据。 总共有两条指令:MRS和MSR。 两者结合可用来修改程序状态寄存器的值。 程序状态寄存器指令1 1MRS 程序状态寄存器到通用寄存器的数据传送指令
45、格式:MRS ,CPSR/SPSR; 功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。 当进入中断服务程序或进程切换时,该指令可用来保存当前状态寄存器的值。 例如: MRS R0,CPSR ;状态寄存器CPSR的值存入寄存器R0中 程序状态寄存器指令2 2MSR 通用寄存器到程序状态寄存器的数据传送指令 格式:MSR CPSR/SPSR_ , ; 功能:用于将寄存器Rd的值传送到程序状态寄存器中。 当退出中断服务程序或进程切换时,该指令可用来恢复状态寄存器的值。 操作数op1可以是通用寄存器或立即数。 :用来设置状态寄存器中需要操作的位。 32位的状态寄存器可以分为4个域: 位31:24为条件标志位域,用f表示。 位23:16为状态位域,用s表示。 位15:8为扩展位域,用x表示。 位7:0为控制位域,用c表示。 例如:MSR CPSR_f,R0 ;用R0的值修改CPSR的条件标志域 MSR CPSR_fsxc,#
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年八年级地理上册 第四章 第三节 工业(工业的分布)教学实录 (新版)新人教版
- 药学人员个人工作总结
- 个人主管述职报告集合十篇
- 大病困难补助申请书集锦15篇
- 冀教版小学信息技术三年级上册《六 漂亮的剪贴画》教学实录
- Unit 7 Happy Birthday Section A 2a~2e教学实录-2024-2025学年人教版英语七年级上册
- 研究食品工业与现代物流协同发展
- 物流行业发展状况及市场需求分析
- 跳蚤效应详解
- 2024六年级语文下册 第二单元 习作:写作品梗概教学实录第一课时教学实录 新人教版
- 2023年全球自然灾害评估报告-全球灾害数据平台
- 2025届黑龙江省哈尔滨市哈三中高一上数学期末综合测试试题含解析
- 纸巾合同范本
- 金庸人物课件
- 江西省赣州区2024年四年级数学第一学期期末教学质量检测模拟试题含解析
- 四川省德阳市2025届数学三年级第一学期期末联考模拟试题含解析
- 《科研诚信与学术规范》学习通超星期末考试答案章节答案2024年
- 2024年新高考新题型第19题新定义压轴解答题数学试题及答案
- 2024年平面设计师技能及理论知识考试题库(附含答案)
- 2024年高考真题-英语(新高考Ⅰ卷) 含解析
- 2023-2024年6月广东省普通高中学业水平生物考试及答案
评论
0/150
提交评论