數據類型
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的參數。
新聞熱點
疑難解答