• Davlik字节码中,寄存器是32位,可以支持任何类型。
  • 64位类型用2个寄存器表示。
  • Davlik字节码中有两种类型,分别是原式类型和引用类型。

原式类型
Z -> boolean
V -> void
B -> byte
S -> short
C -> char
I -> int
J -> long (64 bit)
F -> float
D -> double (64 bit)

对象类型

  • Lpackage/name/ObjectName; --> 相当于java中的package.name.ObjectName;
  • L:表示这是一个对象类型
  • package/name:该对象所在的包
  • ; :表示对象名称的结束

数组表示形式
[l:表示整型的一维数组,相当于int[]

对于多位数组,只需要增加[即可

对象数组
[Ljava/lang/String:表示一个String的对象数组

方法的表示

  • Lpackage/name/ObjectName; methodName(III)
  • Lpackage/name/ObjectName 表示类型
  • methodName 表示方法名
  • III 表示参数,这里为3个整型参数

字段的表示形式
Lpackage/name/ObjectNmae; -> FieldName:Ljava/lang/String;
即表示:包名,字段名和各自段类型
有两种方式指定一个方法中有多少寄存器是可用的
.registers 指定了方法中寄存器的总数
.locals 表明了方法中非参寄存器的总数,出现在方法的第一行

方法的传参
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中
例如一个方法有2个参数,5个寄存器(v0 ~ v4),那么参数将置于最后两个寄存器v3和v4
非静态方法中的第一个参数总是调用该方法的对象
静态方法没有隐含的this参数

寄存器的命名方式

  • V命名
  • P命名:第一个寄存器就是方法中的第一个参数寄存器

Long和Double是64位,需要两个寄存器

  • 关于详细的字节码,可以参考:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html