ARM机器码分析

  我们编写的汇编程序还是不够底层,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

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

时间: 2024-10-12 11:51:19

ARM机器码分析的相关文章

3.Arm机器码

首先汇编程序转化为机器码,才能在机器内运行. 首先我们对上面的裸机的代码中生的.elf文件进行反汇编: start.elf: file format elf32-littlearm ? Disassembly of section .text: ? 50008000 <_start>: .text .global _start _start: [email protected]和str的操作 ????mov r0,#0xff 50008000:????e3a000ff ????mov????r

12.ARM伪指令操作

12.ARM伪指令操作 首先ARM伪指令包括: ARM机器码 定义类伪指令 操作类伪指令 ? ARM机器码: 其实任何一种处理器可以运行的叫机器码,机器码是从汇编程序通过汇编器转换来的.接下来看看机器码的信息.流程:图1-1. 图1-1 在上一节里,建立好了一个简单的汇编工程,在start.S只有三行代码:图1-2: 图1-2 接下来对产生的elf文件来进行反汇编,命令是: arm-linux-objdump -D -S gboot.elf >dump,将反汇编的代码存到dump文件,dump文

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

近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultraedit修改二进制文件,保存可执行程序.再拷贝到ios设备,即可. 文章出处:http://blog.chinaunix.net/uid-22915173-id-225005.html ARM中的常用指令含义ADD 加指令SUB 减指令STR    把寄存器内容存到栈上去LDR    把栈上内容载入一

powerpc-linux内核start_kernel之前启动分析(1)-开门见山

前段时间做了公司内核从arm处理器到一款powerpc处理器的移植(公司处理器换核,前期用FPGA仿真板进行了芯片验证和软件移植),借这个机会也学习了powerpc处理器的一些知识,对powerpc的内核启动也有所了解. 完成了arm版本内核start_kernel之前汇编分析,也想尝试写几篇文章对powerpc的启动进行分析,与大家分享. 在分析之前,首先罗嗦几句,这次移植工作之前我从来没有接触过powerpc相关的知识,因此是作为一个初学者来完成这次移植工作的. 初学者要完成一次完整的内核移

S5PV210-kernel-内核启动过程分析

1.1.内核启动过程分析前的准备 1.拿到一个内核源码时,先目录下的无用文件删除 2.建立SI工程 3.makefile (1)makefile中不详细的去分析,几个关键的地方,makefile开始部分是kernel的版本号,这个版本号比较重要,因为在模块化驱动安装时会需要用到,要注意会查,会改,版本号在makefile中,改直接改的就行 (2)kernel顶层的makefile中定义的两个变量很重要,一个是ARCH,一个CROSS,ARCH表示我们当前的配置编译路径,如果我们的ARCH =AR

Part3_lesson3---ARM伪指令学习

1.ARM机器码 对elf格式的文件进行反汇编可得到相应汇编文件的机器码: arm-linux-objdump -D -S start.elf 机器码的解析,可以参考文件ARM Architecture Reference Manual的The ARM Instruction Set章节. 2.定义类伪指令 伪指令前面加上"."号是GNU的一个特点!! .global:标明一个全局的符号. .data:标明接下来的数据会存放到数据段里面去.即,这是一个数据段. 那么在数据段当中能够定义

Linux内核的整体架构简介

1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应. 注:本文和其它的"Linux内核分析"文章都基于如下约定:  a) 内核版本为Linux 3.10.29(该版本是一个long term的版本,会被Linux社区持续维护至少2年),可以从下面的链接获取:https://www.kernel.org/pu

Make ARCH=arm CROSS_COMPILE=arm-linux-gcc menuconfig 分析

在编译LINUX内核时,首先要修改内核源码顶层目录下的makefile文件,将其中ARCH ?= $(SUBARCH)修改为ARCH ?= arm,将CROSS_COMPILE    ?= 修改为CROSS_COMPILE    ?= arm-linux-gcc,或者不修改,而是将ARCH和CROSS_COMPILE的值通过命令行传入.然后在linux内核源码目录下,执行make menuconfig,那之后发生了什么? make命令在未指定文件的情况下,默认寻找名为Makefile或GNUMa

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1