一。加载和存储指令
1. 加载和存储指令用于将数据在栈帧的局部变量表和操作数栈之间来回传输。
2. 将局部变量表加载到操作数栈:iload lload fload dload aload
3. 将一个数值从操作数栈存储到局部变量表中:istore lofa
4.将一个常量加载到操作数栈:bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst
当取值-1~5采用iconst指令
当取值-128~127采用bipush指令
当取值-32768~32767采用sipush指令
当取值-2147483648~2147483647采用ldc指令
5.扩充局部变量表的访问索引的指令:wide
二。运算指令
1.运算或算数指令用于对两个操作数栈上的之进行某种特定的运算,并把结果存储到操作数栈顶。
2.加法指令:add (i l f d)
3.减法指令:sub
4.乘法指令:mul
5.除法指令:div
6.取余指令:rem
7.取反指令:neg
三。类型转换指令
1.类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显示类型转换
以及用来处理字节码指令集中数据类型相关指令无法与数据类型一 一对应的问题。
2.宽化类型处理和窄化类型处理。
宽化类型转换:int i=0 ,long l =i 或者 User user=new User ( ) , Object obj =user
窄化类型转换:User user=new User ,Object obj=user , User u=(User)obj
3.指令表示:
i2l(int类型转换为long类型)
l2i (long类型转换为int类型)
四。对象创建和访问指令
1.创建类实例的指令:new
2.创建数组的指令:newarray anewarray(new一个引用类型数组) multianewarry
3.访问类字段:getfield putfield getstatic putstatic
4.把数组元素加载到操作数栈的指令:baload (c s i l f d a类型) b为byte类型
5.将操作数栈的值存储到数组元素:astore
6.取数组长度的指令:arraylength
7.检查实例类型的指令:instanceof checkcast
五。操作数栈指令
1.操作数栈指令用于直接操作操作数栈
2.将操作数栈的一个或两个元素出栈:pop pop2
3.复制栈顶一个或两个数值并将复制或双份复制值重新压入栈顶:dup dup2 dup_x1 dup_x2
4.将栈顶的两个数值替换:swap
六。控制转移指令
1.控制转移指令可以让Java虚拟机有条件或者无条件的(goto java保留字符,无法使用,java指令可以使用)从指定的位置指令而不是控制转移指令的下一条指令继续
执行程序。可以认为控制转移指令就是在修改pc寄存器的值。
2.条件分支:ifeq iflt ifle ifne ifgt ifnull ifcmple。。。
3.复合条件分支:tableswitch lookupswitch
4.无条件分支:goto goto_w jsr jsr_w ret
七。方法调用指令和方法返回指令
1.invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见
的方法分派方式。
2.invokeinterface 指令用于调用接口方法,他会在运行时搜索一个实现这个接口的对象。找出适合的方法进行调用。
3.invokespecial 指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法,私有方法和父类方法。
4.invokestatic 指令用于调用类方法(static方法)
5.方法的调用指令与数据类型无关,而方法返回指令则是根据返回值类型区分的,包括ireturn(当返回值时boolean、
byte、char、short和int类型时使用)、lreturn、freturn、dreturn和areturn,另外还有一条return指令供声明为void的
方法、实例化初始化方法、类和接口初始化方法使用。
八。异常处理指令
1.在程序中显示抛出异常的操作会由athrow指令实现,除了这种情况,还有别的异常会在其他Java虚拟机指令检测到
异常状况时由虚拟机自动抛出。
九。同步指令
1.同步一段指令集序列通常是由Java语言中的synchronized块来表示的,Java虚拟机的指令集中有monitorenter和
monitorexit两条指令集来支持synchronized关键字的语义。