入门 ARM 汇编(二)—— 寻址方式
忧愁他整天拉着我的心,像一个琴师操练他的琴;悲哀像是海礁间的飞涛:看他那汹涌,听他那呼号!—— 徐志摩·四行诗一首
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 汇编(二)—— 寻址方式的更多相关文章
- 入门 ARM 汇编(一)—— 知识铺垫
我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民.我想有一次远行,于细碎流淌的时光与路途之中,观察所有 ...
- GNU ARM汇编快速入门
以前用ARM的IDE工具,使用的是ARM标准的汇编语言.现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处.其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- ARM汇编指令集_学习笔记(1)
一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...
- GNU ARM 汇编指令
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...
- ARM汇编1
一. 指令和伪指令 1.1. 指令 a. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行. 1.2. 伪指令 b. (汇编)伪指令本质上不是指令(只是 ...
- 嵌入式ARM汇编详解
文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- ARM汇编
ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...
随机推荐
- 【背景建模】PbModel
PbModel是基于概率模型的背景差分算法,其基本思想是像素点会因光照变化.运动物体经过产生多种颜色值,但是一段时间内,像素点处于静止状态的时间会比处于运动状态的时间长.因而一段时间内,像素点某个颜色 ...
- java内存模型-总结
处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照 ...
- JavaScript解析URL参数
创建一个Js类: var Request = { QueryString: function (item) { var svalue = location.search.match(new RegEx ...
- Jquery中的日历插件
这个插件很简单:只需要在HTML代码中引入插件如下,CLASS名和click事件函数固定! <!doctype html> <html lang="en"> ...
- 【追寻javascript高手之路02】变量、作用域知多少?
前言 本来想把这个与上篇博客写到一起的,但是考虑到是两个知识点还是分开算了,于是我们继续今天的学习吧. 基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引 ...
- 强大的<canvas>
<canvas> 个人认为<canvas>是h5最重量级的新标签了,现在各种h5小游戏都是基于<canvas>的,它为游戏提供了一个功能强大的画布,可在画布上绘制丰 ...
- 如何在SharePoint2010中创建自定义电子邮件警报处理程序
字段,如项目名称字段中,将被截断到的电子邮件通知中的 70 个字符.要解决 70 个字符的限制,请使用"更多信息"一节中的介绍的方法. 要嵌入电子邮件通知中的其他内容. 您想要更改 ...
- CSS 选择器 关系
常见的基于关系的选择器 选择器 选择的元素 A E 元素A的任一后代元素E (后代节点指A的子节点,子节点的子节点,以此类推) A > E 元素A的任一子元素E(也就是直 ...
- Eclipse CDT Linux下内存分析 实战历险
C++产品开发,上线集成时,都需要内存泄露.覆盖率等检测,这些在Windows下都有很好的工具,如 Visual Studio: 这个内置了很多的工具 Devpartner: VC6时BoundChe ...
- Android jni开发中的常见错误
错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用Syst ...