Pergunta

Prólogo

Eu estou tentando aprender sobre DalvikVM instruções usando o Smali/Baksmali assembler/disassembler para dex arquivos.

Problema

A partir deste arquivo java

package gd;

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

Eu ter gerado o seguinte smali arquivo de assembly:

.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

A minha pergunta é sobre a linha seguinte.

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

Como eu entendo isso carrega o objeto estático PrintStream do java.lang.System classe a v0 registrar.Agora, o que isso out: significa?

Foi útil?

Solução

PrintStream, na verdade, é o tipo da coisa que está sendo carregado.O objeto que você está carregando, pode ser referido como java.lang.System.out, onde java.lang é o pacote, System é a classe, e out é o membro (um campo estático) para ser carregado.

Você pode ver o mesmo padrão, na invocar-virtual: java.io é o pacote, PrintStream é a classe e println é o membro (neste caso, um método de instância).Em ambos os casos, o membro é precedido por um ->.Eu não sei se esse padrão é consistente em todo Smali.

Eu encontrei http://source.android.com/tech/dalvik/dalvik-bytecode.html inestimável quando eu estava jogando com dalvik coisas, embora, neste caso, a sua contribuição foi apenas de identificação que sget-objeto em apenas dois argumentos.Que me disse a ->out: o negócio tinha de ser parte do campo estático de referência.

Outras dicas

Na verdade, ele lê o campo estático chamado out da classe java.Lang.System. The (expected) type of that field iso java.io.PrintStream`.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top