【问题标题】:Why one more parameter is passed in a method in smali code为什么在 smali 代码中的方法中传递了一个参数
【发布时间】:2020-02-15 07:38:08
【问题描述】:

在我通过 apktool 解码的一段 smali 代码中,我发现一个方法调用传递的参数比方法定义中声明的参数多一个。这个额外的论点绝对不会被使用。但是如果我删除它,运行时会发生错误,从“验证器”中说“预期两个,找到三个”。这是怎么回事?

# method definition
.method public setLatitude(D)V
    .locals 1
    #(snipped)
.end method

# method call
# v3 is not defined actually
invoke-virtual {v1, v2, v3}, LFoo;->setLongitude(D)V

【问题讨论】:

    标签: android dalvik smali


    【解决方案1】:

    所有非静态方法都接受正在调用该方法的对象作为第一个参数。

    在您的示例中,该方法接受类型 D 的参数,这是一个需要 2 个寄存器的宽类型。在这种情况下,v1 是 LFoo;正在调用该方法的实例,[v2, v3] 是包含该方法的 64 位宽参数的寄存器对。

    当你说“v3 实际上没有定义”时,它会在设置 v2 时被隐式设置,因为所有的宽值都是使用连续的寄存器对存储的。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2018-01-06
      • 1970-01-01
      • 2022-01-04
      • 2015-04-17
      • 2020-12-20
      相关资源
      最近更新 更多