DalvikVM操作码的Smali语法

时间:2012-07-26 14:28:16

标签: java android dalvik smali

序言

我正在尝试使用Smali / Baksmali汇编程序/反汇编程序来学习有关dex文件的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.System加载到v0寄存器中。现在,这个out:是什么意思?

2 个答案:

答案 0 :(得分: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:业务必须是静态字段引用的一部分。

答案 1 :(得分:1)

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