Android 为什么调用种类/范围指令中指示的寄存器数量与参数类型的数量不匹配?
在以下示例字节码中:Android 为什么调用种类/范围指令中指示的寄存器数量与参数类型的数量不匹配?,android,dalvik,smali,Android,Dalvik,Smali,在以下示例字节码中: invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V 寄存器的范围表示将寄存器v0,v1,v2,v3,v4,v5,传递给方法,但为什么该数字与所示类型的数字不相同,即仅为2 调用种类/范围和普通调用种类之间有区别吗 好的。
invoke-virtual/range {v0 .. v5}, Landroid/location/LocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V
寄存器的范围表示将寄存器v0
,v1
,v2
,v3
,v4
,v5
,传递给方法,但为什么该数字与所示类型的数字不相同,即仅为2
调用种类/范围和普通调用种类之间有区别吗 好的。。。这些类型没有用
,
分开,这使得初学者很难区分:Ljava/lang/String
是完整的类名,J
是长类型,F
是浮点类型,Landroid/location/LocationListener
是完整的类名。
但是,仍然不清楚,对于所有指定的参数类型,加上方法调用的对象的
类型,数量是5个参数类型,但是为什么寄存器的范围指定为6?参数列表中总共提到了4个参数,Ljava/lang/String代码>,,
J
、F
和Landroid/location/LocationListener代码>。此外,由于is是一种非静态方法,因此有一个隐含的此
参数出现在其他参数之前。拼图中最后一个缺失的部分是“J”是一个双精度的64位类型,这意味着它需要两个寄存器
因此,参数为:
this - v0
Ljava/lang/String; - v1
J - v1 and v2
F - v3
Landroid/location/LocationListener; - v4
您从何处获得该输出?@auselen当前输出来自apktoolcheck对invoke virtual/range的使用情况,它有一些用于特定目的的寄存器,在您的情况下,这些寄存器的总和似乎为5。我仍然无法想象为什么您使用了6个,但可能剩余的也用于特定目的。@auselen是权威文档。哇!非常感谢。真的不知道v1
和v2
将打包在一起作为J类型值!从@jesusFreke answer,我了解到的是,在6个参数中,有4个参数用于,Ljava/lang/String;,F、 Landroid/location/LocationListener和1个参数用于此参数,剩下的2个参数仅在J中使用,因为其大小为64位,需要2个寄存器。