JVM(PART XXI)各种指令

本文详细介绍了JVM指令集中的各类指令,包括加载与存储、运算、类型转换、对象创建与访问等,并解释了每种指令的作用及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载和存储指令

类型指令
将一个局部变量加载到操作栈iload,iload_< n>,lload,lload_< n>,fload,fload_< n>,dload,dload_< n>,aload,aload_< n>
将一个数值从操作数栈存储到局部变量表istore,istroe_< n>,lstore,lstore_< n>,fstore,fstore_< n>,dstore,dstore_< n>,astore,astore_< n>
将一个常量加载到操作数栈bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,lconst_< l>,fconst_< f>,dconst_< d>
扩充局部变量表访问索引的指令wide

运算指令

类型指令
加法指令iadd、ladd、fadd、dadd
减法指令isub、lsub、fsub、dsub
乘法指令imul、lmul、fmul、dmul
除法指令idiv、ldiv、fdiv、ddiv
求余指令irem、lrem、frem、drem
取反指令ineg、lneg、fneg、dneg
位移指令ishl、ishr、iushr、lshl、lshr、lushr
按位或指令ior、lor
按位与指令iand、land
按位异或指令ixor、lxor
局部变量自增指令iinc
比较指令dcmpg、dcmpl、fcmpg、fcmpl、lcmp

类型转换指令

宽化处理:

JVM直接支持小范围类型转换到大范围类型
- int可以直接转换为long,float和double
- long可以直接转换为float,double
- float可以直接转换为double

窄化处理:
类型指令
int的窄化i2b,i2c,i2s
long的窄化l2i
float的窄化f2i,f2l
double的窄化d2i,d2l,d2f
float转窄化为整数类型

如果浮点值是NaN,那么转换的结果就是 int或者long类型的0
如果浮点值不是无穷大的话,浮点值使用IEEE754的向零模式取整,获得的整数值为v,如果v在目标类型T(int或者是long)的表示范围之内,那转换结果就是v。
否则,将根据v的符号,转换为T所能表示的最大或者是最小的正数。

对象创建与访问指令

类型指令
创建类实例的指令new
创建数组的指令newarray,anewarray,mulitanewarray
访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者称为实例变量)的指令getfield,putfield,getstatic,putstatic。
把一个数组元素加载到操作数栈的指令baload,caload,saload,iaload,laload,faload,daload,aaload
把一个操作数栈的值存储到数组元素中的指令bastore,castore,sastore,iastore,fastore,dastore,aastore
取数组长度的指令arraylength
检查类实例类型的指令instanceof,checkcast

操作数栈管理指令

类型指令
将操作数栈的栈顶一个或者两个元素出栈pop,pop2
复制栈顶的一个或者两个数值并将复制值或者双分的复制值重新压入栈顶dup,dup2,dup_x1,dup2_x1,dup_x2,dup2_x2
将栈最顶端的两个数值互换swap

控制转移指令

类型指令
条件分支ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,
if_icmpeq,if_icmpne,ificmplt,ificmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne
复合条件分支tableswitch,lookupswitch
无条件分支goto,goto_w,jsr,jsr_w,ret

方法调用和返回指令

指令作用
调用对象的实例方法,根据对象实际类型进行分派invokevirtual
调用接口方法,在运行时搜索一个实习了这个接口方法的对象,找出适合的方法进行调用invokeinterface
调用一些需要特殊处理的实例方法,包括初始化方法,私有方法和父类方法invokespecial
调用类方法invokestatic
在运行时动态解析出调用点限定符所引用的方法并执行该方法invokedynamic

异常处理指令

Java中的显式抛出异常的操作(throw)都由athrow指令来实现。
整数运算中如果除数为0,则会在idiv或者ldiv中抛出ArithmeticException异常。

同步指令

同步一段指令集序列通常是由java语言中的synchronized语句块来表示,JVM指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值