Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么调用种类/范围指令中指示的寄存器数量与参数类型的数量不匹配?_Android_Dalvik_Smali - Fatal编程技术网

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个寄存器。