常量入栈指令的功能是将常数压入操作数栈,根据数据类型和入栈内容的不同,又可以分为const系列、push系列和ldc指令。
指令const系列:
用于对特定的常量入栈,入栈的常量隐含在指令本身里。指令有:iconst_<i>(i从-1到5)、lconst_<l>(l从0到1)、fconst_<f>(f从0到2)、dconst_<d从0到1>、aconst_null。
比如:
- iconst_m1将-1压入操作数栈;
- iconst_x(x为0到5)将x压入栈;
- lconst_0、lconst_1分别将长整数0和1压入栈;
- fconst_0、fconst_1、fconst_2分别将浮点数0、1、2压入栈;
- dconst_0和dconst_1分别将double型0和1压入栈
- aconst_null将null压入操作数栈;
从指令的命名上不难找出规律,指令助记符的第一个字符总是喜欢表示数据类型,i表示整数,l表示长整数,f表示浮点数,d表示双精度浮点,习惯上用a表示对象引用。如果指令隐含操作的参数,会以下划线形式给出。
指令push系列:
主要包括bipush和sipush。它们的区别在于接收数据类型的不同,bipush接收8位整数作为参数,sipush接收16位整数,它们都将参数压入栈。
指令ldc系列:
如果以上指令都不能满足需求,那么可以使用万能的ldc
指令,它可以接收一个8位的参数,该参数指向常量池中的int、float或者String的索引,将指定的内容压入堆栈。
类似的还有ldc_w
,它接收两个8位参数,能支持的索引范围大于ldc。
如果要压入的元素是long或者double类型的,则使用ldc2_w
指令,使用方式都是类似的。
总结如下:
类型 | 常数指令 | 范围 |
---|---|---|
int(boolean,byte,char,short) | iconst | [-1,5] |
bipush | [-127,128] | |
sipush | [-32768,32767] | |
ldc | any int value | |
long | iconst | 0,1 |
ldc | any long value | |
float | fconst | 0,1,2 |
ldc | any float value | |
double | dconst | 0,1 |
ldc | any double value | |
reference | aconst | null |
ldc | String literal,Class literal |
梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。
网友评论