Android 字节码:一些变量的值未定义
Android bytecode: value of some variables not defined
我撤消了 android 申请。在阅读时,我看到一些使用变量的方法,例如 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
。请告诉我。谢谢
p1、p2等只是汇编程序提供的语法糖。在 Dex 代码中,局部变量和参数是一个巨大的数组,参数在数组的最后几个槽位传递。汇编程序可以帮助您直接通过 pn 语法引用参数,而不必跟踪您拥有多少局部变量并使用适当的 vn。
在发布的示例中,您有 1 个局部变量和 4 个参数,这意味着寄存器看起来像 {v0, p0, p1, p2, p3}
。
后面的 4 个在方法开始时自动初始化为传递的参数值。
我撤消了 android 申请。在阅读时,我看到一些使用变量的方法,例如 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
。请告诉我。谢谢
p1、p2等只是汇编程序提供的语法糖。在 Dex 代码中,局部变量和参数是一个巨大的数组,参数在数组的最后几个槽位传递。汇编程序可以帮助您直接通过 pn 语法引用参数,而不必跟踪您拥有多少局部变量并使用适当的 vn。
在发布的示例中,您有 1 个局部变量和 4 个参数,这意味着寄存器看起来像 {v0, p0, p1, p2, p3}
。
后面的 4 个在方法开始时自动初始化为传递的参数值。