您的位置:首页 > 编程语言 > Java开发

java虚拟机分析-字节码指令集

2015-11-17 14:59 357 查看
等待是一种煎熬,也是一种成长。

类相关的JVM指令

checkcast class 检查类型转换,检验未通过将抛出ClassCastException

getfield class/field desc 获取指定类的实例域,并将其值压入栈顶

getstatic class/field desc 获取指定类的静态域,并将其值压入栈顶

instanceof class 检验对象是否是指定类的实例,如果是将1压入栈顶,否则将0压入栈顶

new class 创建一个对象,并将其引用值压入栈顶

方法的定义

public static main ([Ljava/lang/String;]V
上述方法的描述中main表示方法名,[代表数组,L代表是一个类形式而不是基本数据类型,凡是L表示的类后面都会以分号结尾,V代表void
方法相关的JVM指令
invokeinterface class/method desc n 调用接口方法
invokespecial class/method desc 调用超类构造方法,实例初始化方法或私有方法
invokestatic
class/method desc 调用静态方法
invokevitual
class/method desc 调用实例方法

属性的定义
数组
[

L;

与栈操作相关的指令集
dup
将当前的栈顶元素复制一份,并压入栈中
dup_x1
复制栈顶数值并将两个复制值压入栈顶
dup_x2
复制栈顶数值并将三个(或2个)复制值压入栈顶
dup2
复制栈顶一个(long或double)或两个(其他)数值并将复制值压入栈顶
dup2_x1
a,{b,c}复制成{b,c},a,{b,c}
dup2_x2
{d,c},{b,a}复制成{b,a},{d,c},{b,a}
pop
从当前栈顶出栈一个元素
pop2
将栈顶的一个long或double类型的或两个其他数值从栈顶弹出
swap
将栈顶两个非long或者double类型的数值交换

与本地变量操作相关
aload
n 将当前本地变量n放入栈顶中,变量n是引用
aload_0
将当前本地变量0放入栈顶中,变量0是一个引用
aload_1
将当前本地变量1放入栈顶中,变量1是一个引用
aload_2
将当前本地变量2放入栈顶中,变量2是一个引用
astore
n 将栈顶元素存入本地变量n中,变量n是一个引用
astore_0
将栈顶元素存入本地变量0中,变量0是一个引用
astore_1
将栈顶元素存入本地变量1中,变量1是一个引用
astore_2
将栈顶元素存入本地变量2中,变量2是一个引用
dload
将当前本地变量n放入栈顶中,变量n是一个double类型
dstore
将栈顶元素存入本地变量n中,变量n是一个double类型
iinc
将指定int型变量增加指定值
iload
将当前本地变量n放入栈顶中,变量n时一个int类型
iload_0
将当前本地变量0放入栈顶中,变量0是一个int类型
iload_1
将当前本地变量1放入栈顶中,变量1是一个int类型
istore_0
将栈顶元素存入本地变量0中,变量0是一个int类型
istore_1
将栈顶元素存入本地变量1中,变量1是一个int类型

与运算相关
dadd
将栈顶两个double型数值相加,结果压入栈顶
dcmpg
比较栈顶两个double类型数值大小,并将结果1,0,-1压入栈顶,当其中一个数值为NaN时,将1压入栈顶
ddiv
栈顶两个double类型数据相除,结果压入栈顶
dmul
栈顶两个double类型数据相乘,结果压入栈顶
dneg
将栈顶double类型数据取负,结果压入栈顶
drem
将栈顶两个double可惜数据做取模运算,结果压入栈顶
dsub
将栈顶两个double类型数值相减,结果压入栈顶
fadd
将栈顶两个float型数值相加,结果压入栈顶
....
i2b
将栈顶的int类型数值强制转换成byte类型数值,结果压入栈顶
i2c
将栈顶的int类型数值强制转换成char类型数值,结果压入栈顶
i2s
将栈顶int类型数值强制转换成short类型数值,结果压入栈顶
ior
将栈顶两个int类型数值相或,结果压入栈顶
ishl
将int类型数值左移指定位数,结果压入栈顶
ishr
将int类型数值右移指定位数,结果压入栈顶
iushr
将无符号int类型数值右移指定位数,结果压入栈顶
ixor
将栈顶两个int类型数值按位异或,结果压入栈顶
land
将栈顶两个long类型数值相与,结果入栈顶

常量操作相关
aconst_null
将null压入栈顶
bipush
将单字节的常量值-128到127压入栈顶
dconst_0
向栈顶压入一个double常量0
dconst_1
向栈顶压入一个double常量1
fconst_0
向栈顶压入一个float常量0
ldc
将int,float,或String类型常量值从常量池中压入栈中
ldc_w
将int,float或String类型常量值从常量池中压入栈中(宽索引)
sipush
将一个短整型常量值-32768--32767压入栈顶

ava控制指令
areturn
返回一个引用
dreturn
返回一个double类型数据
freturn
返回一个float类型数据
goto
跳转到指定的偏移地址对应的指令
if_acmpeq
比较栈顶的两引用型数值,当结果相等时跳转
iflt
当栈顶int类型数值小于0时跳转
jsr
跳转至指定16位label位置,并将jsr下一条指令地址压入栈顶
lookupswitch
用于switch条件跳转
nop
什么都不做
ret
返回至本地变量指定的n的指令位置,一般与jsr联合使用

Java同步操作相关
monitorenter
获得对象的锁,用于同步方法或同步块
monitorexit
释放对象的锁,用于同步方法或同步块

java数组相关操作
aaload
将引用型数值指定索引的值压入栈顶
aastore
将栈顶引用型数值存入指定数组的指定索引位置
anewarray
创建一个引用型,如类,接口,数组的数组,并将其引用值压入栈顶
arraylength
获取数组的长度值并压入栈顶
athrow
将栈顶的异常抛出
baload
将boolean或byte类型数组指定索引的值压入栈顶
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: