0

プロローグ

dex ファイル用の Smali/Baksmali アセンブラー/逆アセンブラーを使用して、DalvikVM 命令について学習しようとしています。

問題

このJavaファイルから

package gd;

class Hello {
    public static void main(String[] args)
    {
      System.out.println("Hello!");
    }
}

次の smali アセンブリ ファイルを生成しました。

.class Lgd/Hello;
.super Ljava/lang/Object;
.source "Hello.java"


# direct methods
.method constructor <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 3
    .parameter

    .prologue
    .line 6
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "Hello!"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 7
    return-void
.end method

私の質問は次の行についてです。

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

私が理解しているように、これはクラスの静的オブジェクトPrintStreamをレジスタにロードします。さて、これはどういう意味ですか?java.lang.Systemv0out:

4

2 に答える 2

4

PrintStreamは、実際にはロードされるもののタイプです。ロードするオブジェクトは、と呼ばれる場合があります。java.lang.System.outここjava.langで、はパッケージ、Systemはクラス、outはロードされるメンバー(静的フィールド)です。

同じパターンがinvoke-virtualで確認できます。java.ioはパッケージ、PrintStreamはクラス、printlnはメンバー(この場合はインスタンスメソッド)です。どちらの場合も、メンバーの前には。が付きます->。このパターンがSmali全体で一貫しているかどうかはわかりません。

http://source.android.com/tech/dalvik/dalvik-bytecode.htmlは、dalvikのもので遊んでいたときに非常に貴重であることがわかりましたが、この場合、その貢献は、sget-objectが2つの引数しかとらないことを特定することでした。それは私に->out:ビジネスが静的なフィールド参照の一部でなければならなかったことを教えてくれました。

于 2012-07-26T14:46:49.480 に答える
1

実際にoutは、クラスjava.Lang.System. The (expected) type of that field isjava.io.PrintStream`という名前の静的フィールドを読み取ります。

于 2012-07-26T14:48:33.763 に答える