编写JVM字节码程序来计算和打印斐波那契序列中的前20个数字

时间:2015-10-05 21:19:54

标签: java bytecode

这是我的字节码程序代码,用于计算只有能够使用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上执行此操作?

2 个答案:

答案 0 :(得分:1)

一个简单的选择是使用re.sub()。你需要学习它的语法。这很简单。

这是您在Jasmin中使用的代码(请注意使用labelincistore 4iload 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版本,但如果它可以帮助,那么好:)