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> 首先讨论各种单片机与操作系统的关系 说到单片机,大家第一 ...
随机推荐
- Ajax跨域请求中的Cookie问题(默认不带cookie等凭证)
1.原生Ajax请求方式,设置跨域请求附带详细参数 var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xx ...
- 《CSS网站布局实录》学习笔记(五)
第五章 CSS内容排版 5.1 文字排版 5.1.1 通栏排版 进行网页通栏排版时,只要直接将段落文字放置于p或者其他对象中,再对段落文字应用间距.行距.字号等样式控制,便形成了排版雏形. 5.1.2 ...
- 重置MySQL的root用户密码(Window)
1.首先要停止Mysql服务.打开CMD,键入命令 net stop mysql 默认的mysql服务名就是mysql,如果你修改过服务名,请自行对照修改命令. 2.在CMD中进入mysql的bin目 ...
- Sql 日期时间 转换
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- JavaScript forEach方法
最近看了一些html5和js方面的书,受益匪浅,因为看的东西比较多,却都没有怎么静心来做整理,慢慢来吧,可能最近自己有点儿小紧张.今天跟大家分享下JavaScript的forEach方法(其实是从&l ...
- 自定义ORM框架(转转)
ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...
- Mysql主从复制的配置(双机互为主从)
目的: 让两台mysql服务器可以互为主从提供同步服务. 优点: 1. mysql的主从复制的主要优点是同步"备份", 在从机上的数据库就相当于一个(基本实时)备份库. 2. 在主 ...
- PHPCMS V9二次开发便捷自定义后台入口文件夹
phpcms v9二次开发便捷自定义后台入口文件夹 最新发布的phpcms v9由于采用了mvc的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文 ...
- asp.net 防止页面刷新或后退引起重复提交
项目中经常遇到刷新后重复的向数据库增加一条相同的记录,造成数据重复,如何规避这些问题呢?下面我们就一起讨论一下在asp.net怎样防止页面刷新或后退引起重复提交数据的问题: 其实asp.net防止刷 ...
- centos 下mysql操作
MySQL名字的来历MySQL是一个小型关系型数据库管理系统,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度 快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为 ...