操作码1:栈和局部变量操作

来源:互联网 发布:淘宝不能缴纳保证金吗 编辑:程序博客网 时间:2024/06/05 18:55

int和float都是一个字长的值,Java栈的每个位置的长度都是一个字长(至少32位宽),每当一个int或者float类型被压入栈时,它都将占据一个位置。

iconst_ml 将int类型值-1压入栈

iconst_0   将int类型值0压入栈

iconst_1   将int类型值1压入栈

iconst_2将int类型值2压入栈

iconst_3 将int类型值3压入栈

iconst_4将int类型值4压入栈

iconst_5 将int类型值5压入栈

fconst_0将float类型值0压入栈

fconst_1将float类型值1压入栈

fconst_2 将float类型值2压入栈                  


long和double类型值是64位长度的值,每当一个long或者double类型的值压入栈时,都将占据2个位置

lconst_0将long类型值0压入栈

lconst_1将long类型值1压入栈

dconst_0将double类型值0压入栈

dconst_1将double类型值1压入栈


空对象处理

aconst_null将空(null)对象引用压入栈


byte或者short类型在压入栈之前被扩展成int类型值

bipush byte1 将byte1转换为int类型,然后压入栈

sipush byte1,byte2将byte1和byte2转换为int类型,然后压入栈


常量池入口压入栈

常量池索引是一个无符号值,它在字节码流中直接跟随在操作码后面,ldc和ldc_w把一个字长的项压入栈,该项或者是一个int类型,float类型的值,或者是一个String类型的对象引用

ldc indexbyte1                                       从由indexbyte1指向的常量池入口取出一个字长的值,然后压入栈

ldc_w indexbyte1,indexbyte2             从由indexbyte1和indexbyte2指向的常量池入口取出一个字长的值,然后压入栈

ldc1_w indexbyte1,indexbyte2          从由indexbyte1和indexbyte2指向的常量池入口中取出两个字长的值,然后压入栈


通用栈操作

nop 不做任何操作

pop从操作数栈中弹出栈顶部的一个字

pop2从操作数栈中弹出最顶端的两个字

swap交换栈顶部的两个字

dup复制栈顶部的一个字

dup2复制栈顶部的两个字

dup_x1复制栈顶的一个字,并将复制内容及原来弹出的两个字长的内容压入栈

dup_x2复制栈顶的一个字,并将复制内容及原来弹出的三个字长的内容压入栈

dup2_x1复制操作数栈的两个字,并将复制内容及原来弹出的三个字长的内容压入栈

dup2_x2复制操作数栈的两个字,并将复制内容及原来弹出的四个字长的内容压入栈


将一个字长的局部变量压入栈

iload videx将为之为vindex的int类型局部变量压入栈

iload_0将位置为0的int类型局部变量压入栈

iload_1将位置为1的int类型局部变量压入栈

iload_2将位置为2的int类型局部变量压入栈

iload_3将位置为3的 int类型局部变量压入栈

fload vindex将位置为vindex的float类型局部变量压入栈

fload_0将位置为0的float类型局部变量压入栈

fload_1将位置为1的flaot类型局部变量压入栈

fload_2将位置为2的float类型局部变量压入栈

fload_3将位置为3的float类型局部变量压入栈

两个字长的局部变量

lload vindex 将位置vindex和vindex+1的long类型压入栈

lload_0            0和1

lload_1          1和2

lload_2           2和3

lload_3              3和4

dload vindex 将位置vindex和vindex+1的double类型局部变量压入栈

引用变量

aload vindex 将位置为vindex的对象局部变量压入栈

aload_0

aload_1

aload_2

aload_3


弹出栈顶部元素,将其赋给局部变量

istore vindex从栈中弹出int类型值,然后将其存到位置为vindex的局部变量中

istore_0从栈中弹出int类型值,然后保存到位置为0的局部变量中

istore_1

istore_2

istore_3

fstore vindex

fstore_0

fstore_1

fstore_2

fstore_3

lstore vindex从栈中弹出long类型值,然后将其存在位置为vindex和vindex+1的局部变量中

lstore_0

lstore_1

lstore_2

dstore

dstore_0

dstore_1

dstore_2

dstore_3

astore vindex从栈中弹出对象引用,然后将其存在位置为vindex的局部变量中

astore_0

astore_1

astore_2

astore_3


wide 无符号8位局部变量索引(普通指令后的索引),把方法中局部变量数限制在256以下,一条单独的wide的指令可以将8位的索引再扩展8位,这样就可以把对局部变量扩展到65536,跟随在wide操作码和修改过的操作码之后的两个字节组成指向局部变量的16位无符号索引

wide iload indexbyte1,indexbyte2从局部变量位置为index的地方取出int类型值,压入栈

wide lload

wide fload

wide dload

wide aload

wide istore从栈中弹出int类型值,然后将其压入位置为index的局部变量中

wide lstore

wide fstore

wide dstore

wide astore



0 0