我反向安卓应用程序。在阅读时,我看到一些使用变量的方法,例如p1
或p2
...我不知道在哪里可以引用这些变量。例如:
.method public b(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
.locals 1
invoke-static {}, Lpnf/this/object/does/not/Exist;->a()Z
move-result v0
invoke-static {v0}, Lpnf/this/object/does/not/Exist;->b(I)V
.prologue
.line 33
if-eqz p1, :cond_0
if-eqz p2, :cond_0
if-eqz p3, :cond_0
.line 34
invoke-static {p1, p2, p3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
.line 36
:cond_0
return-void
.end method
我不明白的是:
if-eqz p1, :cond_0
if-eqz p2, :cond_0
if-eqz p3, :cond_0
我不知道变量p1
p2
p3
。请告诉我。感谢
答案 0 :(得分:1)
p1,p2等只是汇编程序提供的语法糖。在Dex代码中,局部变量和参数是一个巨大的数组,参数在数组的最后几个插槽中传递。汇编程序可以帮助您直接通过pn语法引用参数,而不必跟踪您拥有的局部变量数量并使用适当的vn。
在发布的示例中,您有1个局部变量和4个参数,这意味着寄存器看起来像{v0, p0, p1, p2, p3}
。
后面的4在方法开始时自动初始化为传递的参数值。