2015-10-05 21 views
0

這是我的字節碼程序代碼,用於計算只能使用iconst_1的斐波那契數列的前20個數字。現在編寫一個JVM字節碼程序來計算並打印Fibonacci序列中的前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上做這件事?

+1

爲了在您的問題中粘貼代碼,您需要在每個代碼行之前添加四個空格或使用工具欄中的「代碼」按鈕。 – Vova

+0

非常感謝您 – user276019

+0

您正在尋找一個用於Java字節碼的_assembler_。這應該讓你的搜索開始。 –

回答

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 
} 

我想exercice是直接寫的代碼在字節碼,而不是反編譯你的問題的Java版本,但如果它可以幫助,很好:)

1

一個簡單的選擇是使用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

相關問題