2012-08-04 30 views
15

我是Java Bytecode中的新手。我通過一些例子來理解字節碼,但我陷入了一個例子。
這是我的Java和字節碼文件Java字節碼的不同行爲

class SimpleAdd{ 
    public static void main(char args[]){ 
     int a,b,c,d; 
     a = 9; 
     b = 4; 
     c = 3; 
     d = a + b + c; 
     System.out.println(d); 
    } 
} 
Compiled from "SimpleAdd.java" 
class SimpleAdd extends java.lang.Object{ 
SimpleAdd(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(char[]); 
    Code: 
    0: bipush 9 
    2: istore_1 
    3: iconst_4 
    4: istore_2 
    5: iconst_3 
    6: istore_3 
    7: iload_1 
    8: iload_2 
    9: iadd 
    10: iload_3 
    11: iadd 
    12: istore 4 
    14: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    17: iload 4 
    19: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    22: return 

} 

我只是想知道爲什麼會出現bipush 9時,我們有指令= 9
而在所有其他情況下,有ICONST。

+3

'bipush 9'將整數文字9壓入堆棧。 'istore_1'將該值存儲到局部變量#1中。 'iconst_4'將一個文字4壓入堆棧,並且在一個字節中對'bipush'執行一個字節,但是隻有'iconst_1'到'iconst_5'字節碼 - 沒有'iconst_9'。 – 2012-08-04 20:31:59

回答

20

iconst可以將常數值推到-1到5.它是一個單字節指令。

bipush可以推動-128到127之間的常數值。它是一個雙字節指令。

要推9,您不能使用iconst。沒有iconst_9指令。

0

沒有iconst_9指令

6

iconst_n is defined for n from 0 to 5

有沒有iconst_9,所以你必須使用等效的(但不efficent)bipush

+1

'iconst'支持[從零到五]的值(http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iconst_i)... – Holger 2015-08-18 15:33:47

0

的i_const指令只從0〜5的範圍,所以它必須通過推送和存儲吐出指令