zoukankan      html  css  js  c++  java
  • ARM寻址

    ARM几种寻址方式

    立即数寻址

    寄存器寻址

    寄存器间接寻址

    基址寻址

    相对寻址

    堆栈寻址

    块拷贝寻址

     

     

    • 立即数寻址

    1 SUBS  R0,R0,#1   ;R0 =R0 -1 ,结果放入R0(第一个R0寄存器)
    2 
    3 MOV  R0,#0xFF    ;R0 立即数0xFF装入R0

        立即数寻址,把立即数直接编码到opcode(指令编码当中),在可能有

     

    • 寄存器寻址

    MOV    R1,R2        ;R2 = R1
    
    SUB    R0,R1,R2    ;R0 = R1 - R2

      

      操作的是寄存器中的数据,可能会用在一些变量之间的中间运算过程。

    • 寄存器间接寻址

    LDR    R0, [R1]        ;R0 <-- mem32[R1]
    
    STR    R0, [R1]        ;mem32[R1] <-- R0

      

      ARM的数据传送指令都是基于这种方式的,通过Load、Store 完成对(内存)数据的存取,全局变量的存取。

    • 基址寻址

    LDR    R2, [R3, #0x0C]        ;R2 <-- mem32[R3+0x0C]
    
    STR     R1, [R0,#-2]             ;R1 --> mem32[R0 - 2]
    
    LDR    R1, [R0, R3, LSL #1]  ;R1 <-- mem32[R0 + R3*2]
    
    ;前索引寻址----------------------------------------------------------------
    
    LDR    R0, [R1, #4]               ;R0 <-- mem32[R1+4]
    
    LDR    R0, [R1, #4]!              ;R0 <-- mem32[R1+4] ,R1 =R1 +4
                                                ; ! 表示在完成数据传送后将更新基址寄存器
    ;后索引寻址----------------------------------------------------------------
                                            
    LDR    R0, [R1], #4                ;R0 <-- [R1], R1 = R1+4            

      像对数组的寻址应该就是这种的了吧

    • 相对寻址

      

    BL    SUBR1            ;跳转到其他位置的时候使用
    ;--------------------------------------------------------
    
    BEQ    LOOP            ;跳转到标号也是这种方式

      

      这种寻址方式和x86里面的E8,E9是差不多的,使用的是偏移量作为跳转的位置。猜想是不是会对当前PC加上一个相对偏移然后跳转这种的。

    • 堆栈寻址

    STMFD   SP!,{R1-R7, LR}    ;寄存器R1到R7,LR都入栈
    
    LDMFD   SP!,{R1-R7,LR}     ;寄存器R1到R7,LR都出栈

     

     R13 即是SP指针

    • 堆栈寻址

    ; IA 存后加    IB 存前加    DA 存后减 DB 存前减
    
    STMIA    R9!, {R0, R1, R5}
    
    ;第一步 mem32[R9] <-- R0, R9 = R9 +4
    
    ;第一步 mem32[R9] <-- R0,  R9 = R9 +4
    
    ;第一步 mem32[R9] <-- R0,  R9 = R9 +4
  • 相关阅读:
    Redis 如何与数据库事务保持一致
    QQ、微信 唯一登陆设计
    Node.js Sequelize如何实现数据库的读写分离
    node.js web应用优化之读写分离
    在docker中使用mysql数据库,在局域网访问
    docker常用管理命令
    基于 Egg.js 框架的 Node.js 服务构建之用户管理设计
    使用mousedown、mousemove、mouseup实现拖拽效果
    VUE中事件修饰符:stop prevent self capture
    基于jsplumb插件制作可拖拽、保存流程图、重绘保存后的流程图总结
  • 原文地址:https://www.cnblogs.com/Lnju/p/4376349.html
Copyright © 2011-2022 走看看