Jasmin 字节码存储字符串

Jasmin ByteCode Storing a String

我正在尝试在 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

找到答案: 字符串不是原始数据类型,因此您将 it/load 保存为:

aastore (number)
aaload (number)

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

无论如何,这对我有用:

.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

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

虽然我很想成为阅读那两页 jasmin 文档并且无所不知的神奇人物,但在这个过程中实际上我也挖掘出 JDK 附带了一个反编译器(JDK/bin/javap),如果你用 -c 开关调用它,它会产生 'disassembly'。不知何故 invokevirtual 只是不想使用静态方法...