一、未归类系列A
此系列暂未归类。
指令码 助记符 说明
0x00 nop 什么都不做
0x01 aconst_null 将null推送至栈顶
二、const系列
该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈顶时,才使用如下的命令。
比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3,iconst_4, iconst_5)送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)。
指令码 助记符 说明
0x02 iconst_m1 将int型(-1)推送至栈顶
0x03 iconst_0 将int型(0)推送至栈顶
0x04 iconst_1 将int型(1)推送至栈顶
0x05 iconst_2 将int型(2)推送至栈顶
0x06 iconst_3 将int型(3)推送至栈顶
0x07 iconst_4 将int型(4)推送至栈顶
0x08 iconst_5 将int型(5)推送至栈顶
0x09 lconst_0 将long型(0)推送至栈顶
0x0a lconst_1 将long型(1)推送至栈顶
0x0b fconst_0 将float型(0)推送至栈顶
0x0c fconst_1 将float型(1)推送至栈顶
0x0d fconst_2 将float型(2)推送至栈顶
0x0e dconst_0 将double型(0)推送至栈顶
0x0f dconst_1 将double型(1)推送至栈顶
三、push系列
该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。
注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc命令系列。
指令码 助记符 说明
0x10 bipush 将单字节的常量值(-128~127)推送至栈顶
0x11 sipush 将一个短整型常量值(-32768~32767)推送至栈顶
四、ldc系列
该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面需要给一个表示常量在常量池中位置(编号)的参数,哪些常量是放在常量池呢?比如:final static int id=32768;final static float double=6.5。
对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中.
另外,所有不是通过new创建的String都是放在常量池中的。
指令码 助记符 说明
0x12 ldc 将int, float或String型常量值从常量池中推送至栈顶
0x13 ldc_w 将int, float或String型常量值从常量池中推送至栈顶(宽索引)
0x14 ldc2_w 将long或double型常量值从常量池中推送至栈顶(宽索引)
五、load系列
5.1、load系列A
该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型,还可以是引用类型。
对于前四个本地变量可以采用iload_0,iload_1,iload_2,iload_3(它们分别表示第0,1,2,3个整形变量)这种不到参数的简化命令形式。
对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示是对第几个(从0开始)本类型的本地变量进行操作。
对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。
对于非静态函数,第一变量是this,即其对于的操作是aload_0.还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。
指令码 助记符 说明
0x15 iload 将指定的int型本地变量推送至栈顶
0x16 lload 将指定的long型本地变量推送至栈顶
0x17 fload 将指定的float型本地变量推送至栈顶
0x18 dload 将指定的double型本地变量推送至栈顶
0x19 aload 将指定的引用类型本地变量推送至栈顶
0x1a iload_0 将第一个int型本地变量推送至栈顶
0x1b iload_1 将第二个int型本地变量推送至栈顶
0x1c load_2 将第三个int型本地变量推送至栈顶
0x1d iload_3 将第四个int型本地变量推送至栈顶
0x1e lload_0 将第一个long型本地变量推送至栈顶0x1f lload_1 将第二个long型本地变量推送至栈顶
0x20 lload_2 将第三个long型本地变量推送至栈顶
0x21 lload_3 将第四个long型本地变量推送至栈顶
0x22 fload_0 将第一个float型本地变量推送至栈顶
0x23 fload_1 将第二个float型本地变量推送至栈顶
0x24 fload_2 将第三个float型本地变量推送至栈顶
0x25 fload_3 将第四个float型本地变量推送至栈顶
0x26 dload_0 将第一个double型本地变量推送至栈顶
0x27 dload_1 将第二个double型本地变量推送至栈顶
0x28 dload_2 将第三个double型本地变量推送至栈顶
0x29 dload_3 将第四个double型本地变量推送至栈顶
0x2a aload_0 将第一个引用类型本地变量推送至栈顶
0x2b aload_1 将第二个引用类型本地变量推送至栈顶
0x2c aload_2 将第三个引用类型本地变量推送至栈顶
0x2d aload_3 将第四个引用类型本地变量推送至栈顶
5.2、load系列B
该系列命令负责把数组的某项送到栈顶。该命令根据栈里内容来确定对哪个数组的哪项进行操作。
比如,如果有成员变量:final String names[]={"robin","hb"};
那么这句话:String str=names[0];对应的指令为
17:aload_0 //将this引用推送至栈顶,即压入栈。
18:getfield#5; //Field names:[Ljava/lang/String;//将栈顶的指定的对象的第5个实例域(Field)的值(这个值可能是引用,这里就是引用)压入栈顶
21:iconst_0 //数组的索引值(下标)推至栈顶,即压入栈
22:aaload //根据栈里内容来把name数组的第一项的值推至栈顶
23:astore5 //把栈顶的值存到str变量里。因为str在我的程序中是其所在非静态函数的第5个 变量(从0开始计数)。
指令码 助记符 说明
0x2e iaload 将int型数组指定索引的值推送至栈顶
0x2f laload 将long型数组指定索引的值推送至栈顶
0x30 faload 将float型数组指定索引的值推送至栈顶
0x31 daload 将double型数组指定索引的值推送至栈顶0x32 aaload 将引用型数组指定索引的值推送至栈顶
0x33 baload 将boolean或byte型数组指定索引的值推送至栈顶
0x34 caload 将char型数组指定索引的值推送至栈顶
0x35 saload 将short型数组指定索引的值推送至栈顶
内推
欢迎加入RELX团队,团队成员大牛云集,有一群热爱技术,期望用技术推动业务的小伙伴。