揭祕java虛擬機(三)JVM指令集

目錄

nop

處理棧

算數運算

強制類型裝換

方法調用


官方說明是jvms14.pdf

nop

0x00 無操作

處理棧

說明   String int float boolean char short long double
xconst_n x類型的n進棧 0x01 aconst_null null進棧   0x02 iconst_m1 -1進棧            
    0x03 iconst_0  0x0B fconst_0        0x09 lconst_0  0x0E dconst_0 
    0x04 iconst_1  0x0C fconst_1        0x0A lconst_1  0x0F dconst_1 
    0x05 iconst_2  0x0D fconst_2           
    0x06 iconst_3             
    0x07 iconst_4             
    0x08 iconst_5 5進棧            
ldc   0x12 ldc 將常量值從常量池推棧頂          
  0x13 ldc_w將常量值從常量池推棧頂(寬索引)       0x14 ldc2_w 將常量值從常量池推棧頂
tload [index] 將局部變量進棧 0x19 aload 將index執行局部變量進棧   0x15 iload 0x17 fload        0x16 lload 0x18 dload
tload_n 將第n個t形局部變量進棧 0x2A aload_0   0x1A iload_0 0x22 fload_0       0x1E lload_0 0x26 dload_0
0x2B aload_1   0x1B iload_1 0x23 fload_1       0x1F lload_1 0x27 dload_1
0x2C aload_2   0x1C iload_2 0x24 fload_2       0x20 lload_2 0x28 dload_2
0x2D aload_3   0x1D iload_3 0x25 fload_2       0x21 lload_3 0x29 dload_3
taload 將t形數組第index值進棧 0x32 aaload  

0x2E iaload

0x30 faload 0x33 baload 0x34 caload 0x35 saload 0x2F laload 0x31 daload
tstore 將棧頂數值存入局部變量 0x3A astore   0x36 istore 0x38 fstore       0x37 lstore 0x39 dstore

tstore_n

將棧頂存入第n個局部變量

0x4B astore_0   0x3B istore_0 0x43 fstore_0       0x3F lstore_0 0x47 dstore_0
0x4C astore_1   0x3C istore_1 0x44 fstore_1       0x40 lstore_1 0x48 dstore_1
0x4D astore_2   0x3D istore_2 0x45 fstore_2       0x41 lstore_2 0x49 dstore_2
0x4E astore_3   0x3E istore_3 0x46 fstore_3       0x42 lstore_3 0x4A dstore_3
tastore 將棧頂數值存入數組 0x53 aastore   0x4F iastore 0x51 fastore 0x54 bastore 0x55 castore 0x56 sastore 0x50 lastore 0x52 dastore
pop     0x57 pop 棧頂出棧    
    0x58 pop2 棧頂一個(long/double)/兩個(其他類型)出棧
dup     0x59 dup 複製棧頂並進棧    
    0x5A dup_x1 複製棧頂並插入棧中(必須看官網文檔)    
    0x5B dup_x2 複製棧頂並插入棧中(必須看官網文檔)    
    0x5C dup2
    0x5D dup2_x1
    0x5E dup2_x2
swap     0x5F swap 交換棧頂兩個數值    
cmp       0x95 fcmpl 一個爲NaN則爲-1       0x94 lcmp比較棧頂 0x97 dcmpl 一個爲NaN則爲-1
      0x96 fcompg 一個爲NaN則爲1         0x98 dcmpg
                   

 

算數運算

  i f l d
tadd 棧頂兩數值相加並進棧(原數消失) iadd 0x60 fadd 0x62 ladd 0x61 dadd 0x63
tsub(棧頂是減數) isub 0x64 fsub 0x66 lsub 0x65 dsub 0x67
tmul imul 0x68 fmul 0x6A lmul 0x69 dmul 0x6B
tdiv(遵循IEEE規範) 0x6C idiv 0x6E fdiv 0x6D ldiv 0x6F ddiv
trem(取模)        
tneg(取相反數)        
  0x84 iinc 自增1      

位運算

 

tshl(左移)
tshr(帶符號右移>>)
tushr(>>>)
tand(按位與)
tor(按位或)
txor(按位異或)

類型裝換

  i l f d
i   l2i 0x88 f2i 0x8B d2i 0x8E
l i2l 0x85   f2l 0x8C d2l 0x8F
f i2f 0x86 l2f 0x89   d2f 0x90
d i2d 0x87 l2d 0x8A 0x8D  
b i2b 0x91      
c i2c 0x92      
s i2s 0x93      

方法調用

invokevitual

invokeinterface

invokespecial:調用不會被重寫的方法(私有方法,初始化方法,父類方法)

invokestatic:調用靜態方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章