Синтаксис Smali для кодов операций DalvikVM

Пролог

Я пытаюсь узнать об инструкциях DalvikVM, используя ассемблер/дизассемблер Smali/Baksmali для файлов dex.

Проблема

Из этого 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:?


person Kalevi    schedule 26.07.2012    source источник


Ответы (2)


PrintStream на самом деле является типом загружаемой вещи. Загружаемый объект может называться java.lang.System.out, где java.lang — это пакет, System — класс, а out — загружаемый элемент (статическое поле).

Вы можете увидеть тот же шаблон в invoke-virtual: java.io — это пакет, PrintStream — это класс, а println — член (в данном случае метод экземпляра). В обоих случаях члену предшествует ->. Я не знаю, повторяется ли эта закономерность во всем Смали.

Я нашел http://source.android.com/tech/dalvik/dalvik-bytecode.html был неоценим, когда я играл с dalvik, хотя в этом случае его вклад заключался в том, что он просто идентифицировал, что sget-object принимает только два аргумента. Это подсказало мне, что бизнес ->out: должен быть частью статической ссылки на поле.

person Iain    schedule 26.07.2012
comment
Обновленный URL-адрес для всех, кто переходит по этому вопросу/ответу: source.android.com/devices. /tech/dalvik/dalvik-байткод - person outlyer; 12.09.2020

На самом деле он читает статическое поле с именем out класса java.Lang.System. The (expected) type of that field isjava.io.PrintStream`.

person Joachim Sauer    schedule 26.07.2012