我们编写的汇编程序还是不够底层,CPU都是对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理。下面举几个例子来说说分析ARM机器码的方法。

  对编译连接之后得到的ELF进行反汇编:arm-linux-objdump

  查看得到的反汇编代码。这里如果想同时看到汇编代码和机器码,在编译的时候需要加上-g调试选项。

  1、mov r1,#0xff

    1110 00 1 1101 0 0000 0001 000011111111

  前者是汇编代码,后者是其对应的机器码。用第一个例子具体讲一下分析的方法。首先必须具备的一个手册就是ARM Architecture Reference Manual。这是学习ARM处理器绝对权威的一个参考资料。先看看每种ARM指令的一般格式

  

  31--28是条件段,取值表如下所示

  

  这里的例子中mov后面没有跟条件,所以是AL,Always (unconditional) ,对应的机器码为1110

  27--26为保留位,恒为00

  25位:Distinguishes between the immediate and register forms of <shifter_operand>.

    标志shifter_operand段存放的是立即数还是寄存器。若为寄存器则置零,若为立即数则置一。

  24--21为opcode,标明指令的类型,下面是opcode的取值表

  

  这个例子中mov对应的为1101

  20位:Signifies that the instruction updates the condition codes.

  表明该指令是否会影响程序状态字寄存器。是则置一,否则置零

  19--16位:Specifies the first source operand register.

  标明第一个源操作数寄存器,见每个指令的格式,有的有Rd,有的没有。

  由MOV指令的一般格式可以看出,他是没有使用Rd的,所以这几位填全0,其他使用到Rn的,这几位填通用寄存器标号的二进制值。如r2,则为0010

  15--12位:Specifies the destination register.

  标明目的寄存器,填充方法同Rn

  11--0位:Specifies the second source operand.  

  标明第二个源操作数,若为立即数则填该立即数的二进制值,若为通用寄存器则填通用寄存器标号的二进制值。

  第一条指令的机器码到这里就分析完了,下面具其他几个不同的情况来验证上面的说法,分析方法还是一样的,这里就不一一分析了。

  

  2、 movne r2,r1
    0001 00 0 1101 0 0000 0010 000000000001

  3、 cmp r1,r2
    1110 00 0 1010 1 0001 0000 000000000010

  4、 add r0,r0,r1
    1110 00 0 0100 0 0000 0000 000000000001

  5、 bic r0,r1,#0b101
    1110 00 1 1110 0 0001 0000 000000000101

  如果有疑问或者错误,欢迎指出。转载请注明出处!

ARM机器码分析的更多相关文章

  1. linux-3.2.36内核启动2-setup_arch中的内存初始化1(arm平台 分析高端内存和初始化memblock)【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/17093307 上一篇微博留下了这几个函数,现在我们来分析它们         sanity_c ...

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

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

  3. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  4. GNU ARM 汇编基础

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

  5. [国嵌笔记][026][ARM伪指令]

    ARM机器码 1.汇编程序通过汇编器变成机器码,然后才能在ARM处理器上运行 2.ARM机器码是一个32位的数,被分成了多个段,每个段都有各自的含义 3.格式: cond:表示条件(4位) I:表示源 ...

  6. linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com)日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...

  7. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...

  8. 【转】安卓逆向实践5——IDA动态调试so源码

    之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...

  9. Linux内核的整体架构

    Linux内核的整体架构 作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 原文:http://www.wowotech.net/linux_kenrel/11.html ...

随机推荐

  1. 如何消除inline-block产生的元素间空隙

    前端初学者可能都会碰到这个问题:有时候排版需要,会把一些块状元素的display属性设置为inline-block,如 <!-- HTML代码 --> <div class=&quo ...

  2. 使用Sqlite数据库存储数据

    1.Sql基本命令 1.1.创建表 表是有行和列组成的,列称为字段,行称为记录. 使用CREATE命令来创建表: 1 CREATE TABLE tab_student (studentId INTEG ...

  3. (ternary operator)三元运算符.

    ternary operator: advantage: make a terse simple conditional assignment statement of if-then-else. d ...

  4. windows下eclipse+hadoop2

    windows下eclipse+hadoop2.4开发手册 1.解压下载的hadoop2.4,到任意盘符,例如D:\hadoop-2.4.0. 2.设置环境变量 ①新建系统变量,如下所示. ②将新建的 ...

  5. 自己动手写一个iOS 网络请求库的三部曲[转]

    代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary 开源项目:Pitaya,适合大 ...

  6. 确认(confirm 消息对话框)

    confirm 消息对话框通常用于允许用户做选择的动作(包括一个确定按钮和一个取消按钮). 语法: confirm(str) str:在消息对话框中要显示的文本 返回值: 当用户点击"确定& ...

  7. javascript——基本包装类型

    <script type="text/javascript"> //1.Boolean 类型 //2.Number 类型 //3.String 类型 //Boolean ...

  8. 用eval 动态编译代码

    eval 有另外一种用法, 其参数是作为一个字串表达式, 而不是代码块.在运行时, 它将字串临时编译成代码并且执行. 这很易用, 但也很危险, 因为有可能会把具有危害性的代码放到字串里. foreac ...

  9. WF学习笔记(一)

    -流程启动方式1: WorkflowInvoker.Invoke(new Workflow1()); -流程启动方式2: WorkflowApplication instance = new Work ...

  10. 封装cookie组件

    var Cookie = { // 读取 get: function(name){ var cookieStr = "; "+document.cookie+"; &qu ...