ARM指令解析
今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/wrjvszq/8324589大家先拿到这个文档,这个文档对arm指令的解析相当的全面,但是这里要注意的是文档是arm对标准的汇编写出的文档,但是我们要用的是gnu的汇编,这两个稍微有点区别,关于区别大家可以去看看这个博客http://www.cnblogs.com/hnrainll/archive/2011/05/17/2048315.html说完了这些,今天我的重点将会放在arm伪指令和arm协处理器访问指令进行解析。
l 伪指令
1、为什需要伪指令
要解决这个问题我们先要了解一下机器码,同样我们要用到在arm寄存器解析那一节用到的《ARM Architecture Reference Manual》这本资料在我们学习arm的过程中十分重要。说到机器码我们必须要看看arm的机器编码格式
28~31bits(cond):是条件码,就是表明这条语句里是否有大于、等于、非零等的条件判断,这4bits共有16种状态,分别为:
二进制码 |
指令符号 |
含义 |
二进制码 |
指令符号 |
含义 |
0000 |
EQ |
相等 |
0001 |
NE |
不等 |
0010 |
CS/HS |
进位/无符号数大于等于 |
0011 |
CC/LO |
清进位/无符号数小于 |
0100 |
MI |
减/负数 |
0101 |
PL |
加/正数或0 |
0110 |
VS |
溢出 |
0111 |
VC |
没溢出 |
1000 |
HI |
无符号数大于 |
1001 |
LS |
无符号数小于等于 |
1010 |
GE |
有符号数大于等于 |
1011 |
LT |
有符号数小于 |
1100 |
GT |
有符号数大于 |
1101 |
LE |
有符号数小于等于 |
1110 |
AL |
任何条件 |
1111 |
- |
未定义 |
25bit(I)是用来区别shifer_operand域是采用立即数寻址方式还是寄存器寻址方式,该bit为0表示寄存器寻址方式,为1表示立即数寻址方式。
21~24bits(opcode)是指令码,用来表明这条指令是什么指令。
12~15bits(Rd)是指令中的目的寄存器,存放寄存器的4bits编号
0~11bits(shifter_operand)指令的操作数。
我们可以看到指令的操作数最多只能为12位(其实中间还有4位用作别的用途,因此只有8位来表示立即数或者寄存器),难以解决多余8位的数,因此引入伪指令来解决。
2、伪指令解析:
伪指令主要在编译的时候起作用,它本身不产生机器码,而是在编译的时候起作用,告诉编译器如何编译,另一种作用就是转换为其他的实际的指令。
下面介绍几个常见的GNU风格的伪指令(一般会在前面加一个点’.’):
(1) global:把一个符号定义为全局的。
(2) data:用来定义数据段。
(3) ascii:字符串类型的数据。
(4) byte:字节型数据
(5) word:子数据
(6) equ:类似于C语言的宏定义
(7) align:控制对齐。加在需要被对齐(被调整)的标号(地址/指令)之前
l 协处理器指令
1. 什么是协处理器
用于执行特定的任务,减轻处理器核的负担。一共可以支持16个协处理器,cp15是最重要的一个协处理器。
2. CP15的作用
系统控制协处理器,提供了很多额外的寄存器,通过这些寄存器我们可以控制和配置cache,MMU,时钟系统等。访问他主要是访问他的寄存器,从而达到对系统的控制。
3. CP15的寄存器访问
1. mcr:从通用寄存器到协处理器的寄存器
2. mrc:从协处理器的寄存器到通用寄存器
这里只是说到他的简单用法,更多内容参考《ARM Architecture Reference Manual》(一定要多读英文文档)。
以上是自己的arm指令的简单理解,希望各位提出宝贵意见。
ARM指令解析的更多相关文章
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- ARM处理器解析
按图分析: ARM处理器有七种工作模式,为的是形成不同的使用级别,以防造成对系统的破坏.不同模式可以访问的寄存器不同,可以运行的指令不同. (1)user(10000):普通应用程序运行的模式(应用程 ...
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s ...
- ARM架构解析
ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...
- arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...
- arm寄存器解析
寒假闲来无事准备将自己的走过的arm之路总结一下,今天就先从arm的寄存器说起吧,欢迎各位拍砖. 要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式: Arm处理器有七种工作模式,为的是形成 ...
- ARM指令教程
ARM指令教程 ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...
- ARM指令分类及其寻址方式
ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...
- ARM指令
语法格式 <opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand> {}表示是可选的部分,<& ...
随机推荐
- poj 2069 Super Star —— 模拟退火
题目:http://poj.org/problem?id=2069 仍是随机地模拟退火,然而却WA了: 看看网上的题解,都是另一种做法——向距离最远的点靠近: 于是也改成那样,竟然真的A了...感觉这 ...
- MTK LCM帧率设置公式
clk=(width + W total porch)x(height + H total porch)x (6<18bit>或者x8<24bit>)x fps/ lane n ...
- Apple Tree
题意: 给一有根树,每个叶子上有一些苹果,现在要求你拿掉一些苹果,使得每一个点的 儿子的子树内的苹果数相同. 解法: 首先可以发现$cnt$个叶子节点之间的关系可以用$cnt-1$个独立方程表示出来. ...
- 【HBase】HBase笔记:HBase的Region机制
HBase 的机制里包含了许多优秀的算法,如 Region 定位.Region 分配.Region Server的上线和下线.Master 的上线和下线.在谈到这些之前,先把 HBase 的基本架构里 ...
- org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before ...
- Linux 软链接 硬链接 ln命令(繁杂版)
注意:创建软连接的时候,要用绝对路径!!! 这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln - ...
- POJ 3662 Telephone Lines (二分+dijkstra)
题意: 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人. 该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话 ...
- 浅谈SpringBoot核心注解原理
SpringBoot核心注解原理 今天跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到零配置 ...
- HDU3065【AC自动机-AC感言】
Fourth AC zi dong ji(Aho-Corasick Automation) of life 9A(其实不止交了10发...) 感言: 一开始多组数据这种小数据还是...无伤大局,因为改 ...
- 51nod 1278【贪心】
主要这道题没有包含的情况,所以直接搞个左端,然后对于每个二分求一下>right的最近的位置j,那么ans就会增加 j 以后的: #include <cstdio> #include ...