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