Smali sintaxe para DalvikVM opcodes
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?
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 is
o java.io.PrintStream`.