• 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);

  • 相关阅读:
    openwrt解压zstd包时报错"openwrt/dl/zstd-1.4.5.tar.zst: Permission denied tar: This does not look like a tar archive tar: Exiting with failure status due to previous errors"如何处理?
    pip如何使用代理?
    Markdown: 对Typora的一些小调整
    ray
    关于nginx中proxy_set_header的设置
    解决 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    mysql 查询慢问题分析
    Elasticsearch导出数据存入本地文件
    mysql count 几种写法时间的比较
    python 线程池的实现
  • 原文地址:https://www.cnblogs.com/cascle/p/5041052.html
Copyright © 2020-2023  润新知