Java虚拟机-字节码指令

1.字节码指令

Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的数字,称之为操作码,以及跟随其后的零至多个代表此操作所需参数的操作数而构成。操作码的长度为1个字节,因此最大只有256条。基于栈的指令集架构。

2.字节码与数据类型

在虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。iload fload大多数指令是包含类型信息的。也有不包含类型信息的,Goto,Arraylength。类型多,指令少。如果每个指令都有类型信息,256个指令就会不够用,因此一些指令可以将不支持的类型转换为支持的类型。

3.加载指令
加载和存储指令用于将数据在栈帧中的局部变量表操作数栈之间来回传输。
        将局部变量表加载到操作数栈:iload lload fload dload aload。
        将一个数值从操作数栈存储到局部变量表:istore lfda。
将一个常量加载到操作数栈:bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst。

扩充局部变量表的访问索引的指令:wide。

4.运算指令
运算或算数指令用于对两个操作数栈上的值进行某种特定的运算,并把结果存储到操作数栈顶。
加法指令:add。
减法指令:sub。
乘法指令:mul。
除法指令:div。
取余指令:rem。

取反指令:neg。

5.类型转换指令

类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中显式类型转换操作以及用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。宽化类型处理和窄化类处理,i2b i2c i2s l2i。

6.对象创建与访问指令
创建类实例的指令:new。
创建数组的指令:newarray anewarray multianearray。
访问类字段:getfield putfield getstatic putstatic。
把数组元素加载到操作数栈的指令:baload csllfda。
将操作数栈的值存储到数组元素:astore。
取数组长度的指令:arraylength。

检查实例类型的指令:instanceof checkcast。

7.操作数栈管理指令
操作数栈指令用于直接操作操作数栈。
将操作数栈的一个或两个元素出栈:pop pop2。
复制栈顶一个或两个数值并将复制或双份复制值重新压入栈顶:dup dup2 dup_x1 dup_x2。

将栈顶的两个数值替换:swap。

8.控制转移指令
控制转移指令可以让Java虚拟机有条件或无条件的从指定的位置指令而不是控制转移指令的下一条指令继续执行程序。可以认为控制转移指令,就是在修改pc寄存器的值。
条件分支:ifeq iflt ifle ifne ifgt ifnull ifcomple。
符合条件分支:tableswitch lookupswitch。

无条件分支:goto goto_w_jsr_w ret。

9.异常处理指令

在程序中显示抛出异常的操作会有athrow指令实现,除了这种情况,还有别的异常会在其他Java虚拟机指令检测到异常状况时由虚拟机自动抛出。

10.同步指令
同步一段指令集序列通常是由Java语言的synchronized块来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字语义,正确实现synchronized关键字需要编译器与Java虚拟机两者协作支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值