1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令
1,寄存器寻址
MOV R1, R2 //将寄存器R2的值传给寄存器R1
2,立即寻址
MOV R0, #0XFF00 //数据包含在指令中
3,寄存器偏移寻址
MOV R0, R2, LSL #3 //R2的值左移3位,结果放入 R0中 即 R0 = R2 * 8
LSL逻辑左移、 LSR逻辑右移、 ASL算术左移、 ASR算术右移、 ROR循环右移、RRX带扩展的循环右移
4,寄存器间接寻址
LDR R1, [R2] //将R2中的数值作为地址,取出此地址的数据保存在R1中
SWP R1,R1,[R2] //将R2中的数值作为地址
5,基址寻址 将基址寄存器的内容与指令中给出的偏移量相加,形成有效地址
LDR R2,[R3, #0x0F] //将R3中数值加0x0F作为地址,取出数据保存在R2中
LDR R0, [R1], #-4 //将R1地址单元内容存入R0中,且R1= R1 - 4
STR R1, [R0, #-2] //将R0中数值减2作为地址,
6,多寄存器寻址
LDMIA R1!, {R2-R7, R12} //将R1单元的数据读出到R2-R7,R12中,R1自动加1
STMIA R0!,{R3-R6,R10} //将R3-R6中德数据保存到R0指向的地址,R0自动加1
7,堆栈寻址
满递增 LDMFA STMFA
满递减 LDMFD STMFD
空递增 LDMEA STMEA
空递减 LDMED STMED
8,块拷贝寻址 多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置
STMIA R0!,{R1-R7}
STMIB R0!, {R1-R7}
STMDA
STMDB
9,相对寻址
由程序计数器PC提供基准地址,指令中地址码字段作为偏移量,两者相加都得到的地址即为操作数的有效地址
带S的会影响CPSR寄存器,标志位
R15 为程序计数器PC。
2)ARM存储器访问指令
ARM处理器是加载/存储体系结构的典型RISC处理器,对存储器的访问只能使用加载和存储指令实现。LDR/STR
批量加载和存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高了效率。SWP指令是一条寄存器和存储器
内容交换的指令,可用于信号量操作等。ARM处理器是冯诺依曼存储结构,程序空间、RAM空间及IO映射空间统一编址,
除对RAM操作外,对外围IO、程序数据的访问均要通过加载/存储指令进行。
||LDR/STR T为可选后缀,有T表示处理器在特权模式下,使用后缀!表示结果回写。S表示带符号扩展。
B后缀表一个字节, H表示半字(2字节),
||程序相对偏移 LDR Rd, label; //label为程序标号,必须是当前指令的+-4KB范围内
1,LDM 和 STM 可以实现一组寄存器和一块连续的内存单元之间传输数据。主要用于现场保护、数据复制、参数传递等。
IA 传送后地址加4 DA 传送后地址减4
IB 传送前地址加4 DB 传送前地址减4
STMFD R0!,{R0-R7,LR} //现场保存 将R0-R7,LR入栈
LDMFD R1!,{R0-R7,PC} //恢复现场 异常处理返回
2,SWP
寄存器和存储器交换指令,用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另
一个寄存器Rm的内容写入到该内存单元中。
SWP R1, R2, [R0] //将R0指向存储单元内容读取一字节到R1中(高24位清零),并将R2内容写入该内存单元
3)ARM跳转指令
B label 跳转指令 Pc<-label 限制在当前指令的+-32KB的范围内
BL label 带链接的跳转指令 LR<- PC-4, PC<- label 用于子程序调用
BX Rm 带状态切换的跳转指令 PC<- label切换状态
4)ARM协处理器指令
1,CDP 通知ARM协处理器执行特定的操作
2,LDC 从某一连续的内存单元将数据读取到协处理器的寄存器中
LDC p5, c2, [R2, #4] //读取R2+4指向内存单元的数据传送到协处理器p5的c2寄存器中
3,STC 将协处理器的寄存器数据写入到某一连续的内存单元中
4,MCR 将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。
5,MRC 将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。
5)ARM杂项指令
SWI immediately——24 软中断指令 处理器进入管理模式
MRS Rd, psr 读状态寄存器指令
MSR psr_fields, Rd/#immed_8r 写状态寄存器指令
6)ARM伪指令
ADR伪指令 小范围的地址读取伪指令,用于将PC相对偏移的地址值读取到寄存器中。
ADRL伪指令 中等范围的地址读取伪指令,用于将PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。
LDR伪指令 大范围的地址读取伪指令,用于加载32位的立即数或一个地址到指定寄存器中。
NOP伪指令 空操作伪指令
ARM汇编程序由机器指令, 伪指令和宏指令组成,伪指令不像机器指令那样在处理器运行期间由机器执行,而是由汇编程序
对源程序处理。
1)符号定义伪指令
GBLA全局的算术变量初始化为0 LCLA 局部的 SETA 赋值
GBLL全局的逻辑变量初始化为false LCLL 局部的 SETL 赋值
GBLS全局的字符串变量初始化空 LCLS 局部的 SETS 赋值
ARM处理器共有
37个寄存器。其中包括:
**
个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。
ARM处理器共有7种不同的处理器模式,每一种模式中都有一组相应的寄存器组。在任何时刻,可见的寄存器包括15个通用寄存器
(R0-R14),一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式公用一个物理寄存器,有一些寄存
器各模式拥有自己独立的物理寄存器。
****************************************************
通用寄存器 ARM
通用寄存器分为以下三类:备份寄存器、未备份寄存器、程序计数器PC
备份寄存器
对于R8-R12备份寄存器来说,每个寄存器对应两个不同的物理寄存器。系统为将备份寄存器用于任何的非凡用途,但是
当中断处理非常简单,仅仅使用R8-R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中
断处理非常迅速。 ARM
对于R13,R14备份寄存器来说,每个寄存器对应六个不同的物理寄存器,其中的一个是系统模式和用户模式共用的;另外
的五个对应于其他的五种处理器模式。采用下面的记号来区分各个物理寄存器:
R13_<MODE> 字串5
其中MODE可以是下面几种模式之一:usr,svc,abt,und,irq,fiq
字串5
未备份寄存器
未备份寄存器包括R0-R7。对于每一个未备份寄存器来说,所有处理器模式下都是使用同一个物理寄存器。未备份寄存器
没有被系统用于非凡的用途,任何可采用通用寄存器的场合都可以使用未备份寄存器。
程序计数器PC
可以作为一般的通用寄存器使用,但有一些指令在使用R15时有一些限制。由于ARM采用了流水线处理器机制,当正确读取
了PC的值时,该值为当前指令地址值加上8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。
由于ARM指令是字对齐的,PC值的第0位和第一位总为0。
需要注意的是,当使用str/stm保存R15时,保存的可能是当前指令地址值加8个字节,也可能保存的是当前指令地址值加12
个字节。到底哪种方式取决于芯片的具体设计。对于用户来说,尽量避免使用STR/STM指令来保存R15的值。
当成功的向R15写入一个数值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的值应满足bits[1:0]为0b00
,具体要求arm个版本有所不同:
**对于arm3以及更低的版本,写入R15的地址值bits[1:0]被忽略,即写入r15的地址值将与0xFFFF FFFC做与操作。
**对于ARM4以及更高的版本,程序必须保证写入R15的地址值bits[1:0]为0b00,否则将产生不可预知的后果。
对于Thumb指令集来说,指令是班子对齐的,处理器将忽略bit[0]。
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- 常用ARM指令
常用ARM指令1:数据处理指令 mov mvn MOV(MOVE)指令可完成从另一个寄存器.被移位的寄存器或将一个立即数加载到目的寄存器 MOV R0,R1;R1的值传到R0 MOV R3,#3 ...
- vue 通过自定义指令实现 置顶操作;
项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令 ...
- ARM指令教程
ARM指令教程 ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...
- ARM指令学习,王明学learn
ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令 2.— MVN 数据取反传送指令 3.— CMP 比较指令 4.— CMN 反值比较指令 5.— TST 位测试 ...
- 头文件定义和ARM指令
2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的 ...
- arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- 单片机、CPU、指令集和操作系统的关系
郑重声明:转载自http://blog.csdn.net/zhongjin616/article/details/18765301 1> 首先讨论各种单片机与操作系统的关系 说到单片机,大家第一 ...
随机推荐
- Http 辅助类
using System; using System.Drawing; using System.IO; using System.Net; using System.Net.Cache; using ...
- 你真的了解 console 吗
对于前端开发者来说,在开发过程中需要监控某些表达式或变量的值的时候,用 debugger 会显得过于笨重,取而代之则是会将值输出到控制台上方便调试.最常用的语句就是console.log(expres ...
- JS类百度的动态提示框思路及完成
参考的代码来自这里: http://www.jb51.net/article/28075.htm 不过说实话,这个网站太烂了,不适合看代码,另外写代码的人是个大牛,但是却没有模块化思想,所以朕不高兴直 ...
- mongodb的地理空间索引如何在solr中体现
"$near"是唯一一个会对查询结果进行自动排序的地理空间操作符 "$near"的返回结果是按照距离由近及远排序的.其他排序条件不会生效. 这种按照地理位置远近 ...
- nexus 的使用及maven的配置
一.nexus的安装 1.下载nexus(点解这里) 2.下载后解压文件,将解压后的nexus文件放在你自己想要的地方 3.配置环境变量(和配置java的环境变量一样) 4.安装和启动nexus 由于 ...
- Hbase常用操作
下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' ...
- IO流(File类
File类 三个构造方法 File(String filename)//模式和应用程序一个目录下 File(String directoryPath,String filename)//文件的绝对路径 ...
- ASP.net 中关于Session的存储信息及其它方式存储信息的讨论与总结
通过学习和实践笔者总结一下Session 的存储方式.虽然里面的理论众所周知,但是我还是想记录并整理一下.作为备忘录吧.除了ASP.net通过Web.config配置的方式,还有通过其它方式来存储的方 ...
- webservice: Could not initialize Service NoSuchMethodException getPortClassMap()
今天用apache-cxf-3.1.1的wsdl2java生成webservice文件,调用的时候出了问题 报错:Could not initialize Service NoSuchMethodEx ...
- Centos下删除文件名乱码文件
centos下通过rm命令来删除文件,但是如果要删除文件名乱码的文件,就不能直接使用rm命令了,因为压根就无法输出文件名来.不过借助find命令可以实现对其删除.在linux下对于每个文件都一个对应的 ...