• ARM的9种寻址方式


    立即寻址

    操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示。

    例:

    MOV   R0,#0xFF00   ;0xFF00 ->  R0

    SUBS   R0,R0,#1     ;R0 – 1 ->  R0

    寄存器寻址

    操作数的值在寄存器中,指令执行时直接取出寄存器值操作。

    例:

    MOV  R1,R2      ;R2 -> R1

    SUB  R0,R1,R2    ;R1 - R2  ->  R0

     寄存器偏移寻址

    当第二操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。

    例:

    MOV  R0,R2,LSL #3     ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8

    ANDS  R1,R1,R2,LSL #3  ;R2 的值左移 3 位,然后和 R1 相与操作,结果放入 R1

     

    可采用的移位操作:

    LSL:逻辑左移(Logical Shift Left),低端空出位补 0

    LSR:逻辑右移(Logical Shift Right),高端空出位补 0

    ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即源操作数为正数,则高端空出位补 0,否则补 1

    ROR:循环右移(Rotate Right),由低端移出位填入高端空出位

    RRX:带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移一位,高端空出位用原 C 标志值填充。

    寄存器间接寻址

    操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。

    例:

    LDR   R1,[R2]   ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中

    SWP  R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与 R1 中的值**

     基址寻址

    将基址寄存器的值与偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能寄存器访问等。 

    例:

    LDR    R2,[R3,#0x0F] ;将R3中的数值加 0x0F 作为地址,取此地址的值保存在 R2 中

    STR    R1,[R0,#-2] ;将R0中的数值减 2 作为地址,把 R1的值保存到此地址中

     多寄存器寻址

    一次传送多个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。多寄存器寻址时,寄存器子集按由小到大的顺序排列,连续的寄存器可用“-”连接,否则,用“,”分隔书写。

    例:

    LDMIA   R1!,{R2-R7,R12} ;将 R1的值读出到 R2-R7,R12,过程中R1 自动加 1

    STMIA   R0!,{R3-R6,R10};将 R3-R6,R10的值保存到 R0 指向的地址,过程中R0 自动加 1

     堆栈寻址

    堆栈寻址使用堆栈指针SP,即R13,指向堆栈的栈顶。堆栈可分为两种:

    向上生长:向高地址方向生长,称为递增堆栈,

    向下生长:向低地址方向生长,称为递减堆栈,

    堆栈指针指向最后压入的有效数据项,称为满堆栈,

    堆栈指针指向下一个要放入的空位置,称为空堆栈,这样就有 4 种类型的堆栈。

    A)满递增:堆栈地址向上增长,堆栈指针指向有效数据的最高地址。如 LDMFA,STMFA。

    B)空递增:堆栈地址向上增长,堆栈指针指向堆栈上的第一个空位置。如 LDMEA,STMEA 。

    C)满递减:堆栈地址向下增长,堆栈指针指向有效数据项的最低地址。如 LDMFD,STMFD。

    D)空递减:堆栈地址向下增长,堆栈指针指向堆栈下的第一个空位置。如 LDMED,STMED 。

    例:

    STMFD     SP!,{R1-R7,LR}  ; 将 R1~R7,LR 入栈。满递减堆栈。

    LDMFD     SP!,{R1-R7,LR}  ;数据出栈,放入 R1~R7,LR 寄存器。满递减堆栈。

     块拷贝寻址

    用于将一块数据从存储器的某一位置拷贝到另一位置。

    例:

    STMIA  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向上增长。

    STMIB  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向上增长。

    STMDA  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。

    STMDB  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向下增长。

     相对寻址

    相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址

    码字段作为偏移量,两者相加后得到有效地址。

    例:

    BL    ROUTE1    ;调用ROUTE1 子程序

    BEQ   LOOP      ;条件跳转到 LOOP 标号处

    LOOP  MOV R2,#2

    ROUTE1

  • 相关阅读:
    APP性能测试工具GT的使用总结:app内存测试
    app专项测试:app静态测试(耗时、流量、内存、图片大小)
    沟通的重要性
    [改善Java代码]推荐覆写toString方法
    [改善Java代码]使用package-info类为包服务
    [改善Java代码]不要主动进行垃圾回收
    [改善Java代码]推荐使用String直接量赋值
    [改善Java代码]在接口中不要存在实现代码
    [改善Java代码]不要随便设置随机种子
    [改善Java代码]优先使用整型池
  • 原文地址:https://www.cnblogs.com/icefree/p/8539112.html
Copyright © 2020-2023  润新知