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 <源路径> .. ...
随机推荐
- L013-oldboy-mysql-dba-lesson13
L013-oldboy-mysql-dba-lesson13 02 18:00 来自为知笔记(Wiz)
- 使用WebJar管理css、JavaScript文件
Web前端使用了越来越多的JS或CSS,如jQuery, Backbone.js 和Bootstrap.一般情况下,我们是将这些Web资源拷贝到Java的目录下,通过手工进行管理,这种通方式容易导致文 ...
- 谷歌浏览器支持小于12px的字体
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- c++,C# 转换
//C++中的DLL函数原型为 //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsi ...
- undefined local variable or method ‘xxx’ for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xbc88d6c>错误解决方案
官方文档如下: https://github.com/rspec/rspec-rails/blob/master/Capybara.md Capybara 2.0 To use Capybara 2. ...
- wap网站获取访问者手机号PHP类文件
<?php /** * 类名: mobile * 描述: 手机信息类 * 其他: */ class mobile { /** * 函数名称: getPhoneNumber * 函数功能: 取手机 ...
- 如何实现phpcms v9_4X版本tag的伪静态?
这两个月来写的文章越来越少了,不是懒,因为太忙了--为客户赶做网站.因为客户指定要使用phpcms v9,还要求使用phpcms v9_42版本实现tag伪静态,在接手的时候phpcms v9_42是 ...
- 008.ComputeReplacement
Delphi function ComputeReplacement: UTF8String; 类型:function 可见性:public 所在单元:System.RegularExpression ...
- Demo学习: Dialogs Anonymous Callback
Dialogs\Dialogs Anonymous Callback 窗体回调函数使用. 1. 标准回调函数 ShowMessage(const Msg: string; CallBack: TUni ...
- 一个基于python的即时通信程序
5月17日更新: 广播信息.用户列表.信息确认列表以及通信信息,从原来的用字符串存储改为使用字典来存储,使代码更清晰,更容易扩展,具体更改的格式如下: 广播信息(上线): { 'status': 信息 ...