java虚拟机分析-字节码指令集
等待是一种煎熬,也是一种成长。
类相关的JVM指令
checkcast class 检查类型转换,检验未通过将抛出ClassCastException
getfield class/field desc 获取指定类的实例域,并将其值压入栈顶
getstatic class/field desc 获取指定类的静态域,并将其值压入栈顶
instanceof class 检验对象是否是指定类的实例,如果是将1压入栈顶,否则将0压入栈顶
new class 创建一个对象,并将其引用值压入栈顶
方法的定义
public static main ([Ljava/lang/String;]V
上述方法的描述中main表示方法名,[代表数组,L代表是一个类形式而不是基本数据类型,凡是L表示的类后面都会以分号结尾,V代表void
方法相关的JVM指令
invokeinterface class/method desc n 调用接口方法
invokespecial class/method desc 调用超类构造方法,实例初始化方法或私有方法
invokestatic class/method desc 调用静态方法
invokevitualclass/method desc调用实例方法
属性的定义
数组[
类L;
与栈操作相关的指令集
dup将当前的栈顶元素复制一份,并压入栈中
dup_x1复制栈顶数值并将两个复制值压入栈顶
dup_x2复制栈顶数值并将三个(或2个)复制值压入栈顶
dup2复制栈顶一个(long或double)或两个(其他)数值并将复制值压入栈顶
dup2_x1a,{b,c}复制成{b,c},a,{b,c}
dup2_x2{d,c},{b,a}复制成{b,a},{d,c},{b,a}
pop从当前栈顶出栈一个元素
pop2将栈顶的一个long或double类型的或两个其他数值从栈顶弹出
swap将栈顶两个非long或者double类型的数值交换
与本地变量操作相关
aloadn将当前本地变量n放入栈顶中,变量n是引用
aload_0将当前本地变量0放入栈顶中,变量0是一个引用
aload_1将当前本地变量1放入栈顶中,变量1是一个引用
aload_2将当前本地变量2放入栈顶中,变量2是一个引用
astoren将栈顶元素存入本地变量n中,变量n是一个引用
astore_0将栈顶元素存入本地变量0中,变量0是一个引用
astore_1将栈顶元素存入本地变量1中,变量1是一个引用
astore_2将栈顶元素存入本地变量2中,变量2是一个引用
dload将当前本地变量n放入栈顶中,变量n是一个double类型
dstore将栈顶元素存入本地变量n中,变量n是一个double类型
iinc将指定int型变量增加指定值
iload将当前本地变量n放入栈顶中,变量n时一个int类型
iload_0将当前本地变量0放入栈顶中,变量0是一个int类型
iload_1将当前本地变量1放入栈顶中,变量1是一个int类型
istore_0 将栈顶元素存入本地变量0中,变量0是一个int类型
istore_1将栈顶元素存入本地变量1中,变量1是一个int类型
与运算相关
dadd将栈顶两个double型数值相加,结果压入栈顶
dcmpg比较栈顶两个double类型数值大小,并将结果1,0,-1压入栈顶,当其中一个数值为NaN时,将1压入栈顶
ddiv栈顶两个double类型数据相除,结果压入栈顶
dmul栈顶两个double类型数据相乘,结果压入栈顶
dneg将栈顶double类型数据取负,结果压入栈顶
drem将栈顶两个double可惜数据做取模运算,结果压入栈顶
dsub将栈顶两个double类型数值相减,结果压入栈顶
fadd将栈顶两个float型数值相加,结果压入栈顶
….
i2b将栈顶的int类型数值强制转换成byte类型数值,结果压入栈顶
i2c将栈顶的int类型数值强制转换成char类型数值,结果压入栈顶
i2s将栈顶int类型数值强制转换成short类型数值,结果压入栈顶
ior将栈顶两个int类型数值相或,结果压入栈顶
ishl将int类型数值左移指定位数,结果压入栈顶
ishr将int类型数值右移指定位数,结果压入栈顶
iushr将无符号int类型数值右移指定位数,结果压入栈顶
ixor将栈顶两个int类型数值按位异或,结果压入栈顶
land将栈顶两个long类型数值相与,结果入栈顶
常量操作相关
aconst_null将null压入栈顶
bipush将单字节的常量值-128到127压入栈顶
dconst_0向栈顶压入一个double常量0
dconst_1向栈顶压入一个double常量1
fconst_0向栈顶压入一个float常量0
ldc将int,float,或String类型常量值从常量池中压入栈中
ldc_w将int,float或String类型常量值从常量池中压入栈中(宽索引 )
sipush将一个短整型常量值-32768—32767压入栈顶
ava控制指令
areturn返回一个引用
dreturn返回一个double类型数据
freturn 返回一个float类型数据
goto跳转到指定的偏移地址对应的指令
if_acmpeq比较栈顶的两引用型数值,当结果相等时跳转
iflt当栈顶int类型数值小于0时跳转
jsr跳转至指定16位label位置,并将jsr下一条指令地址压入栈顶
lookupswitch用于switch条件跳转
nop什么都不做
ret返回至本地变量指定的n的指令位置,一般与jsr联合使用
Java同步操作相关
monitorenter获得对象的锁,用于同步方法或同步块
monitorexit释放对象的锁,用于同步方法或同步块
java数组相关操作
aaload将引用型数值指定索引的值压入栈顶
aastore将栈顶引用型数值存入指定数组的指定索引位置
anewarray创建一个引用型,如类,接口,数组的数组,并将其引用值压入栈顶
arraylength获取数组的长度值并压入栈顶
athrow将栈顶的异常抛出
baload将boolean或byte类型数组指定索引的值压入栈顶
还没有评论,来说两句吧...