收藏 分享(赏)

第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt

上传人:j35w19 文档编号:8833411 上传时间:2019-07-14 格式:PPT 页数:23 大小:172KB
下载 相关 举报
第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt_第1页
第1页 / 共23页
第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt_第2页
第2页 / 共23页
第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt_第3页
第3页 / 共23页
第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt_第4页
第4页 / 共23页
第3章 3.3 ARM指令及应用程序设计--数据传送指令.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、3.3.2 ARM数据传送(存储器访问)指令,ARM处理器是加载存储体系结构的典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM的加载存储指令可以实现字、半字、无符号有符号字节操作;多寄存器加载存储指令可实现一条指令加载存储多个寄存器的内容,效率大大提高;,SWP指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。 ARM处理器除对RAM操作以外,对外围I/O的访问均要通过加载存储指令进行。 表3-7所列为ARM存储器访问指令表。,(1) LDR和STR加载存储指令 加载存储字和无符号字节指令,使用STR指令将单一字节或字存储到内存,使用LDR指令从内存中加载单一字

2、节或字到寄存器。LDR指令用于从内存中读取数据放入寄存器中;STR指令用于将寄存器中的数据保存到内存。,指令格式如下:LDRcondT Rd,;加载指定地址上的数据(字),放人Rd中STRcondT Rd,;存储数据(字)到指定地址的存储单元,要存储的数据在Rd中LDRcondBT Rd,;加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零 STRcondBT Rd, ;存储字节数据,要存储的数据在Rd,最低字节有效,其中,T为可选后缀。 若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下。 T在用户模式下无效,不能与前索引偏移一起使用T。 LDR/S

3、TR指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。 即地址可表示为:Rn,地址偏移量Rn,地址偏移量 地址偏移量有以下3种格式:,立即数,立即数可以是一个无符号的数值。 这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。指令举例如下: LDR R1,R0,#0x12 ;将R0+0x12地址处的数据读出,保存到Rl中(R0的值不变) LDR R1,R0,# -0x12 ;将R0-0x12地址处的数据读出,保存到R1中(R0的值不变),寄存器,寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 指令举例如

4、下: LDR R1,R0,R2 ;将R0+R2地址处的数据读出,保存到R1中LDR R1,R0,-R2 ;将R0-R2地址处的数据读出,保存到R1中,寄存器及移位常数,寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 指令举例如下: LDR R1,R0,R2,LSL #2 ;将R0+R24地址处的数据读出,保存到R1中(R0、R2的值不变) LDR R1,R0,-R2,LSL #2;将R0-R24地址处的数据读出,保存到R1中(R0、R2的值不变),从寻址方式的地址计算方法分,加载/存储指令有以下4种形式:,零偏移:Rn的值作为传送数据的地址,即地址偏移量为0。指令举例如

5、下:LDR Rd,Rn 相对偏移: 程序相对偏移是前索引形式的另一个版本。汇编器由PC寄存器计算偏移量,并将PC寄存器作为Rn生成前索引指令。不能使用后缀“!”指令举例如下:LDR Rd,label ;label为程序标号。label必须是在当前指令4 KB范围内,前索引偏移:在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址。若使用后缀“!”,则结果写回到Rn中,且Rn的值不允许为R15。指令举例如下:LDR R3,R0,#0x04!STR R3,R0,R1LDR R3,R0,R2,LSR # 0x02,后索引偏移: Rn的值用做传送数据的存储地址。在数据传送后,将偏移量与Rn

6、相加,结果写回到Rn中。Rn不允许是R15。指令举例如下:LDR R3,R0,#0x04STR R3,R0,R1LDR R3,R0,R2,LSR # 0x02地址对齐大多数情况下,必须保证用于32位传送的地址是32位对齐的。,(2) 加载存储半字和有符号字节,这类LDR/STR指令可加载有符字节,加载有符号半字,加载存储无符号半字。 除了不允许寄存器移位偏移外,偏移量格式、寻址方式与加载存储字和无符号字节指令相同。 指令格式如下: LDRcondH Rd,;加载半字数据,放人Rd中,即Rd最低16位有效,高16位清零. STRcondH Rd, ;存储半字数据,要存储的数据在Rd,最低16位有

7、效,LDRcondSB Rd, ;加载指定地址上的数据(有符号字节),放入Rd中 LDRcondSH Rd, ;加载指定地址上的数据(有符号半字),放入Rd中说明:有符号位半字字节加载是指有符号位加载扩展到32位;无符号位半字字节加载是指零扩展到32位。地址对齐对半字传送的地址必须为偶数。非半字对齐的半字加载将使Rd内容不可靠;非半字对齐的半字存储将使指定地址的2字节存储内容不可靠。,加载存储半字和有符号字节指令举例如下: LDRSB R1,R0,R3 ;将R0+R3地址上的字节数据读到R1,高24位用符号位扩展 LDRSH R1,R9 ;将R9地址上的半字数据读出到R1,高16位用符号位扩展

8、 LDRH R6,R2,#2;将R2地址上的半字数据读出到R6,高16位用零扩展,R2=R2+2 STRH R1,R0,#2!;将R1的数据保存到R0+2地址中,只存储低2字节数据,R0=R0+2 LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。,(3) SWP寄存器和存储器交换指令,SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。 指令格式如下: SWPcondB Rd,Rm,Rn

9、 其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd为数据从存储器加载到的寄存器;Rm的数据用于存储到存储器中,若Rm与Rd相同,则为寄存器与存储器内容进行交换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。,指令举例如下:SWP R1,R1,R0;将Rl的内容与R0指向的存储单元的内容进行交换SWPB R1,R2,R0;将R0指向的存储单元的内容读取1字节数据到R1中(高24位清零),并将R2的内容写入到该内存单元中(最低字节有效),(4) LDM和STM数据块(多寄存器)加载存储指令,LDM和STM指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。 LDM

10、为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。 指令格式如下:LDMcond Rn!,reglistSTMcond Rn!,reglist,LDM/STM的主要用途是现场保护、数据复制和参数传送等。 其模式有如下8种(前面4种用于数据块的传输,后面4种是堆栈操作): IA: 每次传送后地址加4; IB: 每次传送前地址加4; DA: 每次传送后地址减4; DB: 每次传送前地址减4; FD: 满递减堆栈; ED: 空递减堆栈; FA: 满递增堆栈; EA: 空递增堆栈。,指令格式中,寄存器Rn为基址寄存器,装有传送数据的初始地址,Rn不允许为R1

11、5。 后缀“!”表示最后的地址写回到Rn中。 寄存器列表reglist可包含多于一个寄存器或包含寄存器范围,使用“,”分开,如R1,R2,R6R9,寄存器按由小到大排列。 后缀“”不允许在用户模式或系统模式下使用。若在LDM指令且寄存器列表中包含有PC时使用,那么除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中,这可用于异常处理返回。 使用后缀“”进行数据传送且寄存器列表不包含PC时,加载存储的是用户模式的寄存器,而不是当前模式的寄存器。,当Rn在寄存器列表中且使用后缀“!”时,对于STM指令,若Rn为寄存器列表中的最低数字的寄存器,则会将Rn的初值保存;其它情况下Rn的加载值和存储值不可预知。 地址对齐这些指令忽略地址位1:0。 举例如下: LDMIA R0!,R3 - R9;加载R0指向地址上的多字数据,保存到R3R9中,R0值更新 STMIA R1!,R3 - R9;将R3R9的数据存储到R1指向的地址上,R1值更新 STMFD SP!,R0 - R7,LR ;现场保存,将R0R7、LR人栈 LDMFD SP!,R0 - R7,PC ;恢复现场,异常处理返回,ARM存储器访问指令表,返回,

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

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

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


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

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

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