一文带你熟悉android的dalvik指令集

624 阅读2分钟

背景

(在反编译app中的dex文件代码的时候就需要用于dalvik指令,所以对dalvik的掌握和数据,有利于提高对反编译代码的阅读理解)
下面主要进行罗列出在dalivk中常见常用的指令集。

1.数据操作指令

move(-wide/-object/-result/-result-object/-result-wide/-exception)
move(-wide/-object)/from16
move(-object)/16

2.返回指令(需重点关注)

return-void(表示方法的放回值为空)
return(表示方法的放回值为32位非对象类型的值)
return-wide(表示方法的放回值为64位非对象类型的值)
return-object(表示方法的放回值为对象类型的值)
    

3. 数据定义指令(重点)

const(-wide/-string/-class)
const/4
const(-wide)/16
const(-wide)/32
const(-wide)/high16

4.实例操作指令

check-cast(类型转换)
instance-of(检查)
new-instance(新建)
    

5.数组操作指令

array-length(获取数组长度)
new-array(新建数组)
filled-new-array(定义数组并初始化)
filled-new-array/range(定义数组并初始化/指定取值范围)
filled-array-data(数组元素取值与赋值)
    

6.跳转指令(重点)

goto
packed-switch(有规律)、sparse-switch(无规律)
if-eq(等于)/if-ne(不等于)
if-lt(小于)/if-le(小于等于)
if-gt(大于)/if-ge(大于等于)
    

7.比较指令(cmp)

大于(1)/等于(0)/小于(-1)=>cmpg、cmp
大于(-1)/等于(0)/小于(1)=>cmpl
    

8.字段操作指令

普通字段=>iget(读)/iput(写)
静态字段=>sget(读)/sput(写)
    

9.方法调用指令(重点)

invoke-virtual(调用实例的虚方法)
invoke-super(调用实例的父类/基类方法)
invoke-direct(调用实例的直接方法)
invoke-static(调用实例的静态方法)
invoke-interface(调用实例的接口方法)
    

10.数据转换指令

neg-数据类型=>求补
not-数据类型=>求反
数据类型1-to-数据类型2=>将数据类型1转换为数据类型2
    

11.数据运算指令

add/sub/mul/div/rem	 加/减/乘/除/模
and/or/xor  与/或/非
sh1/shr/ushr	有符号左移/有符号右移/无符号右移