0

我正在尝试在 Jasmin 字节码中存储一个字符串。经过大量的研究,我找不到这是否可行,如果可行,应该怎么做。我只能找出如何打印出来(这就是我打印字符串的方式)。我还想过将字符串存储为字符数组,但认为应该有一种更简单的方法。

.class public HelloWorld
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
  .limit stack 3
  .limit locals 1

  getstatic      java/lang/System/out Ljava/io/PrintStream;
  ldc            "Hello World."
  invokevirtual  java/io/PrintStream/println(Ljava/lang/String;)V

  return

.end method
4

2 回答 2

0

找到答案:字符串不是原始数据类型,因此您可以使用以下方法保存/加载它:

aastore (number)
aaload (number)
于 2017-06-12T22:19:14.373 回答
0

看到你的答案,现在我不确定问题是什么。

无论如何,这对我有用:

.class public HelloWorld
.super java/lang/Object

.field static private message Ljava/lang/String;

.method public static main([Ljava/lang/String;)V
  .limit stack 1
  .limit locals 1

  ldc            "Hello World."
  putstatic      HelloWorld/message Ljava/lang/String;
  invokestatic   HelloWorld/print()V
  return
.end method

.method public static print()V
  .limit stack 2
  .limit locals 2
  getstatic      java/lang/System/out Ljava/io/PrintStream;
  getstatic      HelloWorld/message Ljava/lang/String;
  invokevirtual  java/io/PrintStream/println(Ljava/lang/String;)V
  return
.end method

一切都是静态的,这不好,但main设置message为“Hello World.”,并调用print. 然后通过调用print获取message并打印它System.out.println,从您的原始代码中窃取。

虽然我很想成为阅读这两页 jasmin 文档并了解一切的神奇存在,但在此过程中,实际上我还发现 JDK 带有一个反编译器(JDK/bin/javap),它会产生“反汇编”如果你用-cswitch 调用它。不知何故invokevirtual只是不想使用静态方法......

于 2017-06-13T16:35:37.403 回答