我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民。我想有一次远行,于细碎流淌的时光与路途之中,观察所有遥不可及的生存方式,以及其中的人们。我发现我爱上了北方,中国的北方。满含苍凉的气息:那些皲裂而贫瘠的黄土地,干涸焦灼似静脉一般延伸的河床,那些皮肤黑皱似柏树老皮的农民...人与大地皆有着原始而朴素的容颜,映照着平凡的历史。—— 七堇年

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287

ARM 汇编代码中几乎处处都在使用寄存器,寄存器是处理器特有的用来暂存指令、数据和地址的高速存储单元。比如,高级语言中的变量,到了汇编中,其值可能就保存在某个寄存器中。

上述代码中的 R0、R2、SP 都是 ARM 寄存器。

ARM 处理器共有 31 个通用寄存器和 6 个状态寄存器。不过,在某一处理器模式下都是使用其中的一部分,包括 15 个通用寄存器(R0 ~ R14),一个或两个状态寄存器(CPSR/SPSR)和程序计数器(PC/R15)。

R0 ~ R14 又可分为两类,即:不分组寄存器(R0 ~ R7)和分组寄存器(R8 ~ R14)。所谓不分组,即该寄存器在各处理器模式下共用同一物理寄存器;所谓分组,即该寄存器在不同的处理器模式下,对应着不同的物理寄存器。

这其中分组寄存器(R8 ~ R14)又可分为两类:(1)R8 ~ R12 有 2 组物理寄存器:1 组用于 FIQ 模式,另 1 组用于除 FIQ 以外的所有模式。(2)R13 ~ R14 有 6 组物理寄存器,1 组用于用户模式和系统模式,另 5 组分别用于 5 种异常模式。

另外,R13 通常用作堆栈指针,称为 SP;R14 用作链接寄存器,称为 LR。CPSR 是当前程序状态寄存器,SPSR 是程序状态保存寄存器。当出现异常时,SPSR 用于保存 CPSR 的状态。

最后,ARM 处理器采用 3 级流水线机制来加快指令处理速度。所以,PC 总是指向当前指令的下 2 条指令的地址,即当前指令地址值加上 8 个字节。

ARM 处理器支持 7 种运行模式:

  • 用户模式 (usr)
  • 快速中断模式 (fiq)
  • 外部中断模式 (irq)
  • 管理模式 (svc)
  • 数据访问终止模式 (abt)
  • 系统模式 (sys)
  • 未定义指令中止模式 (und)

除用户模式外,其他模式均为“特权”模式,处理器可以访问受保护的系统资源,而 ARM 程序逆向分析通常只涉及用户模式。在用户模式下,处理器可以访问 R0 ~ R14、PC (R15)、CPSR,没有 SPSR。

ARM 处理器有两种工作状态:(1)ARM 状态:执行 32 位对齐的 ARM 指令;(2)Thumb 状态:执行 16 位对其的 Thumb 指令。

两种状态下的寄存器命名有部分差异,下面只列出不同的部分:

  • Thumb 状态下的 FP 对应 ARM 状态下的 R11
  • Thumb 状态下的 IP 对应 ARM 状态下的 R12
  • Thumb 状态下的 SP 对应 ARM 状态下的 R13
  • Thumb 状态下的 LR 对应 ARM 状态下的 R14
  • Thumb 状态下的 PC 对应 ARM 状态下的 R15

Android 平台的 ARM 汇编为 GNU ARM 汇编,使用 GAS (GNU Assembler,GNU 汇编器)。

学习资料:【Android 软件安全与逆向分析】

入门 ARM 汇编(一)—— 知识铺垫的更多相关文章

  1. 入门 ARM 汇编(二)—— 寻址方式

    忧愁他整天拉着我的心,像一个琴师操练他的琴:悲哀像是海礁间的飞涛:看他那汹涌,听他那呼号!—— 徐志摩·四行诗一首 ilocker:关注 Android 安全(新手) QQ: 2597294287 立 ...

  2. GNU ARM汇编快速入门

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

  3. x64 番外篇——知识铺垫

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  4. ARM汇编程序基本知识

    ARM汇编程序基本知识 1.汇编程序的基本组成 ARM汇编语言程序中,程序是以程序段为单位组织代码的.段是相对独立的指令或者代码序列,拥有特定的名称.段的种类有代码段.数据段和通用段,代 码段的内容为 ...

  5. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  6. GNU ARM 汇编指令

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

  7. arm汇编笔记

    ARM汇编(非虫笔记) 1.ARM汇编的目的: 分析elf文件的需要. 2.原生程序生成过程. (1)预处理,编译器处理c代码中的预处理指令. gcc -E hello.c -o hello.i (2 ...

  8. GNU ARM 汇编基础

    ARM GNU汇编基础 0 前言 全文补充提醒: 笔者在阅读ARM官方文档及查阅实际的u-boot源码中的汇编代码后,发现了一些不同于ARM官方文档中的汇编语法,查阅相关资料后,才发现主要由于汇编器的 ...

  9. 嵌入式ARM汇编详解

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

随机推荐

  1. c++转C#

    //c++:HANDLE(void   *)          ----    c#:System.IntPtr        //c++:Byte(unsigned   char)     ---- ...

  2. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  3. 【C#进阶系列】10 属性

    属性分为无参属性和有参属性(即索引器). 属性相对于字段的优点不仅仅是为了封装,还可以在读写的时候做一些额外操作,缓存某些值或者推迟创建一些内部对象,也适用于以线程安全的方式访问字段. 话说最基本的属 ...

  4. kFreeBsd 国内开源镜像站汇总

    从http://bbs.chinaunix.net/archiver/tid-3756178.html这里抽取了debian源中支撑kfreebsd架构的源. 中科大: http://debian.u ...

  5. 浏览器-Tomcat服务器-请求与响应

    浏览器访问服务器,本质就是请求资源. 比如请求静态资源:index.html,我们在浏览器地址栏输入:www.a.com/index.html,浏览器为了支持HTTP协议,发送的数据必须符合HTTP协 ...

  6. [js开源组件开发]图片放大镜

    图片放大镜 一般情况下,手机由于屏幕太小,会有图片上看不清的问题,所以我就做了一个放大镜的js效果,支持pc和移动端.它的原理是利用的backgroundsize来实现的,所以你的浏览器首先要支持这个 ...

  7. JS数组的forEach方法(兼容所有浏览器)

    //->自己在内置类的原型上扩展一个myForEach来处理forEach不兼容的问题//callBack:回调函数,遍历数组中的一项,就要执行一次callBack//context:改变cal ...

  8. ASP.NET MVC中将数据从Controller传递到视图

    ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...

  9. 安卓开发_浅谈Android动画(二)

    在学习了四个基本动画之后,现在要学习一些更有用的效果 先给出所有的动画xml <?xml version="1.0" encoding="utf-8"?& ...

  10. mybatis实战教程(mybatis in action),mybatis入门到精通(转)

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...