《深入Java虚拟机》笔记:指令集

指令含义
iconst_m1把int型常量-1压入栈中
iconst_0把int型常量压入栈中
fconst_1把float型常量1压入栈中
lconst_2把long型常量2压入栈中
dconst_3把double型常量3压入栈中
bipush byte1把byte1转换成int型压入栈中
sipush byte1,byte2把byte1,byte2组成的short转换成int压入栈中
aconst_null把空对象压入栈中
ldc indexbyte1把常量池中指定下标的一个字长压入栈
ldc_w indexbyte1,indexbyte2把常量池中指定下标的一个字长压入栈
ldc2_w indexbyte1,intexbyte2把常量池中指定下标的两个字长压入栈
pop弹出栈顶的一个字
pop2弹出栈顶的两个字
swap交换栈顶的两个字
dup复制栈顶的一个字
dup2复制栈顶的两个字
dup_x1复制一字,并将弹出的两字压栈
dup_x2复制一字,并将弹出的三字压栈
dup2_x1复制两字,并将弹出的三字压栈
dup2_x2复制两字,并将弹出的四字压栈
iload vindex将位置vindex的int型局部变量压入栈
iload_0将位置0的int型局部变量压入栈
fload vindex将位置vindex的float型局部变量压入栈
fload_0将位置0的float型局部变量压入栈
lload vindex将位置vindex的long型局部变量压入栈
lload_0将位置0的long型局部变量压入栈
dload vindex将位置vindex的double型局部变量压入栈
dload_0将位置0的double型局部变量压入栈
aload vindex将位置vindex的对象引用局部变量压入栈
aload_0将位置0的对象引用局部变量压入栈
istore vindex弹出int型,存储在vindex处的局部变量
istore_0
弹出int型,存储在0处的局部变量
fstore vindex弹出float型,存储在vindex处的局部变量
fstore_0弹出float型,存储在0处的局部变量
lstore vindex弹出long型,存储在vindex处的局部变量
lstore_0弹出long型,存储在0处的局部变量
dstore vindex弹出double型,存储在vindex处的局部变量
dstore_0弹出double型,存储在0处的局部变量
astore vindex弹出对象引用类型,存储在vindex处的局部变量
astore_0弹出对象引用类型,存储在0处的局部变量
wide iload byte1,byte2wide能把原来的一字节的参数变成处理两字节
i2l把int类型转换成long类型,其他类似,不再举例
iadd弹出两个int型,相加后结果压入栈
ladd弹出两个long型,相加后结果压入栈
iinc vindex,const把常量const与位于vindex的局部变量相加
wide iinc index1,intdex2,const1,const2把常量与位于vindex1,vindex2的局部变量相加
isub弹出两个int型,相lint结果压入栈
lsub弹出两个long型,相减后long型结果压入栈
imul弹出两个int型,相乘后int结果压入栈
lmul弹出两个long型,相乘后long型结果压入栈
idev弹出两个int型,相后int结果压入栈
ldev弹出两个long型,相除后long型结果压入栈
irem弹出两个int型,取余后int结果压入栈
lrem弹出两个long型,取余后long型结果压入栈
ineg弹出一个int型,取反后int结果压入栈
lneg弹出一个long型,取反后long结果压入栈
ishl向左对int型值进行移位操作(long类似)
ishr向右对int型值进行算术移位操作
iushr向右对int型值进行逻辑移位操作
iand对两个int类型值进行逻辑与运算(long类似)
ior对两个int类型值进行逻辑或运算
ixor对两个int类型值进行逻辑异或运算
fadd弹出两个float型,相float结果压入栈
fsub弹出两个float型,相float结果压入栈
fmul弹出两个float型,相float结果压入栈
fdiv弹出两个float型,相float结果压入栈 
frem弹出两个float型,取余后float结果压入栈
new indexbyte1,indexbyte2在堆中创建一个新的对象,将其压入栈中
putfield indexbyte1,intdebyte2设置对象字段的值,值和对象引用都从栈获取
getfield indexbyte1,indexbyte2将对象字段压入栈,对象引用从栈中获取
putstatic indexbyte1,indexbyte2设置类静态变量的值,从栈中获取
getstatic indexbyte1,indexbyte2将静态变量压入栈
checkcast indexbyte1,indexbyte2如果栈中的引用不是指定位置的类,则抛出异常
instanceof indexbyte1,indexbyte2同上,不过是往结果中压入true或false
newarray atype从栈中弹出长度,分配atype类型的数组
anewarray indexbyte1,intdexbyte2从栈中取长度,index取类型
multianewarray index1,index2,dimensions分配多维数组
arraylength从栈中弹出一个引用,并将其长度压入栈
baload从栈中取数组引用和下标,把对应boolean压入栈
caload同上,char
saload同上,short
iaload同上,int
laload同上,long
faload同上,folat
daload同上,double
aaload同上,array
bastore

将byte或boolean类型的值value、索引index、数组引用arrayref弹出栈,赋值为arrayref[index]=value

其他类型同上

ifeq branchbyte1,branchbyte2从栈中弹出int型,为0则跳转到指定的分支执行
ifne branchbyte1,branchbyte2同上,不为0则跳转到指定的分支执行
iflt branchbyte1,branchbyte2同上,如果小于0,则跳转到指定的分支执行 
ifle branchbyte1,branchbyte2同上,如果小于等于0,则跳转到指定的分支执行 
ifgt branchbyte1,branchbyte2同上,如果大于0,则跳转到指定的分支执行 
ifge branchbyte1,branchbyte2同上,如果大于等于0,则跳转到指定的分支执行 
if_icmpeq branchbyte1,branchbyte2栈中弹出两个int,如果的一个等于第二个,跳转
if_icmpme branchbyte1,branchbyte2栈中弹出两个int,如果的一个不等于第二个,跳转
if_icmplt branchbyte1,branchbyte2栈中弹出两个int,如果的一个小于第二个,跳转
if_icmple branchbyte1,branchbyte2栈中弹出两个int,如果的一个小于等于第二个,跳转
if_icmpgt branchbyte1,branchbyte2栈中弹出两个int,如果的一个大于第二个,跳转
if_icmpge branchbyte1,branchbyte2栈中弹出两个int,如果的一个大于等于第二个,跳转
lcmp从栈中弹出两个long,把结果-1、0、1放入栈
fcmpg从栈中弹出两个float,把结果-1、0、1放入栈
fcmpl从栈中弹出两个float,把结果-1、0、1放入栈
dcmpg从栈中弹出两个double,把结果-1、0、1放入栈
dcmpl从栈中弹出两个double,把结果-1、0、1放入栈
ifnull branchbyte1,branchbyte2从栈中弹出,如果是null就跳到分支
ifnonnull branchbyte1,branchbyte2从栈中弹出,如果不是null就跳到分支

 

转载于:https://www.cnblogs.com/ggzwtj/archive/2012/03/26/2418634.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值