ARM指令集

往期推荐

ARM汇编语言程序结构

Android与ARM处理器

反射调用Java层方法

反射获取Java层字段的值

ARM指令集是指计算机ARM操作指令系统。在ARM中有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向PC寄存器中写入目标地址值。ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。

介绍几种常见的指令以及它们的作用。

一:跳转指令

跳转指令有以下四种:

B:无条件跳转

例如: B 0x1234,跳转到绝对地址0x1234的位置执行相应代码。

BL:带链接的跳转指令

该指令将下一条指令的地址拷贝到R14寄存器也就是LR寄存器中 ,然后跳转到指定的地址。

例如:BL loc_234,跳转到目标loc_234地址去,这条指令一般用于子程序之间的调用.

BX:带状态切换的无条件跳转

BX 是用来切换处理器的状态。

例如:BX R0,跳转到R0寄存器指定的地址,并且根据R0最低位来切换处理器状态。

BLX:带链接和状态切换的无条件跳转

二:比较指令

指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新cpsr寄存器相关的条件标志位,方便后面的指令根据相应的条件来判断是否执行。

一般常用指令如下:

eq:相等/z=1

ne:不相等/标志z=0

hi:无符号数大于/c=1,z=0

cs/hs:无符号数大于或等于/c=1

cc/lo:无符号数小于/c=0

ls:无符号数小于或等于/c=0,z=1

gt:有符号数大于/z=0,n=v

ge:有符号数大于或等于/n=v

lt:有符号数小于/n!=v

le:有符号数小于或等于/z=1,n!=v

mi:负数/n=1

pl:整数或0/n=0

vs:溢出/v=1

vc:没有溢出

三:存储器与寄存器数据交互指令

数据交换指令是实现两个操作数据之间的位置互换的指令,这两个操作数可以是两个寄存器操作数,或一个寄存器操作数与一个存储器操作数,或两个存储器操作数,在多处理机中,也可以是一个寄存器操作数和一个共享存储器操作数。寄存器中存放的数据,可以是字符串,可以是数,也可以是一个地址,它可以存放各种类型的数据。

  • 存储地址单元:地址(如0x00004000)与地址中存在的值。

  • LDR:从存储器中加载数据到寄存器 ← Load

  • LDR R8,[R9,#4] R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元。

  • STR:将寄存器的数据存储到存储器 → Store

  • STR R8,[R9,#4] 将R8寄存器的数据存储到R9+0x4指向的存储单元。

  • LDM:将存储器的数据加载到一个寄存器列表 →

  • LDM R0,{R1-R3}将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器。

  • STM:将一个寄存器列表的数据存储到指定的存储器 ←

  • PUSH:将寄存器值推入堆栈。

  • POP:将堆栈值推出到寄存器。

  • SWP:将寄存器与存储器之间的数据进行交换。

  • SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换。

  • 堆,队列,数据结构。栈是竖的,后进先出,且只能从栈顶依次填入数据。

四: 数据指令

数据的三种指令分别为传送指令,数据算数运算指令以及数据逻辑运算指令。

传送指令

MOV:将立即数或寄存器的数据传送到目标寄存器 ←

MOV R0, #8 R0=8

数据算术运算指令

ADD,SUB,MUL,DIV ←

有符号、无符号运算,带进位运算。

数据逻辑运算指令

与:AND

或:ORR

异或:EOR

移位:实质是乘、除,类似于小数点移位,但相反,小数点左移,数变小,右移变大。但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制。LSL:逻辑左移←

LSR:逻辑右移←

LSL R0,R1,#2 R0=R1*4

其他指令

协处理器指令:SWT(切换用户模式)

伪指令:DCB

总结

通过今天的分享,我们知道了ARM的优点为,执行快,可嵌入式开发,数据的三种指令有:传送指令,数据逻辑运算指令和数据算术运算指令,最后还了解了Android是基于Linux内核驱动。

如果你也对安卓逆向感兴趣。可以加入下方的群,大家一起讨论问题,或者扫描下方二维码关注公众号,关注回复 “安卓逆向” 获取免费教程

安卓逆向交流学习:3543756281
vx:Yjxiaox

在这里插入图片描述