gpt4 book ai didi

java - DalvikVM 操作码的 Smali 语法

转载 作者:行者123 更新时间:2023-12-01 17:30:22 31 4
gpt4 key购买 nike

序言

我正在尝试使用 dex 文件的 Smali/Baksmali 汇编器/反汇编器来了解 DalvikVM 指令。

问题

来自这个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;

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

最佳答案

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

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

我找到了http://source.android.com/tech/dalvik/dalvik-bytecode.html当我玩 dalvik 的东西时,它的值(value)是无价的,尽管在本例中它的贡献只是识别 sget-object 仅接受两个参数。这告诉我 ->out: 业务必须是静态字段引用的一部分。

关于java - DalvikVM 操作码的 Smali 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671545/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com