为什么invoke-kind / range指令中指示的寄存器数量与参数类型的数量不匹配?

时间:2013-01-13 08:23:30

标签: android dalvik smali

在以下示例字节码中:

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

寄存器范围表示寄存器v0v1v2v3v4v5被传递给方法,但为什么这个数字与所示类型的数量不一样,只有2?

invoke-kind / range和normal invoke-kind之间有区别吗?

2 个答案:

答案 0 :(得分:3)

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

所以参数是:

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

答案 1 :(得分:0)

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