忧愁他整天拉着我的心,像一个琴师操练他的琴;悲哀像是海礁间的飞涛:看他那汹涌,听他那呼号!—— 徐志摩·四行诗一首

ilocker:关注 Android 安全(新手) QQ: 2597294287

立即数寻址

源操作数为立即数,多用于给寄存器赋初值。

指令执行后,R1 寄存器的值就是 2。

立即数也可为:十六进制,# 后跟 0x;八进制,# 后跟 0;二进制,# 后跟 0b。

立即数有合法性限制,具体可 google 相关资料。

寄存器寻址

操作数的值在寄存器中。

指令执行后,R0 = R5。

速度仅次于立即数寻址。

寄存器移位寻址

类似于寄存器寻址,只是在操作前先对源寄存器操作数进行移位操作。

  • LSL:逻辑左移,低位补 0
  • LSR:逻辑右移,高位补 0
  • ASR:算术右移,移位过程中保持符号位不变(如果源操作数为正数,高位补 0,否则补 1)
  • ROR:循环右移,移出的低位填入空出的高位
  • RRX:带扩展的循环右移,高位用进位标志位 C 填充(标志位 C 在 CPSR 中)

指令执行后,R1 = R8 * 8。

.W 表示生成 32 位指令。

寄存器间接寻址

由寄存器值指出操作数在内存中的地址。

将 R4 寄存器值作为地址,取出此地址中的值赋给 R6。

基址寻址

与寄存器间接寻址有些类似,多用于查表、数组访问等操作。

将 R6 寄存器值加 1 作为地址,取出此地址中的值赋给 R0。

LDR 后面加 B,表示是从内存加载字节数据到寄存器。

多寄存器寻址

LDM 是数据加载指令,后缀 IA 表示每执行完一次加载操作后 R6 寄存器的值自增 1 个字。

指令执行后,R0 = [R6],R1 = [R6 + #4],R2 = [R6 + #8],R3 = [R6 + #12]。

ARM 指令集中,一个“字”表示一个 32 位的数值。

多寄存器寻址的一条指令最多可以完成 16 个通用寄存器值的传送。

R6 后面的叹号,表示指令执行后,更新基址寄存器 R6 的值。否则,指令执行后 R6 的值是不变的。

堆栈寻址

LDM 和 STM 作为指令前缀,表示多寄存器寻址。

FA、EA、FD、ED 作为指令后缀(指明堆栈生长方向和堆栈指针指向位置等,后面会继续学习)。

将数据出栈,保存到 R0、LR,多用于恢复子程序现场。

块拷贝寻址

LDM 和 STM 作为指令前缀,表示多寄存器寻址。

IA、DA、IB、DB 作为指令后缀(指明基址寄存器的递增或递减方式,后面会继续学习)。

示例同“多寄存器寻址”。

相对寻址

将程序计数器 PC 的当前值作为基地址,加上偏移量后得到操作数的有效地址。

这里的 BL 采用的就是相对寻址,标号 __libc_format_log 就是偏移量。

学习资料: 《Android 软件安全与逆向分析》

入门 ARM 汇编(二)—— 寻址方式的更多相关文章

  1. 入门 ARM 汇编(一)—— 知识铺垫

    我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民.我想有一次远行,于细碎流淌的时光与路途之中,观察所有 ...

  2. GNU ARM汇编快速入门

    以前用ARM的IDE工具,使用的是ARM标准的汇编语言.现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处.其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看 ...

  3. 经常使用ARM汇编指令

    一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...

  4. ARM汇编指令集_学习笔记(1)

    一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...

  5. GNU ARM 汇编指令

    第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...

  6. ARM汇编1

    一. 指令和伪指令 1.1. 指令 a. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行. 1.2. 伪指令 b. (汇编)伪指令本质上不是指令(只是 ...

  7. 嵌入式ARM汇编详解

    文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...

  8. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  9. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

随机推荐

  1. 【背景建模】PbModel

    PbModel是基于概率模型的背景差分算法,其基本思想是像素点会因光照变化.运动物体经过产生多种颜色值,但是一段时间内,像素点处于静止状态的时间会比处于运动状态的时间长.因而一段时间内,像素点某个颜色 ...

  2. java内存模型-总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照 ...

  3. JavaScript解析URL参数

    创建一个Js类: var Request = { QueryString: function (item) { var svalue = location.search.match(new RegEx ...

  4. Jquery中的日历插件

    这个插件很简单:只需要在HTML代码中引入插件如下,CLASS名和click事件函数固定! <!doctype html> <html lang="en"> ...

  5. 【追寻javascript高手之路02】变量、作用域知多少?

    前言 本来想把这个与上篇博客写到一起的,但是考虑到是两个知识点还是分开算了,于是我们继续今天的学习吧. 基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引 ...

  6. 强大的<canvas>

    <canvas> 个人认为<canvas>是h5最重量级的新标签了,现在各种h5小游戏都是基于<canvas>的,它为游戏提供了一个功能强大的画布,可在画布上绘制丰 ...

  7. 如何在SharePoint2010中创建自定义电子邮件警报处理程序

    字段,如项目名称字段中,将被截断到的电子邮件通知中的 70 个字符.要解决 70 个字符的限制,请使用"更多信息"一节中的介绍的方法. 要嵌入电子邮件通知中的其他内容. 您想要更改 ...

  8. CSS 选择器 关系

    常见的基于关系的选择器 选择器        选择的元素 A E    元素A的任一后代元素E (后代节点指A的子节点,子节点的子节点,以此类推) A > E   元素A的任一子元素E(也就是直 ...

  9. Eclipse CDT Linux下内存分析 实战历险

    C++产品开发,上线集成时,都需要内存泄露.覆盖率等检测,这些在Windows下都有很好的工具,如 Visual Studio: 这个内置了很多的工具 Devpartner: VC6时BoundChe ...

  10. Android jni开发中的常见错误

    错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用Syst ...