首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DalvikVM操作码的Smali语法

DalvikVM操作码的Smali语法
EN

Stack Overflow用户
提问于 2012-07-26 22:28:16
回答 2查看 3.8K关注 0票数 0

序曲

我正在尝试学习使用用于dex文件的Smali/Baksmali汇编/反汇编程序的DalvikVM指令。

问题

从这个java文件中

代码语言:javascript
复制
package gd;

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

我已经生成了以下smali汇编文件:

代码语言:javascript
复制
.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

我的问题是关于下面这行。

代码语言:javascript
复制
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 22:46:49

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

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

当我在使用dalvik的东西时,我发现http://source.android.com/tech/dalvik/dalvik-bytecode.html是非常有价值的,尽管在这种情况下,它的贡献只是识别出sget-object只有两个参数。这告诉我->out:业务必须是静态字段引用的一部分。

票数 4
EN

Stack Overflow用户

发布于 2012-07-26 22:48:34

实际上,它读取java.Lang.System. The (expected) type of that field isjava.io.PrintStream`类的名为out的静态字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11671545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档