Java DalvikVM操作码的Smali语法 开场白

Java DalvikVM操作码的Smali语法 开场白,java,android,dalvik,smali,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; .

我正在尝试使用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

据我所知,这将
java.lang.System
类的静态对象
PrintStream
加载到
v0
寄存器中。现在,这个
out:
是什么意思?

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

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


当我在玩dalvik的东西时,我发现了非常宝贵的东西,尽管在这个例子中,它的贡献只是识别了sget对象只接受了两个参数。这告诉我
->out:
业务必须是静态字段引用的一部分。

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

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


当我在玩dalvik的东西时,我发现了非常宝贵的东西,尽管在这个例子中,它的贡献只是识别了sget对象只接受了两个参数。这告诉我
->out:
业务必须是静态字段引用的一部分。

实际上它读取类
java.Lang.System的名为
out
的静态字段。该字段的(预期)类型是
java.io.PrintStream`。

实际上它读取类
java.Lang.System的名为
的静态字段。该字段的(预期)类型为
java.io.PrintStream`.

登录此问题/答案的任何人的更新URL:登录此问题/答案的任何人的更新URL:
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;