2

在以下示例字节码中:

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

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

调用种类/范围和普通调用种类之间有区别吗?

4

2 回答 2

3

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

所以参数是:

this - v0
Ljava/lang/String; - v1
J - v1 and v2
F - v3
Landroid/location/LocationListener; - v4
于 2013-01-14T00:17:10.993 回答
0

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

于 2013-01-13T20:48:27.687 回答