×

多寄存器Load/Store内存访问指令

消耗积分:1 | 格式:rar | 大小:0.6 MB | 2017-10-18

分享资料个

  5.4 多寄存器Load/Store内存访问指令
  多寄存器Load/Store内存访问指令也叫批量加载/存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。LDM用于加载多个寄存器,STM用于存储多个寄存器。多寄存器Load/Store内存访问指令允许一条指令传送16个寄存器的任何子集或所有寄存器。
  多寄存器Load/Store内存访问指令主要用于现场保护、数据复制和参数传递等。
  注意多寄存器Load/Store内存访问指令会增加中断延时,因为ARM通常不会打断正在执行的指令去响应中断,而必须等到指令执行完。也就是说,如果一个中断在多寄存器Load/Store内存访问指令执行期间产生,那么处理器在多寄存器Load/Store内存访问指令执行完后才对中断响应。
  表5.2总结了多寄存器Load/Store内存访问指令
  表5.2 多寄存器Load/Store内存访问指令
  指 令作 用操 作
  LDM装载多个寄存器{Rd}*N←mem32[start address+4*N]
  STM保存多个寄存器{Rd}*N→mem32[start address+4*N]
  5.4.1 多寄存器内存字数据传送指令
  1.LDM(1)指令
  (1)指令编码格式
  LDM(1)指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。
  当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。
  指令的编码格式如图5.15所示。
  多寄存器Load/Store内存访问指令
  图5.15 LDM(1)指令编码格式
  (2)指令的语法格式
  LDM{《cond》}《addressing_mode》 《Rn》{!}, 《registers》
  ① 《cond》
  为指令编码中的条件域。它指示LDM(1)指令在什么条件下执行。当《cond》忽略时,指令为无条件执行(cond=AL(Alway))。
  ② 《address_mode》
  指令的寻址方式。确定编码格式中的P、U和W位。
  ③ 《Rn》
  确定寻址模式所使用的基址寄存器。
  如果r15作为指令的基址寄存器,指令的执行结果不可预知。
  ④ !
  设置指令编码格式中的W位。它使指令执行后将操作数的内存地址写入基址寄存器《Rn》中;如果!被忽略,W位为0,指令执行完后,不修改基址寄存器的值。
  注意如果基址寄存器包含在指令列表中,当指令执行完后,基址寄存器的值是新加载进的特定内存地址的值。也就是说,即使指令没有出现在指令列表中,基址寄存器的值也可能被修改。
  ⑤ 《registers》
  被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在“{}”中。编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。
  注意无论寄存器在寄存器列表“{}”中如何排列,都将遵循上述规则。
  寄存器r0~r15分别对应于指令编码中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,则相应的位等于1,否则为0。
  (3)指令操作的伪代码
  指令操作伪代码如下面程序段所示。
  If ConditionPass{cond} then
  Address=start_address
  For i=0 to 14
  If register_list[i]==1 then
  Ri=Memory[address,4]
  Address=address+4
  If register_list[15]==1 then
  Value = Memory[address,4]
  If(architecture version 5 or above) then
  Pc= value AND 0xfffffffe
  T bit=value[0]
  Else
  Pc= value AND 0xfffffffc
  Address=address+4
  Assert end_address=address+4
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !