int和float都是一个字长的值,Java栈的每个位置的长度都是一个字长(至少32位宽),每当一个int或者float类型被压入栈时,它都将占据一个位置。
iconst_ml 将int类型值-1压入栈
iconst_0 将int类型值0压入栈
iconst_1 将int类型值1压入栈
iconst_2将int类型值2压入栈
iconst_3 将int类型值3压入栈
iconst_4将int类型值4压入栈
iconst_5 将int类型值5压入栈
fconst_0将float类型值0压入栈
fconst_1将float类型值1压入栈
fconst_2 将float类型值2压入栈
long和double类型值是64位长度的值,每当一个long或者double类型的值压入栈时,都将占据2个位置
lconst_0将long类型值0压入栈
lconst_1将long类型值1压入栈
dconst_0将double类型值0压入栈
dconst_1将double类型值1压入栈
空对象处理
aconst_null将空(null)对象引用压入栈
byte或者short类型在压入栈之前被扩展成int类型值
bipush byte1 将byte1转换为int类型,然后压入栈
sipush byte1,byte2将byte1和byte2转换为int类型,然后压入栈
常量池入口压入栈
常量池索引是一个无符号值,它在字节码流中直接跟随在操作码后面,ldc和ldc_w把一个字长的项压入栈,该项或者是一个int类型,float类型的值,或者是一个String类型的对象引用
ldc indexbyte1 从由indexbyte1指向的常量池入口取出一个字长的值,然后压入栈
ldc_w indexbyte1,indexbyte2 从由indexbyte1和indexbyte2指向的常量池入口取出一个字长的值,然后压入栈
ldc1_w indexbyte1,indexbyte2 从由indexbyte1和indexbyte2指向的常量池入口中取出两个字长的值,然后压入栈
通用栈操作
nop 不做任何操作
pop从操作数栈中弹出栈顶部的一个字
pop2从操作数栈中弹出最顶端的两个字
swap交换栈顶部的两个字
dup复制栈顶部的一个字
dup2复制栈顶部的两个字
dup_x1复制栈顶的一个字,并将复制内容及原来弹出的两个字长的内容压入栈
dup_x2复制栈顶的一个字,并将复制内容及原来弹出的三个字长的内容压入栈
dup2_x1复制操作数栈的两个字,并将复制内容及原来弹出的三个字长的内容压入栈
dup2_x2复制操作数栈的两个字,并将复制内容及原来弹出的四个字长的内容压入栈
将一个字长的局部变量压入栈
iload videx将为之为vindex的int类型局部变量压入栈
iload_0将位置为0的int类型局部变量压入栈
iload_1将位置为1的int类型局部变量压入栈
iload_2将位置为2的int类型局部变量压入栈
iload_3将位置为3的 int类型局部变量压入栈
fload vindex将位置为vindex的float类型局部变量压入栈
fload_0将位置为0的float类型局部变量压入栈
fload_1将位置为1的flaot类型局部变量压入栈
fload_2将位置为2的float类型局部变量压入栈
fload_3将位置为3的float类型局部变量压入栈
两个字长的局部变量
lload vindex 将位置vindex和vindex+1的long类型压入栈
lload_0 0和1
lload_1 1和2
lload_2 2和3
lload_3 3和4
dload vindex 将位置vindex和vindex+1的double类型局部变量压入栈
引用变量
aload vindex 将位置为vindex的对象局部变量压入栈
aload_0
aload_1
aload_2
aload_3
弹出栈顶部元素,将其赋给局部变量
istore vindex从栈中弹出int类型值,然后将其存到位置为vindex的局部变量中
istore_0从栈中弹出int类型值,然后保存到位置为0的局部变量中
istore_1
istore_2
istore_3
fstore vindex
fstore_0
fstore_1
fstore_2
fstore_3
lstore vindex从栈中弹出long类型值,然后将其存在位置为vindex和vindex+1的局部变量中
lstore_0
lstore_1
lstore_2
dstore
dstore_0
dstore_1
dstore_2
dstore_3
astore vindex从栈中弹出对象引用,然后将其存在位置为vindex的局部变量中
astore_0
astore_1
astore_2
astore_3
wide 无符号8位局部变量索引(普通指令后的索引),把方法中局部变量数限制在256以下,一条单独的wide的指令可以将8位的索引再扩展8位,这样就可以把对局部变量扩展到65536,跟随在wide操作码和修改过的操作码之后的两个字节组成指向局部变量的16位无符号索引
wide iload indexbyte1,indexbyte2从局部变量位置为index的地方取出int类型值,压入栈
wide lload
wide fload
wide dload
wide aload
wide istore从栈中弹出int类型值,然后将其压入位置为index的局部变量中
wide lstore
wide fstore
wide dstore
wide astore