簡體   English   中英

java字節碼的不同行為

[英]Different behaviour of java bytecode

我是Java Bytecode的新手。 我通過一些例子理解了字節碼,但我陷入了一個例子。
這些是我的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

}  

我只是想知道當我們有a = 9指令時為什么會有bipush 9
在所有其他情況下,有iconst。

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

bipush可以在-128和127之間推動常量值。它是一個雙字節指令。

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

iconst_n定義為0從0到5

沒有iconst_9 ,所以你必須使用等效(但效率較低)的bipush

沒有iconst_9指令

i_const指令的范圍僅為0~5,因此必須通過push和store吐出實例

指令iconst_ *經過優化,可以處理小的和特定的數字,而bipush(將一個字節作為整數值推入堆棧)適用於更大的數字。

沒有iconst_9指令。 所以要推9你不能使用iconst。 你必須去bipush

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM