我正在尝试在Jasmin Bytecode中存储一个字符串。经过大量的研究,我找不到这是否可能,如果是,应该如何做。我只能找出如何打印出来(这就是我打印字符串的方式(。我还想到将字符串存储为字符数组,但认为应该有更简单的方法。
.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
看到你的答案,现在我不确定问题是什么。
无论如何,这对我有用:
.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(,如果你用开关调用它,它会产生"反汇编"-c
。不知何故,invokevirtual
只是不想使用静态方法......
找到答案:字符串不是基元数据类型,因此您可以保存/加载它:
aastore (number)
aaload (number)