数据类型
1. 基本数据类型
Z boolean B byte S short C char I int J long (64 bits) F float D double (64 bits)
V void 返回值类型
2.引用数据类型
对象
以Lpackage/name/ObjectName;的形式表示。
前面的L表示这是一个对象类型,package/name/是该对象所在的包,ObjectName是对象的名字,”;”表示对象名称的结束。相当于java中的package.name.ObjectName
例如:Ljava/lang/String; 相当于 java.lang.String
数组
[I –表示一个整型一维数组,相当于java中的 int[]。 对于多维数组,只要增加[就行了。[[I 相当于 int[][],[[[I 相当于int[][][] 。注意每一维的最多255个。
对象数组
[Ljava/lang/String; 表示一个String对象数组。
方法
方法表示形式:Lpackage/name/ObjectName;-> MethodName(III)Z
在上面的例子中,Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。
方法的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中则为:String method(int, int[][], int, String, Object[])
寄存器
java变量存放在内存中,android中变量放在寄存器中,为了提高性能
寄存器为32位,可以支持任何类型,其中long和doubble是64位的,需要使用两个寄存器保存
寄存器采用v和p来命名v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
v0 第一个本地寄存器v1 第二个本地寄存器v2 p0 (this)v3 p1 第一个参数v4 p2 第二个参数v5 p3 第三个参数
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。
.registers 使用这个指令指定方法中寄存器的总数.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。
声明成员
PRivate TextView mTextView;
.field private mTextView:Landroid/widget/TextView;
指令执行
move v0, v3 #把v3寄存器的值移动到寄存器v0上.
const v0, 0x1 #把值0x1赋值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I
#执行方法sum(),v4,v5的值分别作为sum的参数。
新闻热点
疑难解答