2

次のバイトコードの例では:

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

レジスタの範囲は、レジスタv0v1v2v3v4v5がメソッドに渡されることを示していますが、その数が示されたタイプの数と同じではないのはなぜですか?

呼び出しの種類/範囲と通常の呼び出しの種類に違いはありますか?

4

2 に答える 2

3

Ljava/lang/String;パラメータリストに Jは、、、、、Fおよびの合計4つのパラメータが記載されていますLandroid/location/LocationListener;。さらに、isは非静的メソッドであるためthis、他のパラメーターの前に発生する暗黙のパラメーターがあります。パズルの最後の欠けている部分は、「J」がダブルであり、64ビットタイプであるということです。つまり、2つのレジスタが必要です。

したがって、パラメータは次のとおりです。

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

OK... これらの型は で区切られていない,ため、初心者には区別が難しくなっています。Ljava/lang/Stringは完全なクラス名、Jは long 型、Fは float 型、Landroid/location/LocationListenerは完全なクラス名です。ただし、指定されたすべてのパラメーターの型thisと、メソッドが呼び出すオブジェクトの型の数が 5 つのパラメーターの型であるのに、レジスタの範囲が 6 に指定されているのはなぜですか?

于 2013-01-13T20:48:27.687 に答える