JAVA操做码相关指令介绍(2)

上一章介绍了JAVA一些基础类型转化以及局部变量的入栈等操做JAVA操做码相关指令介绍(1)。这章继续给你们介绍下字节码命令。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.数值之间相减

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

操做码 操做数 备注
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除,会抛出相关异常。post

操做码 操做数 备注
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.方法调用和返回指令

调用以后的结果依旧是在操做栈的code

操做码 操做数 备注
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)。对于一些简单的程序就能够本身去查看。cdn

相关文章
相关标签/搜索