揭秘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:调用静态方法

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