【问题标题】:Why the number of registers indicated in the invoke-kind/range instruction not matching with the number of argument types?为什么调用种类/范围指令中指示的寄存器数量与参数类型的数量不匹配?
【发布时间】:2013-01-13 08:23:29
【问题描述】:

在以下示例字节码中:

 invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V

寄存器的范围表示寄存器v0,v1,v2,v3,v4,v5,都传给了方法,但是为什么数字和数字不一样指示的类型中,只有 2 个?

invoke-kind/range 和普通的invoke-kind 有区别吗?

【问题讨论】:

标签: android dalvik smali


【解决方案1】:

参数列表中一共提到了4个参数,Ljava/lang/String;JFLandroid/location/LocationListener;。此外,由于 is 是一个非静态方法,因此在其他参数之前有一个隐含的 this 参数。最后一个缺失的部分是“J”是一个双精度类型,它是一个 64 位类型 - 这意味着它需要两个寄存器。

所以参数是:

this - v0
Ljava/lang/String; - v1
J - v1 and v2
F - v3
Landroid/location/LocationListener; - v4

【讨论】:

  • 哇!谢谢!真不知道v1v2会被打包成J型值!
【解决方案2】:

OK...这些类型没有用,分隔,这让初学者很难区分:Ljava/lang/String是完整的类名,J是long类型,F是float type,Landroid/location/LocationListener 是完整的类名。 但是,仍然不清楚,对于所有指定的参数类型,加上该方法正在调用的对象的this类型,数量是5个参数类型,但是为什么将寄存器的范围指定为6?

【讨论】:

  • 来自@jesusFreke的回答,我的理解是,6个参数中,4个参数用于,Ljava/lang/String;,F,Landroid/location/LocationListener,1个参数用于这个参数,剩下的2个参数只在J中使用,因为它的大小是64位,需要2个寄存器。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 2012-06-15
  • 2014-05-04
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多