ARMv7 ldr/str指令详解
因为ARM的算术运算不支持直接操作内存地址,所以要把内存里的数据先加载进寄存器。ldr指令就是干这事的,称为间接取址模式。
一共有3*3九种模式,先是直接偏移,先偏移,后偏移三大类,指的是如何对源操作数操作,是直接使用,还是在加载前对源操作数操作(比如地址加个数值),还是在加载后对操作数操作
每个大类里分三个小类,分别指源操作数是立即数,寄存器,还是标量寄存器(比如对寄存器里的数向左偏移两位,即乘4)
汇编指令和对应的C代码如下
Immediate offset: LDR R0, [R1, #]
r0 = r1[]; Remember, again, the offset is in bytes, so # would point to the second word (long int) in our array, thus in C the array indice [] would provide the correct data. Register offset: LDR R0, [R1, R2]
r0 = r1[r2]; Scaled register offset: LDR R0, [R1, R2, LSL #]
r0 = r1[(r2 << )]; Immediate pre-indexed: LDR R0, [R1, #]!
r1 += ; r0 = *r1; Register pre-indexed: LDR R0, [R1, R2]!
r1 += r2; r0 = *r1; Scaled register pre-indexed: LDR R0, [R1, R2, LSL #]!
r1 += (r2 << #); r0 = *r1; Immediate post-indexed: LDR R0, [R1], #
r0 = *r1; r1 += 4; Register post-indexed: LDR R0, [R1], R2
r0 = *r1; r1 += r2; Scaled register post-indexed: LDR R0, [R1, R2, LSL #]!
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);
ARMv7 ldr/str指令详解的更多相关文章
- [转]JVM指令详解(上)
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码 助记符 ...
- LDM与STM指令详解
title: LDM与STM指令详解 date: 2019/2/26 17:58:00 toc: true --- LDM与STM指令详解 指令形式如下,这里的存储方向是针对寄存器的 Load Mul ...
- C#中的预处理器指令详解
这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...
- rsync指令详解
rsync指令详解(更详细的看官方文档http://rsync.samba.org/ftp/rsync/rsync.html) [root@Centos epel]# rsync --help rsy ...
- #pragma 预处理指令详解
源地址:http://blog.csdn.net/jx_kingwei/article/details/367312 #pragma 预处理指令详解 在所有的预处理指令中, ...
- 迈向angularjs2系列(2):angular2指令详解
一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...
- C#中的预处理指令详解
这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregion ...
- pragma comment的使用 pragma预处理指令详解
pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一 ...
- Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY <源路径> .. ...
随机推荐
- c#winform,制作可编辑html编辑器
大神勿喷,新手记笔记 材料 网上下载kindeditor,动手在写个htmldome,图中的e.html.然后全部扔到了bin/debug下面,(x86是要扔到bin/x86/debug) 中间bod ...
- html 模板 swig 预编译插件 grunt-swig-precompile
GitHub grunt-swig-precompile NPM grunt-swig-precompile 在书写前端静态页面的时候,每个页面总在书写很多重复的标签. 为了提高效率,结合 swig. ...
- thinkphp 使用过程中遇到的一个小函数
1.实现导出Excel文件,并在导出的文件中显示图片 //导出 public function push(){ $goods_list=M('Dajia')->select(); $data = ...
- 用pycharm开发django项目示例
pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟环境 创建成功后,在pycharm显示的工程目录结构如下: 打开pycharm的Termina ...
- python3 pyqt5 和eric5配置教程
一.大纲内容: 1.预备PC环境: 2.预备安装程序: 2.1.下载Python3.2 2.2.下载PyQt4 2.3.下载Eric5 3.安装配置步骤: 3.1.安装Pyhon3.2 3.2.安装P ...
- C# 类中隐藏基类方法和Partial
今天对于.NET开发人员来说最开心的事情莫过于微软搞开源了,这觉得是给搞.NET开发的长脸.虽然我是一个初学者,这无疑给我极大的学习动力.Fighting!!! 当一个类从父类继承了一个成员时,也就继 ...
- MySQL 5.6.21 最新版的安装
上一篇 写了对于入门者来说困难的事情,博主最近装了mysql软件,下面来看看mysql的安装. 下载mysql软件安装程序,我的是在百度软件中心上下载的,选择百度是因为里面没有什么捆绑软件: 下载完了 ...
- 二十、mysql mysqldump备份工具
.备份所有数据库 mysqldump -uroot -p --all-database > c:\all.sql 备份所有数据库到c盘下的all,sql文件 .备份某个数据库 mysqldump ...
- Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式
如果您的 U 盘.移动硬盘既要用于 PC 又要用于苹果电脑,Mac OS X 系统的 HFS+ 和 Windows 的 NTFS 格式显然都不行……HFS+ 在 Windows 下不识别,NTFS 格 ...
- EXTJS 4.2 资料 控件之隐藏显示setVisible、只读setDisabled
隐藏: form_Step3_1_left.form.findField('CPTypeId').setVisible(false); 显示: form_Step3_1_left.form.findF ...