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

时间: 2024-12-24 21:45:24

ARMv7 ldr/str指令详解的相关文章

[转]JVM指令详解(上)

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符                            说明 0x00         nop                                什么都不做 0x01        aconst_null                   将null推送至栈顶 二.const系列 该系列命令主要

ARM LDR伪指令用法详解

LDR伪指令 10.45 LDR pseudo-instruction   功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中. 注意:这里描述的是LDR伪指令,而不是LDR指令   语法:               LDR{cond}{.W} Rt, =expr LDR{cond}{.W} Rt, =label_expr *   cond是一个可选的条件码 *  .W是可选的指令宽度说明符 *   Rt是要加载的寄存器 *   expr是一个数字表达式 *   label_ex

迈向angularjs2系列(2):angular2组件和指令详解

<%= INIT %> 内容 一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> &l

Git大法好——2.Git本地操作指令详解

Git大法好--2.Git本地操作指令详解 引言 上节给大家讲解了有关于Git的一些概念,Git的引入,Git的四个组成部分,Git文件的状态,以及 Git的下载安装:前面也讲过Git和SVN有个明显的差别就是,Git可以不需要网络就可以进行版本 控制,这是因为Git中每个电脑都拥有一个本地的版本库,而远程的仓库仅仅是作为我们交换修改 的一个工具!即使失去这个工具,我们也可以干活,只是交换修改不方便罢了,假如是SVN,远程 服务器挂了-所以,我们使用Git的时候大部分时间都是在进行Git的一些本

tar 指令详解

tar 解压缩命令 tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的参数是根据需要在压缩或解压档案时可选的. -z:有gzip属性的 -j:有bz2属性的 -Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出 下面的参数-f是必须的 -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名. # ta

&lt;linux下sysctl指令详解&gt;

Sysctl指令是对系统核心参数的设置: 用法: -a 参数列出系统中所有核心设置 当然了这些核心的设置都是文件,存放于/proc/sys/net目录下. 举个有代表性的例子: net.ipv4.icmp_echo_ignore_all = 0      把所有的点改为 / 就可以了.   [[email protected] net]# net.ipv4.icmp_echo_ignore_all = 0 [[email protected] net]# cd ipv4/ [[email pro

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

16位汇编第五讲各种指令详解第一讲

汇编指令详解 8080指令详解 1.8086系统下,Inter指令系统共有117条指令(看似很多,分一下类) 1.数据传送类指令(专门传送数据的) 2.算术运算类指令(加减乘除的运算的) 3.位操作类指令(或  异货 与 -.) 4.串操作类指令 (内存拷贝,内存连续地址拷贝的操作) 5.控制转移类指令(跳转,比如C语言的Goto) 6.处理机控制类指令(计算机的待机 ,重启 等等,让CPU待机睡眠的指令) 学习指令的注意事项 1.指令的功能,也就是这个指令可以实现什么操作.通常的话,指令就是指

Linux指令详解useradd groupadd passwd chpasswd chage 密码修改

创建用户.设置密码.修改用户.删除用户: useradd testuser 创建用户testuser passwd testuser 给创建的用户testuser设置密码 说明:新创建的用户会在/home下创建一个用户目录testuser usermod --help 修改用户这个命令的相关参数 userdel testuser 删除用户testuser rm -rf testuser 删除用户testuser所在目录 上面的几个命令只有root账号才可以使用,如果你不知道自己的系统上面的命令在