ARM指令集
往期推荐
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