p 命名法对函数的局部变量寄存器命名没有影响,它的命名规则:函数中引入的参数命名从p0开始,依次递增。Dalvik字节码的类型、方法与字段
1、类型
Dalvik字节码只有两种类型,基本类型与引用类型。
2、方法
Dalvik使用方法名、类型参数与返回值来详情描述一个方法。
方法格式如下: Lpackage/name/ObjectName;->MethodName(III)Z
3、字段
Dalvik虚拟机定位字段与字节码静态分析时会用到它。
格式如下:Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;Dalvik指令集
1、空操作指令的助记符为nop。它的值为00,通常nop指令被用来作对齐代码只用。
2、数据操作指令为move。move 指令根据字节码的大小与类型不同,后面会跟上不同的后缀。
3、返回指令指的是函数结尾时运行的最后一条指令。return-void、return vAA、return-wide vAA、return-object vAA
4、数据定义指令用来定义程序中用到的常量、字符串、类等数据。它的基础字节码为const。如:const/4 vA,#+B
5、锁指令多用在多线程程序中对同一对象的操作。如:
monitor-enter vAA 锁住
monitor-exit vAA 释放
6、实例操作指令包括实例的类型转换、检查以及新建等。
7、数组操作指令包括获取数组长度、新建数组、数组赋值、数组元素取值与赋值等操作。
8、异常指令集中有一条指令用来抛出异常。如:throw vAA
9、跳转指令用于从当前地址跳转到指定的偏移处。如:goto、switch、if
10、比较指令用于对两个寄存器的值进行比较。如:cmpkind vAA,vBB
11、字段操作指令用来对对象实例的字段进行读写操作。如:iinstanceop vA,vB,field@CCCC 与sstaticop vAA,field@BBBB
12、方法调用指令负责调用类实例的方法。它的基础指令为invoke。如:invoke-kind/range {vCCCC…vNNNNN}
13、数据转换指令用于将一种类型的数值转换成另一种类型。如:unop vA,vB
14、数据运算指令包括算术运算指令与逻辑运算指令。如:binop vAA,vBB,vCC 、add-type、sub-type……。Dalvik指令练习
写一个Dalvik版的Hello World。
1、编写smali文件
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 4
.parameter
.prologue
#空指令
nop
nop
nop
nop
#数据定义指令
const/16 v0, 0x8
const/4 v1, 0x5
const/4 v2, 0x3
#数据操作指令
move v1, v2
#数组操作指令
new-array v0, v0, [I
array-length 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 v1, v0
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder;
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
#跳转指令
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2, v2