2.數組的表示形式:
[I :表示一個整形的一維數組,相當於java的int[];對於多維數組,只要增加[ 就行了,[[I = int[][];註:每一維最多255個;
對像數組的表示形式:[Ljava/lang/String表示一個String的對象數組;
3.方法的表示形式:
Lpackage/name/ObjectName;->methodName(III)Z
Lpackage/name/ObjectName 表示類型
methodName 表示方法名
III 表示參數(這裡表示為3個整型參數)說明:方法的參數是一個接一個的,中間沒有隔開
4.字段的表示形式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;即表示:包名,字段名和字段類型
5.寄存器指定
有兩種方式指定一個方法中有多少寄存器是可用的:
.registers 指令指定了方法中寄存器的總數
.locals 指令表明了方法中非參寄存器的總數,出現在方法中的第一行
6.方法的表示
方法有直接方法和虛方法兩種,直接方法的聲明格式如下:
.method<存取權限>[修飾關鍵字]<方法原型>
<.locals>
[.parameter]
[.prologue]
[.line]
<代碼體>
.end method
存取權限有public、private等,修飾關鍵字有static、constructor等。方法原型描述了方法的名稱、參數與返回值。
.registers指定了方法中寄存器的總數
.locals指定了方法中非參寄存器的總數(局部變量的個數);
.parameter指定了方法的參數;
.prologue指定了代碼的開始處;
.line指定了該處指令在源代碼中的位置。
注意:構造函數的返回類型為V,名字為<init>。
7.方法的傳參:
當一個方法被調用的時候,方法的參數被置於最後N個寄存器中;
例如:一個方法有2個參數,5個寄存器(v0~v4),那麼,參數將置於最後2個寄存器(v3和v4)。非靜態方法中的第一個參數總是調用該方法的對象。
說明:對於靜態方法除了沒有隱含的this參數外,其他都一樣
8.寄存器的命名方式:V命名、P命名
第一個寄存器就是方法中的第一個參數寄存器。比較:使用P命名是為了防止以後如果在方法中增加寄存器,需要對參數寄存器重新進行編號的缺點。特別說明一下:Long和Double類型是64位的,需要2個連續的寄存器
例如:對於非靜態方法LMyObject->myMethod(IJZ)V,有4個參數: LMyObject(隱含的),int,long,boolean
需要5個寄存器(因為long佔有2個連續的寄存器)來存儲參數:
P0 this(非靜態方法中這個參數是隱含的)
P1 I (int)
P2,P3 J (long)
P4 Z(bool)
如果是靜態的就是三個參數
P0 I (int)
P1,P2 J (long)
P3 Z(bool)