《存储器访问指令》由会员分享,可在线阅读,更多相关《存储器访问指令(27页珍藏版)》请在金锄头文库上搜索。
1、存储器访问指令存储器访问指令知识回顾ARM体系结构概述体系结构概述 了解了解ARM结构的特点结构的特点了解了解ARMARM系列微处理器系列微处理器 掌握掌握ARMARM处理器的模式处理器的模式掌握掌握ARMARM存储器用途及结构存储器用途及结构 3嵌入式ARM指令系统第章本章目标本章目标了解了解ARMARM指令系统的特点指令系统的特点掌握掌握ARMARM指令的寻址方式及指令指令的寻址方式及指令了解了解ThumbThumb指令系统指令系统 3.2 ARM指令系统指令系统3.2.4 存储器访问指令存储器访问指令vARM指令集存储器访问指令 ARM处 理 器 是 Load(从 内 存 加 载 到CP
2、U)/Store(从从CPUCPU存存储储到到内内存存)型的,即它对数据的操作是通过将将数数据据从从存存储储器器( (内内存存) )加加载载到到(CPUCPU)片片内内寄寄存存器器中中进进行行处处理理, ,处理完成后的结果经过寄存器存回到存储器中,以加快对片外存储器进行数据处理的执行速度. 存储器访问指令分为单单寄寄存存器器操操作作指指令令,多寄存器操作指令多寄存器操作指令和和寄存器和存储器交换指令寄存器和存储器交换指令。 3.2 ARM指令系统指令系统助记符说明操作条件码位置LDR Rd,addressing 加载字数据(32bit)Rdaddressing,addressing索引LDRc
3、ondLDRB Rd,addressing 加载无符号字节无符号字节数据Rdaddressing,addressing索引LDRcondBLDRT Rd,addressing以用户模式加载字数据Rdaddressing,addressing索引LDRcondTLDRBT Rd, addressing 以用户模式加载无符号字节数据Rdaddressing,addressing索引LDRcondBTLDRH Rd, addressing 加载无符号半字数据Rdaddressing,addressing索引LDRcondHLDRSB Rd, addressing 加载有符号字节数据Rdaddress
4、ing,addressing索引LDRcondSBLDRSH Rd, addressing加载有符号半字数据 Rdaddressing,addressing索引 LDRcondSH ARM存储器访问指令单寄存器加载(LDR) 3.2 ARM指令系统指令系统助记符说明操作条件码位置STR Rd, addressing 存储字数据addressingRd,addressing索引STRcondSTRB Rd,addressing 存储字节数据addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用户模式存储字数据addressingRd, add
5、ressing索引STRcondTSTRBT Rd,addressing 以用户模式存储字节数据addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存储半字数据addressing Rd,addressing索引STRcondHARM存储器访问指令单寄存器存储(STR) 所有单寄存器加载/存储指令可分为“字字和和无无符符号号字字节节加加载载存存储储指指令令”和“半字和有符号字节加载存储指令半字和有符号字节加载存储指令。 3.2 ARM指令系统指令系统LDR和STR字和无符号字节加载/存储指令 LDR指令用于从内存中读取单一字或字节数据存入寄
6、存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:ARM存储器访问指令单寄存器加载/存储 LDRcondTRd, ;将指定地址上的字数据读入Rd STRcondTRd, ;将Rd中的字数据存入指定地址 LDRcondBTRd, ;将指定地址上的字节数据读入Rd STRcondBTRd, ;将Rd中的字节数据存入指定地址 其中,T为可选后缀。若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是在用户模式下进行的。T在用户模式下无效,不能与前索引偏移一起使用不能与前索引偏移一起使用T T。 3.2 ARM指令系统指令系统ARM存储器访问指令单寄存器加载/存储L
7、DR和STR字和无符号字节加载/存储指令编码指令执行的条件码I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位P表示前/后变址U表示加/减B为1表示字字节节访问,为0表示字字访问W表示回写为指令的寻址方式Rd为源/目标寄存器Rn为基址寄存器L用于区别加载(L为1)或存储(L为0) 3.2 ARM指令系统指令系统ARM存储器访问指令单寄存器加载/存储LDR和STR字和无符号字节加载字和无符号字节加载/ /存储指令存储指令 LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一一个个基基址址寄寄存存器器( (不不可可改改变变) ),可以为任一个通用寄存器;另另一一部分为一个地址偏移
8、量部分为一个地址偏移量。地址偏移量有以下地址偏移量有以下3 3种格式种格式: 立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,#0x12 寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,R2 寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,R2,LSL #2 3.2 ARM指令系统指令系统ARM存储器访问指令单寄存器加载/存储从寻址方式的地址计算方法分,加载/存储指令有以下4种格式: 零偏移。如:L
9、DR Rd,Rn 前索引偏移。如:LDR Rd,Rn,#0x04!程序相对偏移。如:LDR Rd,labe1 后索引偏移。如:LDR Rd,Rn,#0x04注意:大多数情况下,必须保证字数据操作的地址是大多数情况下,必须保证字数据操作的地址是3232位对齐的,位对齐的, 即即4 4的倍数的倍数。Rd是用于加载或存储的ARM寄存器. Rn是存储器的基址寄存器.LDR和STR字和无符号字节加载/存储指令 3.2 ARM指令系统指令系统ARM存储器访问指令单寄存器加载/存储前索引偏移(preindexed)如:LDR Rd,Rn,#0x04!在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存
10、储器地址.若使用后缀”!”,则结果写回到Rn中,且且RnRn不允许是不允许是R15R15RdRn+0x04;RnRn+4 后索引偏移(postindexed)如:LDR Rd,Rn,#0x04Rn的值用做传送数据的存储器地址.在数据传送后,将偏移量加到Rn中.结果写回到Rn. Rn不允许是R15RdRn; RnRn+0x04LDR和STR字和无符号字节加载/存储指令 3.2 ARM指令系统指令系统ARM存储器访问指令单寄存器加载/存储LDR和STR字和无符号字节加载/存储指令例子LDR R8, R10 ; R8R10LDRNE R2, R5,#960 ; (有条件地) R2R5+960 , R
11、5R5+960LDR R0, localdata ; 加载一个字,该字位于标号localdata所在地址STR R2, R9,#consta-struc ;consta-struc是常量表达式,该常量 ;值的范围为04095STRB R0, R3,-R8,ASR #2 ;R0R3-R8/4,存储R0的最低有效 ;按字节操作按字节操作R3和R8不变.STR R5, R7,#-8 ;R5R7 , R7R7-8 3.2 ARM指令系统指令系统LDR和STR半字和有符号字节加载/存储指令 这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符号字
12、节指令相同。 ARM存储器访问指令单寄存器加载/存储 LDRcondSB Rd, ;将指定地址上的有符号字节读入Rd LDRcondSH Rd, ;将指定地址上的有符号半字读入Rd LDRcondH Rd, ;将指定地址上的半字数据读入Rd STRcondH Rd, ;将Rd中的半字数据存入指定地址注意:1.有符号位半字符号位半字/ /字节加载是指用符号位加载扩展到字节加载是指用符号位加载扩展到3232位位, 无符号半字加载是指用零扩展到无符号半字加载是指用零扩展到3232位位;2.半半字字读读写写的的指指定定地地址址必必须须为为偶偶数数,否则将产生不可靠的结果; 3.2 ARM指令系统指令系
13、统ARM存储器访问指令单寄存器加载/存储LDR和STR半字和有符号字节加载/存储指令编码指令执行的条件码I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位P表示前/后变址U表示加/减W表示回写为指令的寻址方式Rd为源/目标寄存器Rn为基址寄存器L用于区别加载(L为1)或存储(L为0)S为1表示有符号访问,为0表示无符号访问H为1表示半字访问,为0表示字节访问 3.2 ARM指令系统指令系统LDR和STR半字和有符号字节加载/存储指令ARM存储器访问指令单寄存器加载/存储例子LDREQSH R11, R6 ;(有条件地),R11R6加载16位半字, ;带符号扩展到32位LDRH R1 ,
14、 R0,#22 ;R1R0+22,加载16位半字,零扩展到 ;32位,半字的对齐是半字的对齐是2的倍数的倍数STRH R4 , R0,R1! ;R4R0+R1,存储最低的有效半字到 ; R0+R1地址开始的两个字节,地址写回 ;到R0LDRSB R6 , constf ;加载位于标号constf地址中的字节,带 ;符号扩展错例:半字或者有符号字节半字或者有符号字节operands不能使用寄存器移位方式不能使用寄存器移位方式LDRSB R1 , R6, R3,LSL #4 ;这种格式只对字和无符号字节这种格式只对字和无符号字节 ;传送有效传送有效 3.2 ARM指令系统指令系统LDR和STR指令
15、应用示例:1.加载/存储字和无符号字节指令LDRR2,R5;将R5指向地址的字数据存入R2,字操作字操作STRR1,R0,#0x04;将R1的数据存储到R0+0x04地址,字操作字操作LDRBR3,R2,#1 ;将R2指向地址的字节数据存入R3,R2R2+1, 字节操作字节操作STRBR6,R7 ;将R7指向地址的字节数据存入R6,字节操作字节操作2.加载/存储半字和有符号字节指令LDRSB R1,R0,R3;将R0+R3地址上的字节数据存入R1,有符号有符号字节字节;高24位用符号扩展LDRH R6,R2,#2;将R2指向地址的半字数据存入R6,高16位用0扩展;读出后,R2=R2+2,半字
16、操作半字操作STRH R1,R0,#2!;将R1的半字数据保存到R0+2地址,半字操作半字操作;只存储R1的低低2字节内容字节内容,R0=R0+2ARM存储器访问指令单寄存器加载/存储 3.2 ARM指令系统指令系统助记符说明操作条件码位置LDMmode Rn!,reglist 多寄存器加载reglistRn., Rn回写等LDMcondmodeSTMmode Rn!,reglist 多寄存器存储Rn.reglist,Rn回写等STMcondmodeARM存储器访问指令多寄存器加载/存储 多多寄寄存存器器加加载载/ /存存储储指指令令可可以以实实现现在在一一组组寄寄存存器器和和一一块块连连续续
17、的的内内存存单单元元之之间间传传输输数数据据。LDMLDM为为加加载载多多个个寄寄存存器器;STMSTM为为存存储储多多个个寄寄存存器器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。编号低的寄存器在存储数据或加载数据时对应于存储器的低地址编号低的寄存器在存储数据或加载数据时对应于存储器的低地址 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储 多寄存器加载/存储指令格式如下: LDMcond Rn!,reglist STMcond Rn!,reglistcond:指令执行的条件;模式:控制地址的增长方式,一共有8 8种种模
18、式;!:表示在操作结束后,将最后的地址写回写回RnRn中中;reglist :表示寄存器列表,用用“ ”括括起起来来。可以包含多个寄存器,它们使用使用“,”,”隔开隔开,如R1,R2,R6-R9,寄存器由小到大排列,按顺序编写按顺序编写;:加入该后缀后,进行数据传送且寄存器列表不包含PC时,加载/存储的寄存器是用户模式下的,而不是当前模式的寄存器。若若在在LDMLDM指指令令且且寄寄存存器器列列表表中中包包含含有有PCPC时时使使用用,那那么么除除了了正正常常的的多多寄寄存存器器传传送送外外,还还将将SPSRSPSR也也拷拷贝贝到到CPSRCPSR中中,这这可可用用于于异异常常处处理理返返回回
19、。注意:该后缀不允许在用户模式或系统模式下使用。 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储LDM和STM多寄存器加载/存储指令编码指令执行的条件码S对应于指令中的”符号P表示前/后变址U表示加/减W表示回写寄存器列表Rn为基址寄存器L用于区别加载(L为1)或存储(L为0) 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储 多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。模式说明模式说明IA每次传送后地址加4FD满递减堆栈IB每次传送前地址加4ED空递减堆栈DA每次传送后地址减4FA满递增堆栈DB每次传送前地
20、址减4EA空递增堆栈数据块传送操作堆栈操作 进行数据复制时,先设置好源数据指针和目标指针,然后使用 块 拷 贝 寻 址 指 令 LDMIA/STMIA、 LDMIB/STMIB、 LDMDA/STMDA、LDMDB/STMDB进行读取和存储 。 进行堆栈操作操作时,要要先先设设置置堆堆栈栈指指针针(SPSP),然然后后使使用用堆堆 栈栈 寻寻 址址 指指 令令 STMFD/LDMFD 、 STMED/LDMED、 STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储数据块传送指令操作过程如右图所示,其中R1为指令执行
21、前的基址寄存器,R1则为指令执行后的基址寄存器;存放时放置的方式低低地地址址对对低低编编号号寄寄存存器器的的内内容容,高高地地址址对对高高编编号号寄寄存存器器的内容的内容。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H400
22、4H4000H4014H4010H400CH每条指令是如何将3个寄存器的数据存入寄存器的,以及在使用自动变址的情况下基址寄存器是如何改变的注意: 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储数据块传送存储堆栈操作压栈说明数据块传送加载堆栈操作出栈说明STMDASTMED空递减LDMDALDMFA满递减STMIASTMEA空递增LDMIALDMFD满递增STMDBSTMFD满递减LDMDBLDMEA空递增STMIBSTMFA满递增LDMIBLDMED空递减;使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆栈指令进行堆
23、栈操作STMEDR0!,R5-R6. . .LDMEDR0!,R5-R6 两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。 堆堆栈栈操操作作和和数数据据块块传传送送指指令令类类似似,也也有有4 4种种模模式式,它它们们之之间间的关系如下表所示:的关系如下表所示: 3.2 ARM指令系统指令系统ARM存储器访问指令多寄存器加载/存储例子LDMIA R8, R0,R2,R9;加载R8指向的地址上多 ;字数据,保存到R0,R2 ;R9中,R8值不变STMDB R1!, R3-R6,R11
24、,R12STMFD R13!,R0,R4-R7,LR;寄存器进栈LDMFD R13!,R0,R4-R7,PC;寄存器出栈,从子程序 返回错例STMIA R5!,R5,R4,R9;R5存储的值不可预知LDMDA R2 , ;列表中至少要有1个寄存器 3.2 ARM指令系统指令系统助记符说明操作条件码位置SWP Rd,Rm,Rn 寄存器和存储器字字数据交换RdRn, RnRm (RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存储器字节字节数据交换RdRn, RnRm (RnRd或Rm)SWPcondBARM存储器访问指令寄存器和存储器交换指令 SWP指令用于将将一一个个内内存存
25、单单元元( (该该单单元元地地址址放放在在寄寄存存器器RnRn中中) )的的内内容容读读取取到到一一个个寄寄存存器器RdRd中中,同同时时将将另另一一个个寄寄存存器器RmRm的的内内容容写写入入到到该该内内存存单单元元中中。使用SWP可实现信号量操作。 指令格式如下:SWPcondB Rd,Rm,Rn 其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rn相同,则为寄存器与存储器内容进行交换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。 3.2 ARM指令系统指令系统ARM存储器访问指令寄存器和存储器交换指令SWP和SWPB寄存器和存储器交换指令编码指令执行的条件码B用于区别无符号字节(B为1)或字(B为0)Rm源寄存器Rd目标寄存器Rn为基址寄存器SWP指令应用示例:SWPR1,R1,R0;将R1的内容与R0指向的存储单元的内容进行交换 SWPBR1,R2,R0;将R0指向的存储单元内的容读取一字节数据到R1中;(高24位清零),并将R2的内容写入到该内存单元中;(最低字节有效) 总 结嵌入式嵌入式ARM指令系统指令系统 了解了解ARMARM指令系统的特点指令系统的特点掌握掌握ARMARM指令的寻址方式指令的寻址方式 掌握掌握ARMARM各类指令的使用各类指令的使用