【深入理解JVM】学习笔记——-9、指令

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

字节码与数据类型
在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。iload中的i表示的是int。i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。也有不包含类型信息的:goto与类型无关;Arraylength操作数组类型。

加载与存储指令
加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,这类指令包括:

将一个局部变量加载到操作栈:iload
将一个数值从操作数栈存储到局部变量表:istore
将一个常量加载到操作数栈:bipush。
扩充局部变量表的访问索引的指令:wide

运算指令
运算或算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。大体上算术指令可以分为两种:对整型数据进行运算的指令与对浮点型数据进行运算的指令,无论是哪种算术指令,都使用Java虚拟机的数据类型,由于没有直接支持byte、short、char和boolean类型的算术指令,对于这类数据的运算,应使用操作int类型的指令代替。
注:e = a + b + c + d +e,操作数栈的深度依然是2。

类型转换指令
类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显示类型转换操作,或者用来处理字节码指令中数据类型相关指令无法与数据类型一一对应的问题。

宽化类型处理:int i= 1;long l = i;
窄化类型处理:User user = new User(); Object obj = user;
处理窄化类型转换时,必须显式地使用转换指令来完成,这些转换指令包括:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f。
————————————————
版权声明:本文为CSDN博主「TJtulong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/TJtulong/article/details/89598598

你可能感兴趣的:(【深入理解JVM】学习笔记——-9、指令)