java虚拟机分析-字节码指令集

野性酷女 2022-08-10 08:39 252阅读 0赞

等待是一种煎熬,也是一种成长。

类相关的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类型数组指定索引的值压入栈顶

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读