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  调用静态方法
invokevitual class/method desc 调用实例方法

属性的定义
数组 [
L;

与栈操作相关的指令集
dup 将当前的栈顶元素复制一份,并压入栈中
dup_x1 复制栈顶数值并将两个复制值压入栈顶
dup_x2 复制栈顶数值并将三个(或2个)复制值压入栈顶
dup2 复制栈顶一个(long或double)或两个(其他)数值并将复制值压入栈顶
dup2_x1 a,{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类型的数值交换

与本地变量操作相关
aload n 将当前本地变量n放入栈顶中,变量n是引用
aload_0 将当前本地变量0放入栈顶中,变量0是一个引用
aload_1 将当前本地变量1放入栈顶中,变量1是一个引用
aload_2 将当前本地变量2放入栈顶中,变量2是一个引用
astore n 将栈顶元素存入本地变量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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值