这是我的字节码程序代码,用于计算只有能够使用iconst_1的斐波纳契序列的前20个数字。
iconst_1
istore_1
iconst_1
istore_2
iconst_1
istore_3
getstatic #2
iconst_1
invokevirtual #3
getstatic #2
iconst_1
invokevirtual #3
iconst_1
istore_4
iload_4
bipush 18
if_icmpgt 51
iload_1
iload_2
iadd
istore_3
getstatic #2
iload_3
invokevirtual #3
iload_2
istore_1
iload_3
istore_2
iinc 4,1
goto 23
return
现在我的主要问题是它是一个名为fibonacci.bc的文件形式,我需要编译它并运行它以确保它有效。我是否需要首先在程序中解决任何问题,例如语法等。我将如何在JVM上执行此操作?
答案 0 :(得分:1)
一个简单的选择是使用re.sub()
。你需要学习它的语法。这很简单。
这是您在Jasmin中使用的代码(请注意使用label
,inc
,istore 4
,iload 4
):
.class public Fib
.super java/lang/Object
.method private static fib()V
.limit stack 2
.limit locals 5
iconst_1
istore_1
iconst_1
istore_2
iconst_1
istore_3
getstatic java/lang/System/out Ljava/io/PrintStream;
iconst_1
invokevirtual java/io/PrintStream/println(I)V
getstatic java/lang/System/out Ljava/io/PrintStream;
iconst_1
invokevirtual java/io/PrintStream/println(I)V
iconst_1
istore 4
label23:
iload 4
bipush 18
if_icmpgt label51
iload_1
iload_2
iadd
istore_3
getstatic java/lang/System/out Ljava/io/PrintStream;
iload_3
invokevirtual java/io/PrintStream/println(I)V
iload_2
istore_1
iload_3
istore_2
iinc 4 1
goto label23
label51:
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 0
.limit locals 1
invokestatic Fib/fib()V
return
.end method
将文件保存在例如fib.j
并且正在运行java -jar jasmin.jar fib.j
将为您提供Fib.class
。
答案 1 :(得分:0)
如果有帮助,那就好。
在java(8)中:
public class Fibonacci {
public static long fib(int n) {
if (n <= 1) return n;
else return fib(n-1) + fib(n-2);
}
public static void main(String[] args) {
int N = 20;
for (int i = 1; i <= N; i++)
System.out.println(i + ": " + fib(i));
}
}
编译后,用:
进行反汇编javap -c Fibonacci.class
哪种产品:
public static long fib(int);
Code:
0: iload_0
1: iconst_1
2: if_icmpgt 8
5: iload_0
6: i2l
7: lreturn
8: iload_0
9: iconst_1
10: isub
11: invokestatic #2 // Method fib:(I)J
14: iload_0
15: iconst_2
16: isub
17: invokestatic #2 // Method fib:(I)J
20: ladd
21: lreturn
public static void main(java.lang.String[]);
Code:
0: bipush 20
2: istore_1
3: iconst_1
4: istore_2
5: iload_2
6: iload_1
7: if_icmpgt 48
10: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
13: new #4 // class java/lang/StringBuilder
16: dup
17: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
20: iload_2
21: invokevirtual #6 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: ldc #7 // String :
26: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: iload_2
30: invokestatic #2 // Method fib:(I)J
33: invokevirtual #9 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
36: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
39: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
42: iinc 2, 1
45: goto 5
48: return
}
我想练习是直接在字节码中编写代码,而不是反编译你的问题的java版本,但如果它可以帮助,那么好:)