java sipush_Java逆向基础之常量入栈指令

常量入栈指令有iconst、bipush、sipush、ldc、ldc2_w分别对应不同的使用场景

以下两个表简单总结了使用场景

八大基本类型场景表常量类型常量范围指令

整型int-1~5iconst_0~ iconst_5

iconst_m1

-128~127bipush

-32768~32767sipush

-2147483648~2147483647#2 = Integer 12345678

0: ldc #2 // int 12345678

布尔型booleantrueiconst_1

falseiconst_0

短整型short-1~5iconst_0~ iconst_5

iconst_m1

-128~127bipush

-32768~32767sipush

字符型char\u0000~\u0005iconst_0~ iconst_5

\u0000~\u00FFbipush

\u0000~\uFFFFsipush

字节型byte-1~5iconst_0~ iconst_5

iconst_m1

-128~127bipush

长整型long-2^63~2^63-1#2 = Long 1234567890123456789l

ldc2_w #2 // long 1234567890123456789l

浮点型double8字节#2 = Double 123.456d

ldc2_w  #2  // double 123.456d

浮点型float4字节#2 = Float 123.456f

ldc #2 // float 123.456f

指令场景表指令使用场景

iconstint,short,byte,int(char a)数值在-1~5之间,boolean类型,注意不包括long

bipushint,short,byte,int(char a)数值在-128~127之间,注意不包括long,范围内的值在iconst之内的优先用iconst

sipushint,short,int(char a)数值在-32768~32767之间,boolean类型,注意不包括long,范围内的值在bipush之内的优先用bipush

ldcint的数值-2147483648~2147483647之间(范围内的值在sipush之内的优先用sipush),float类型

ldc2_wlong类型,double类型

以下是简单的例子

整型常量0的例子iconstpublic class ret{public static int main(String[] args){return 0;}}

编译javac ret.java

Java标准反编译javap -c -verbose ret.class...major version: 52...public static int main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: iconst_01: ireturnLineNumberTable:line 5: 0

注意其中的0: iconst_0即可

整型常量123的例子bipushpublic class ret{public static int main(String[] args){return 123;}}

反编译...major version: 52...public static int main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: bipush        1232: ireturnLineNumberTable:line 5: 0

注意其中的0: bipush        123

整型常量1234的例子sipushpublic class ret{public static int main(String[] args){return 1234;}}

反编译...major version: 52...public static int main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: sipush        12343: ireturnLineNumberTable:line 5: 0

注意其中的 0: sipush        1234

整型常量12345678的例子ldcpublic class ret{public static int main(String[] args){return 12345678;}}

反编译...major version: 52...#2 = Integer            12345678...public static int main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: ldc           #2                  // int 123456782: ireturnLineNumberTable:line 5: 0

布尔型true例子iconstpublic class ret{public static boolean main(String[] args){return true;}}

反编译...major version: 52...public static boolean main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Zflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: iconst_11: ireturnLineNumberTable:line 5: 0

注意0: iconst_1即ture用常量1表示

短整型short例子public class ret{public static short main(String[] args){return 1234;}}

反编译...major version: 52...public static short main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Sflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: sipush        12343: ireturnLineNumberTable:line 5: 0

注意0: sipush        1234

字符型A例子public class ret{public static char main(String[] args){return 'A';}}

反编译...major version: 52...public static char main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Cflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: bipush        652: ireturnLineNumberTable:line 5: 0

注意0: bipush        65

字符型中例子public class ret{public static char main(String[] args){return '中';}}

反编译...major version: 52...public static char main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Cflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: sipush        200133: ireturnLineNumberTable:line 5: 0

注意0: sipush        20013

byte类型123列子public class ret{public static byte main(String[] args){return 123;}}

反编译...major version: 52...public static byte main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Bflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: bipush        1232: ireturnLineNumberTable:line 5: 0

注意 0: bipush        123

long类型1234567890123456789L例子public class ret{public static long main(String[] args){return 1234567890123456789l;}}

反编译...major version: 52...#2 = Long               1234567890123456789l...public static long main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Jflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: ldc2_w        #2                  // long 1234567890123456789l3: lreturnLineNumberTable:line 5: 0

注意0: ldc2_w        #2                  // long 1234567890123456789l

浮点类型123.456d的例子public class ret{public static double main(String[] args){return 123.456d;}}

反编译...major version: 52...#2 = Double             123.456d...public static double main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Dflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: ldc2_w        #2                  // double 123.456d3: dreturnLineNumberTable:line 5: 0

注意0: ldc2_w        #2                  // double 123.456d

浮点类型123.456f的例子public class ret{public static float main(String[] args){return 123.456f;}}

反编译...major version: 52...#2 = Float              123.456f...public static float main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Fflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=1, args_size=10: ldc           #2                  // float 123.456f2: freturnLineNumberTable:line 5: 0

注意0: ldc           #2                  // float 123.456f

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值