博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA操作码相关指令介绍(2)
阅读量:6704 次
发布时间:2019-06-25

本文共 3769 字,大约阅读时间需要 12 分钟。

上一章介绍了JAVA一些基础类型转化以及局部变量的入栈等操作。这章继续给大家介绍下字节码命令。

JAVA数值运算

JAVA里面提供的整数运算都基于intlong类型的运算。当小于int类型的类型参与计算的时候,会将他们转化为int类型。

1.数值之间相加

操作码 操作数 备注
iadd 从栈中弹出两个int类型数,相加之后将所得int类型结果压回栈
ladd 从栈中弹出两个long类型数,相加之后将所得long类型结果压回栈
fadd 从栈中弹出两个float类型数,相加之后将所得float类型结果压回栈
dadd 从栈中弹出两个double类型数,相加之后将所得double类型结果压回栈
iinc vindex,const 把常量与一个位于vindex位置的int类型局部变量相加
wide iinc,indexconst 把常量与一个位于vindex位置的int类型局部变量相加

2.数值之间相减

栈顶端的充当减数,次顶端的充当被减数

操作码 操作数 备注
isub 从栈中弹出两个int类型数,相减所得int类型结果压回栈
lsub 从栈中弹出两个long类型数,相减所得long类型结果压回栈
fsub 从栈中弹出两个float类型数,相减所得float类型结果压回栈
dsub 从栈中弹出两个double类型数,相减所得double类型结果压回栈

3.数值之间乘法

操作码 操作数 备注
imul 从栈中弹出两个int类型数,相乘所得int类型结果压回栈
lmul 从栈中弹出两个long类型数,相乘所得long类型结果压回栈
fmul 从栈中弹出两个float类型数,相乘所得float类型结果压回栈
dmul 从栈中弹出两个double类型数,相乘所得double类型结果压回栈

4.数值之间除法

次顶端的数除以顶端的数。如果整数被0除,会抛出相关异常。

操作码 操作数 备注
idiv 从栈中弹出两个int类型数,相除所得int类型结果压回栈
ldiv 从栈中弹出两个long类型数,相除所得long类型结果压回栈
fdiv 从栈中弹出两个float类型数,相除所得float类型结果压回栈
ddiv 从栈中弹出两个double类型数,相除所得double类型结果压回栈

5.数值之间取余

操作码 操作数 备注
irem 从栈中弹出两个int类型数,取余所得int类型结果压回栈
lrem 从栈中弹出两个long类型数,取余所得long类型结果压回栈
frem 从栈中弹出两个float类型数,取余所得float类型结果压回栈
drem 从栈中弹出两个double类型数,取余所得double类型结果压回栈

6.数值之间取反

操作码 操作数 备注
ineg 从栈中弹出两个int类型数,取反将所得int类型结果压回栈
lneg 从栈中弹出两个long类型数,取反将所得long类型结果压回栈
fneg 从栈中弹出两个float类型数,取反将所得float类型结果压回栈
dneg 从栈中弹出两个double类型数,取反将所得double类型结果压回栈

7.数值之间位移

操作码 操作数 备注
ishl 将int型数值左移位指定位数并将结果压入栈顶
ishr 将int型数值右(符号)移位指定位数并将结果压入栈顶
iushr 将int型数值右(无符号)移位指定位数并将结果压入栈顶
lshl 将long型数值左移位指定位数并将结果压入栈顶
lshr 将long型数值右(符号)移位指定位数并将结果压入栈顶
lshr 将long型数值右(无符号)移位指定位数并将结果压入栈顶

7.数值之间或

操作码 操作数 备注
ior 将栈顶两int型数值作“按位或”并将结果压入栈顶
lor 将栈顶两long型数值作“按位或”并将结果压入栈顶

8.数值之间与

操作码 操作数 备注
iand 将栈顶两int型数值作“按位与”并将结果压入栈顶
land 将栈顶两long型数值作“按位与”并将结果压入栈顶

9.数值之间异或

操作码 操作数 备注
ixor 将栈顶两int型数值作“按位异或”并将结果压入栈顶
lxor 将栈顶两long型数值作“按位异或”并将结果压入栈顶

10.数值之间比较

操作码 操作数 备注
dcmpg 比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶
dcmpl 比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
fcmpg 比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶
fcmpl 比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
lcmp 比较栈顶两long型数值大小,并将结果(1,0,-1)压入栈顶
ifeq 当栈顶int型数值等于0时跳转
ifne 当栈顶int型数值不等于0时跳转
iflt 当栈顶int型数值小于0时跳转
ifge 当栈顶int型数值大于等于0时跳转
ifgt 当栈顶int型数值大于0时跳转
ifle 当栈顶int型数值小于等于0时跳转

JAVA类相关操作

1.类属性字段操作

操作码 操作数 备注
new 创建类实例
newarray 创建一个指定原始类型(如int,float,char…)的数组,并将其引用值压入栈顶
anewarray 创建一个引用型(如类,接口,数组)的数组,并将其引用值压入栈顶
multianewarray 创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶
getfield 获取指定类的实例域,并将其值压入栈顶
putfield 为指定的类的实例域赋值
getstatic 获取指定类的静态域,并将其值压入栈顶
putstatic 为指定的类的静态域赋值

2.数组操作

操作码 操作数 备注
baload 将boolean或byte型数组指定索引的值推送至栈顶
caload 将char型数组指定索引的值推送至栈顶
saload 将short型数组指定索引的值推送至栈顶
iaload 将int型数组指定索引的值推送至栈顶
laload 将long型数组指定索引的值推送至栈顶
faload 将float型数组指定索引的值推送至栈顶
daload 将double型数组指定索引的值推送至栈顶
aaload 将引用型数组指定索引的值推送至栈顶
bastore 将栈顶boolean或byte型数值存入指定数组的指定索引位置
castore 将栈顶char型数值存入指定数组的指定索引位置
sastore 将栈顶short型数值存入指定数组的指定索引位置
iastore 将栈顶int型数值存入指定数组的指定索引位置
fastore 将栈顶float型数值存入指定数组的指定索引位置
dastore 将栈顶double型数值存入指定数组的指定索引位置
aastore 将栈顶引用型数值存入指定数组的指定索引位置

3.方法调用和返回指令

调用之后的结果依旧是在操作栈的

操作码 操作数 备注
invokevirtual 用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
invokeinterface 用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokespecial 用于调用一些需要特殊处理的实例方法,包括实例初始化方法(§2.9)、私有方法和父类方法。
invokestatic 调用类方法(static方法)。
ireturn 从当前方法返回int
lreturn 从当前方法返回long
areturn 从当前方法返回对象引用
return 从当前方法返回void

4.其他操作

操作码 操作数 备注
monitorenter 获得对象的锁,用于同步方法或同步块
monitorexit 释放对象的锁,用于同步方法或同步块
athrow 抛出异常信息
jsr 跳转至指定16位offset位置,并将jsr下一条指令地址压入栈顶
jsr_w 跳转至指定32位offset位置,并将jsr_w下一条指令地址压入栈顶
goto_w 无条件跳转(宽索引)

大多数的操作码已经在这两章中介绍了,小伙伴们可以简单的对自己的程序进行编译查看下操作码(javap -help)。对于一些简单的程序就可以自己去查看。

转载于:https://juejin.im/post/5d046ff5f265da1ba9157b45

你可能感兴趣的文章
Matplot中文乱码完美解决方式
查看>>
stm32学习笔记----双串口同时打开时的printf()问题
查看>>
Java代码简化神器-Lombok
查看>>
How do I create a List in Scala?
查看>>
lintcode:移动零
查看>>
tomcat的webappclassloader中一个奇怪的异常信息
查看>>
Java语言与C++语言的差异总结
查看>>
Semaphore实现Andoird版源代码剖析
查看>>
使用gSoap规避和改动ONVIF标准类型结构的解析
查看>>
架构设计之策略模式
查看>>
hdu 5400 Arithmetic Sequence(模拟)
查看>>
求职(2015南京站获得百度、美的集团、趋势科技、华为offer)
查看>>
压测 apache ab 初探
查看>>
设计数据结构O1 insert delete和getRandom
查看>>
视图(View)与部分视图(Partial View)之间数据传递
查看>>
漫谈程序猿系列:群星闪耀的黄金时代
查看>>
使用Spring Session做分布式会话管理
查看>>
mongodb的NUMA问题
查看>>
js进阶 12-14 jquery的事件触发函数是哪两个
查看>>
网速4M等于多少KB/S,等于多少kbps
查看>>