未归类
nop
:什么都不做
aconst_null
:将 null 推送至操作数栈栈顶
const
负责把整数送到操作数栈栈顶
只能操作整数型,例如 1.0,1,-1都可以操作
数值范围:-1~5
iconst_m1
:将int基础类型的数值为 -1 的数据推送至操作数栈栈顶
const_0
:将int基础类型的数值为 0 的数据推送至操作数栈栈顶
前缀:基础类型
后缀:数值
前缀 | 含义 |
---|---|
i | int |
l | long |
f | float |
d | double |
后缀 | 含义 |
---|---|
_m1 | 数值:-1 |
_0~5 | 数值:0~5 |
- -1.0 ~ 5.0 也是用其操作。
- 该助记符只能操作一定范围内的整数数值,超出该范围(-1~5)的将使用
push
命令系列。
push
负责把整数送到操作数栈栈顶
数值范围:-32768~32767
bipush 7
:将整数 7 推送至操作数栈栈顶
前缀:基础类型
无后缀
前缀 | 含义 | 范围 |
---|---|---|
bi | byte int | -128~127 |
si | short int | -32768~32767 |
- 该助记符只能操作一定范围内的整形数值,超出该范围(-32768~32767)的将使用 ldc 命令系列。
- 该助记符不会操作精度高于 int 的基础类型,例如:double、float 和 long。
ldc
负责把数值(小数和整数)或 String(不包含String引用) 推送至操作数栈栈顶
超出该范围的数值会报错
操作数值范围最大的助记符
- String引用:即
new String();
ldc #2
:将数值或 String 推送至操作数栈栈顶且分配的域编号为 2。
无前缀
后缀:基础类型
后缀 | 含义 |
---|---|
无 | int、float 或 String(宽索引) |
2_w | long 或 double |
- 宽索引:可包含足够大的序列
- 从 #2 开始,表示第一个变量的位置
- # :域编号,后续操作可以通过这个域编号获取内容
load
负责把本地变量表的变量(基础类型和引用类型)送到操作数栈栈顶
iload 4
:将本地变量表编号为 4 的int类型的数值送到操作数栈栈顶
前缀:数据的基础类型或引用类型
后缀:本地变量表里面变量的编号 _2
前缀 | 含义 |
---|---|
i | int |
l | long |
f | float |
d | double |
a | 引用类型 |
- 前缀 a 可以和前缀搭配表示引用类型的索引值的类型,例如数组
int i = {1, 0};
中i[0]
对应前缀ia
。
store
负责把操作数栈栈顶的变量(基础类型和引用类型)存到本地变量表
istore 4
:将操作数栈栈顶的int类型的数值存到本地变量表且分配编到的编号为 4。
前缀:数据的基础类型或引用类型
后缀:本地变量表分配到的变量的编号 _2
前缀 | 含义 |
---|---|
i | int |
l | long |
f | float |
d | double |
a | 引用类型 |
- 前缀 a 可以和前缀搭配表示引用类型的索引值的类型,例如数组
int i = {1, 0};
中i[0]
对应前缀ia
。
pop
负责将操作数栈栈顶的变量弹出栈
无前缀
pop:将栈顶数值弹出(变量不能是long或double类型的)
pop2:将栈顶的一个(long或double类型的)或两个变量弹出(其它)
dup
负责将操作数栈栈顶的变量复制并压入操作数栈栈顶
无前缀
无后缀
dup:将栈顶的变量(数值不能是long或double类型)复制并将其复制值压入栈
数学操作及移位
swap:执行变量的值互换操作(数值不能是long或double类型的)
iadd:执行int型的乘法操作
isub:执行int型的减法操作
imul:执行int型的乘法操作
idiv:执行int型的除法操作
irem:执行int型求余数操作
ineg:执行int型取反操作
ishr:执行int型移位操作
iand:执行int型按位与操作
ior:执行int型按位或操作
iinc:执行int型与常量int型加法操作
类型转换
负责对操作数栈栈顶数值进行基础类型转化,并将其操作后压回操作数栈栈顶
i2l
:将操作数栈栈顶int型数值强制转换成long型数值并将其压回操作数栈栈顶
前缀:基础类型
后缀:基础类型
前缀 | 含义 |
---|---|
i | int |
l | long |
f | float |
d | double |
后缀 | 含义 |
---|---|
i | int |
l | long |
f | float |
d | double |
方法操作命令
用于对静态方法和非静方法进行调用
invokespecial #1
:调用超类(父类,一般指Object)构造器,并放到操作数栈栈顶分配到的域编号为 #1 来保存类信息
invoke
:调用,执行
无前缀
后缀:方法的类型
后缀 | 含义 |
---|---|
special | 超类构造方法,实例初始化方法,私有方法 |
virtual | 实例方法 |
static | 静态方法 |
interface | 接口方法 |
实例初始化方法和实例方法之间是否有区别?
实例方法:需要从操作数栈栈顶弹出一个this引用(指之前入栈的对象地址)。
实例初始化方法:包括实例方法,会调用 class.<init>()
方法。
域操作指令
用于对静态域和非静态域进行读写
getstatic #4
:获取域编号为 4 的静态域将其值压入操作数栈栈顶
前缀:操作方法
后缀:域空间类型
前缀 | 含义 |
---|---|
get | 获取指定域并将其值压栈 |
put | 用栈顶的值为指定域赋值 |
后缀 | 含义 |
---|---|
static | 静态域 |
field | 实例域 |
静态域:静态方法、静态类和静态属性
实例域:对象实例
如果你是无意刷到这篇文章并看到这里,希望你给我的文章来一个赞赞👍👍。如果你不同意其中的内容或有什么问题都可以在下方评论区留下你的想法或疑惑,谢谢你的支持!!😀😀