zoukankan      html  css  js  c++  java
  • 批量Load/Store指令的寻址方式

    批量Load/Store指令用于实现在一组寄存器和一块连续的内存单元之间传输数据。也称为多寄存器寻址方式,即一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令最多完成传送16个通用寄存器的值,其语法格式为:

    LDM|STM{<Cond>} <addressing_mode> <Rn>{!},<registers>{^}

     其中<addressing_mode> 可以有四种寻址方式:

    1.IA(Increment After,事后递增方式)

    2.IB(Increment Before,事先递增方式)

    3.DA(Decrement After,事后递减方式)

    4.DB(Decrement Before,事先递减方式)

    在STM、LDM指令中,寄存器列表与内存单元的对应关系:编号低的寄存器对应于内存中低地址单元;编号高的寄存器对应于内存中高地址单元。

    在ARM中常用的数据进栈与出栈方式分别为STMFDLDMFD

    STMFD——ST表示Store;M表示Multiple;F表示Full;D表示Descend。

    LDMFD——LD表示Load;M表示Multiple;F表示Full;D表示Descend。

    指令STMFD和LDMFD的地址计算方法:

    STMFD指令的寻址方式为事前递减方式(DB)(由于在FD增长方式下SP指针指向满栈顶,需要先求址再入栈)

    假设当前SP指向的地址为adress;

    STMFD SP! {R0-R7,LR} ;adress-4<——[LR];adress-4*2<——[R7];...........;adress-4*9<——[R0].

    {!}表示将数据全部压入堆栈中时,SP指向最后的地址。

    STMFD SP! {LR,R7,R6,R5,R4,R3,R2,R1,R0} 与STMFD SP! {R0-R7,LR} 的执行结果是一样的,满足寄存器列表与内存单元的对应关系。

    LDMFD指令的寻址方式为事后递增方式(IA)(由于在FD增长方式下SP指针指向满栈顶,先出栈,SP指针再指向新的栈顶)

    假设当前SP指向的地址为adress;

    LDMFD SP! {R0-R7,LR} ;R0<——[adress];R1<——[adress+4];...........,LR<——[adress+4*9].

    {!}表示将数据全部出栈时,SP指向最后的地址。

    LDMFD SP! {LR,R7,R6,R5,R4,R3,R2,R1,R0} 与LDMFD SP! {R0-R7,LR} 的执行结果是一样的,满足寄存器列表与内存单元的对应关系。

    在此,应该注意的是数据出栈时,LDMFD中的FD只是说明为堆栈的生成方向,其与之前的STMFD相对应,并不是指SP指向的地址是从高到低的。堆栈是先进后出的,进栈顺序决定了出栈顺序!

  • 相关阅读:
    那么 Appium 到底是怎么工作的呢?
    最小的 Velocity 教程
    CentOS 7 使用经验(更新中)
    [TL-WR841N V5~V9] 如何当作无线交换机使用?
    VS2012打包部署Winform程序
    ASP.NET 应用程序生命周期概述[转自MSDN]
    (翻译)从底层了解ASP.NET体系结构 [转]
    .NET在IE9中页面间URL传递中文变成乱码的解决办法
    终于把你必须知道的.NET看完了
    装箱与拆箱的操作与内存管理
  • 原文地址:https://www.cnblogs.com/getyoulove/p/3674168.html
Copyright © 2011-2022 走看看