zoukankan      html  css  js  c++  java
  • ARMv7 ldr/str指令详解

    因为ARM的算术运算不支持直接操作内存地址,所以要把内存里的数据先加载进寄存器。ldr指令就是干这事的,称为间接取址模式。

    一共有3*3九种模式,先是直接偏移,先偏移,后偏移三大类,指的是如何对源操作数操作,是直接使用,还是在加载前对源操作数操作(比如地址加个数值),还是在加载后对操作数操作

    每个大类里分三个小类,分别指源操作数是立即数,寄存器,还是标量寄存器(比如对寄存器里的数向左偏移两位,即乘4)

    汇编指令和对应的C代码如下

     1 Immediate offset:
     2 
     3   LDR    R0, [R1, #4]
     4   r0 = r1[1];
     5 
     6     Remember, again, the offset is in bytes, so #4 would point to the second word (long int) in our array, thus in C the array indice [1] would provide the correct data. 
     7 
     8 Register offset:
     9 
    10   LDR    R0, [R1, R2]
    11   r0 = r1[r2];
    12 
    13 Scaled register offset:
    14 
    15   LDR    R0, [R1, R2, LSL #4]
    16   r0 = r1[(r2 << 4)];
    17 
    18 Immediate pre-indexed:
    19 
    20   LDR    R0, [R1, #4]!
    21   r1 += 4; r0 = *r1;
    22 
    23 Register pre-indexed:
    24 
    25   LDR    R0, [R1, R2]!
    26   r1 += r2; r0 = *r1;
    27 
    28 Scaled register pre-indexed:
    29 
    30   LDR    R0, [R1, R2, LSL #2]!
    31   r1 += (r2 << #2); r0 = *r1;
    32 
    33 Immediate post-indexed:
    34 
    35   LDR    R0, [R1], #4
    36   r0 = *r1; r1 += 4;
    37 
    38 Register post-indexed:
    39 
    40   LDR    R0, [R1], R2
    41   r0 = *r1; r1 += r2;
    42 
    43 Scaled register post-indexed:
    44 
    45   LDR    R0, [R1, R2, LSL #2]!
    46   r0 = *r1; r1 += (r2 << #2);

    str指令是把寄存器里的数存到内存里,目标地址的计算方式与操作与ldr指令中源地址的计算方法与操作一样

    Immediate offset:
      LDR    R0, [R1, #4]  r0 = r1[1];
        Remember, again, the offset is in bytes, so #4 would point to the second word (long int) in our array, thus in C the array indice [1] would provide the correct data. 
    Register offset:
      LDR    R0, [R1, R2]  r0 = r1[r2];
    Scaled register offset:
      LDR    R0, [R1, R2, LSL #4]  r0 = r1[(r2 << 4)];
    Immediate pre-indexed:
      LDR    R0, [R1, #4]!  r1 += 4; r0 = *r1;
    Register pre-indexed:
      LDR    R0, [R1, R2]!  r1 += r2; r0 = *r1;
    Scaled register pre-indexed:
      LDR    R0, [R1, R2, LSL #2]!  r1 += (r2 << #2); r0 = *r1;
    Immediate post-indexed:
      LDR    R0, [R1], #4]  r0 = *r1; r1 += 4;
    Register post-indexed:
      LDR    R0, [R1], R2  r0 = *r1; r1 += r2;
    Scaled register post-indexed:
      LDR    R0, [R1, R2, LSL #2]!  r0 = *r1; r1 += (r2 << #2);

  • 相关阅读:
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    使用 @Log4j2 log.error() 打印异常日志
    获取min-max之间的随机数
    跨域问题(CORS / Access-Control-Allow-Origin)
    SnowFlakeId 分布式雪花id算法
    订单入库后异步推送
    查看git HEAD
    Java Http POST/GET 情求
  • 原文地址:https://www.cnblogs.com/cascle/p/5041052.html
Copyright © 2011-2022 走看看