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;

据我了解,这会将类的静态对象加载PrintStreamjava.lang.System寄存器v0中。现在,这是什么out:意思?

4

2 回答 2

4

PrintStream 实际上是正在加载的事物的类型。您正在加载的对象可能称为java.lang.System.out,其中java.lang是包,System是类,out是要加载的成员(静态字段)。

您可以在 invoke-virtual 中看到相同的模式:java.io是包,PrintStream是类,println是成员(在这种情况下,是实例方法)。在这两种情况下,成员前面都有一个->. 我不知道这种模式在整个 Smali 中是否一致。

当我在玩 dalvik 的东西时,我发现http://source.android.com/tech/dalvik/dalvik-bytecode.html非常宝贵,尽管在这种情况下它的贡献只是确定 sget-object 只需要两个参数。这告诉我->out:业务必须是静态字段引用的一部分。

于 2012-07-26T14:46:49.480 回答
1

实际上它读取名为java.io.PrintStreamout类的静态字段。java.Lang.System. The (expected) type of that field is

于 2012-07-26T14:48:33.763 回答