寄存器与变量
Java中的变量都是放在内存中的,安卓为了提高性能,变量都是放在寄存器中的。寄存器为32位,可以支持任何类型。其中long和double这种64为的类型需要两个寄存器保存。寄存器采用v和p来命名,v表示本地寄存器,p表示参数寄存器,关系如下: v0:第一个本地寄存器
v1:第二个本地寄存器
v2 p0(this)
v3 p1 第一个参数
当然,如果是静态方法,就只有5个寄存器,不需要存this。
.registers使用这个指令指定方法中寄存器的总数
.locals使用这个指令指定方法中非参寄存器总数,放在方法第一行。
方法指令
1.field private isFlag:z #定义变量 2.methd #方法 3.parameter #方法参数 4.prologue #方法开始 5.line 12 #此方法位于第12行 6 7invoke-direct #调用函数 8 9return-void #返回void 10 11 12.end method #函数结束 13 14new-instence #创建实例 15input-object #对象赋值 16 17iget-object #调用对象 18 19invoke-static #调用静态函数
方法的定义
1private static int sum(int a, int b) { 2 return a+b; 3 }
对应的smali代码:
1.method private static sum(II)I 2.locals 4 #表示需要申请4个本地寄存器 3.parameter 4.parameter #这里表示有两个参数 5.prologue 6.line 27 7 8move v0, p0 9.local v0, a:I 10 11move v1, p1 12.local v1, b:I 13 14move v2, v0 15 16move v3, v1 17 18add-int/2addr v2, v3 19 20move v0, v2 21# 22.end local v0 23 24return v0 25 # 26.end method