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指向的地址是从高到低的。堆栈是先进后出的,进栈顺序决定了出栈顺序!

  • 相关阅读:
    POJ 2244 Eeny Meeny Moo (约瑟夫环问题)
    PHP中JavaScript使用的一个问题
    PHP和JavaScript跨域调用
    ExtJS中tree结合PHP的简单示例
    ExtJS中的Grid分页
    PHP、Smarty与jQuery Ajax 分页插件jquery.pager.js的使用
    jQuery版本不同及多次引用问题
    强大的Ext JS
    关于PHP中查询返回结果集和对象问题
    PHP中PDO方法fetch参数问题
  • 原文地址:https://www.cnblogs.com/getyoulove/p/3674168.html
Copyright © 2011-2022 走看看