今天我来总结一下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指令解析的更多相关文章

  1. iOS逆向工程之Hopper中的ARM指令

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  2. ARM处理器解析

    按图分析: ARM处理器有七种工作模式,为的是形成不同的使用级别,以防造成对系统的破坏.不同模式可以访问的寄存器不同,可以运行的指令不同. (1)user(10000):普通应用程序运行的模式(应用程 ...

  3. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  4. ARM架构解析

    ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...

  5. arm指令bne.w改成b,即无条件跳转

    近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...

  6. arm寄存器解析

    寒假闲来无事准备将自己的走过的arm之路总结一下,今天就先从arm的寄存器说起吧,欢迎各位拍砖. 要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式: Arm处理器有七种工作模式,为的是形成 ...

  7. ARM指令教程

    ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...

  8. ARM指令分类及其寻址方式

    ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...

  9. ARM指令

    语法格式 <opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand> {}表示是可选的部分,<& ...

随机推荐

  1. This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended

    VS2005转换成VS2010时出现的问题: This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x05 ...

  2. 生产环境下JAVA进程高CPU占用故障排查---temp

    问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ...

  3. Array 对象

    Array的对象用于在单个的变量中存储多个值. constructor 返回对创建此对象的数组函数的引用. demo: let arr=[];  arr.constructor==Array let ...

  4. P2P通讯初步实现

    原文URL: http://www.cnblogs.com/dlwang2002/archive/2008/09/16/1291793.html 1:基于Socket连接: 2:在四个局域网内测试通过 ...

  5. 关于在项目中遇到MySQL数据库死锁的问题

    在MySQL中, 当一个事务去更新某条数据, 还没有提交的时候, 第二个事务去更新该数据, 则会出现等待获取锁超时异常: >> Lock wait timeout exceeded; tr ...

  6. ShutdownHook作用

    源地址:http://kim-miao.iteye.com/blog/1662550 void java.lang.Runtime.addShutdownHook(Thread hook) 该方法用来 ...

  7. 1.1-1.4 hadoop调度框架和oozie概述

    一.hadoop调度框架 Linux Crontab Azkaban https://azkaban.github.io/ Oozie http://oozie.apache.org/ Zeus(阿里 ...

  8. TypeScript完全解读(26课时)_10.TypeScript完全解读-枚举

    10.TypeScript完全解读-枚举 新建enum.ts并在jindex.ts中引用 一个简单的数字枚举 可以通过两种方式获取枚举的值 获取到编码,第一个默认为0,后面的一次递增 第二种形式 可以 ...

  9. C#基础:通过委托给任何对象数组进行排序

    在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法 for (int ...

  10. JQuery学习笔记(三)遍历 DOM

    遍历 DOM jQuery 提供了多种遍历 DOM 的方法.遍历方法中最大的种类是树遍历(tree-traversal). 向上父节点parent,向下子节点child,同胞next和pre 缩写搜索 ...