java虛擬機器指令常量部分

sayWhat_sayHello發表於2018-12-09

助記表格

縮寫符 + const + 數字;
b(byte)/s(short)i(integer)push;

操作碼 助記符 指令含義
00 (0x00) nop 什麼都不做
01 (0x01) aconst_null 將null推送到棧頂
02 (0x02) iconst_m1 將int型別的-1推到棧頂
03 (0x03) iconst_0 將int型別的0推送到棧頂
04 (0x04) iconst_1 將int型別的1推送到棧頂
05 (0x05) iconst_2 將int型別的2推送到棧頂
06 (0x06) iconst_3 將int型別的3推送到棧頂
07 (0x07) iconst_4 將int型別的4推送到棧頂
08 (0x08) iconst_5 將int型別的5推送到棧頂
09 (0x09) lconst_0 將long型別的0推送到棧頂
10 (0x0a) lconst_1 將long型別的1推送到棧頂
11 (0x0b) fconst_0 將float型別的0推送到棧頂
12 (0x0c) fconst_1 將float型別的1推送到棧頂
13 (0x0d) fconst_2 將float型別的2推送到棧頂
14 (0x0e) dconst_0 將double型別的0推送到棧頂
15 (0x0f) dconst_1 將double型別的1推送到棧頂
16 (0x10) bipush 將單位元組的常量值(-128~127)推送到棧頂
17 (0x11) sipush 將一個短整型類常量(-32768~32767 推送到棧頂)
18 (0x12) ldc 將int,float或String型別常量值從常量池推送到棧頂
19 (0x13) ldc_w 將int,float或String型別常量值從常量池推送到棧頂(寬索引)
20 (0x14) ldc2_w 將long或double型別常量值從常量池推送到棧頂(寬索引)

案例

這裡用一段簡單的程式碼看看改變一個數的區別

public class test{
    private int i = 0;
    public int inc(){
        return i+1;
    }
}

在這裡插入圖片描述

public class test{
    private int i = 0;
    public int inc(){
        return i+8;
    }
}

在這裡插入圖片描述

public class test{
    private int i = 0;
    public int inc(){
        return i+38888;
    }
}

在這裡插入圖片描述

總結

通過上面的案例,我們可以看到改變加數的範圍,對應的指令跟著改變。以int為例,在 -1 ~ 5之間都可以直接通過iconst類的指令直接獲取,在-32768~32767之間則變成了sipush,而再超過這個範圍,加數就會先進常量池,再通過idc指令執行獲取。

相關文章