Question

Prologue

I am trying to learn about DalvikVM instructions using the Smali/Baksmali assembler/disassembler for dex files.

Problem

From this java file

package gd;

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

I have generated the following smali assembly file:

.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

My question is about the following line.

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

As I understand this loads the static object PrintStream of the java.lang.System class into the v0 register. Now, what does this out: mean?

Was it helpful?

Solution

PrintStream is actually the type of the thing being loaded. The object you're loading might be referred to as java.lang.System.out, where java.lang is the package, System is the class, and out is the member (a static field) to be loaded.

You can see the same pattern in the invoke-virtual: java.io is the package, PrintStream is the class and println is the member (in this case, an instance method). In both cases, the member is preceded with a ->. I don't know if this pattern is consistent throughout Smali.

I found http://source.android.com/tech/dalvik/dalvik-bytecode.html invaluable when I was playing with dalvik stuff, although in this case its contribution was just identifying that sget-object only took two arguments. That told me the ->out: business had to be part of the static field reference.

OTHER TIPS

Actually it reads the static field named out of the class java.Lang.System. The (expected) type of that field isjava.io.PrintStream`.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top