雁过留声 发表于 2024-5-18 11:14:34

java反汇编命令手册

1. 栈和局部变量操作

1.1将常量压入栈的指令

指令功能描述aconst_null将null对象引用压入栈iconst_m1将将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压入栈lconst_0将long类型常量0压入栈lconst_1将long类型常量1压入栈fconst_0将float类型常量0压入栈fconst_1将float类型常量1压入栈dconst_0将double类型常量0压入栈dconst_1将double类型常量1压入栈bipush将一个8位带符号整数压入栈sipush将16位带符号整数压入栈ldc把常量池中的项压入栈ldc_w把常量池中的项压入栈(利用宽索引)ldc2_w把常量池中long类型或者double类型的项压入栈(利用宽索引)1.2 从栈中的局部变量中装载值的指令

指令功能描述iload从局部变量中装载int类型值lload从局部变量中装载long类型值fload从局部变量中装载float类型值dload从局部变量中装载double类型值aload从局部变量中装载引用类型值(refernce)iload_0从局部变量0中装载int类型值iload_1从局部变量1中装载int类型值iload_2从局部变量2中装载int类型值iload_3从局部变量3中装载int类型值lload_0从局部变量0中装载long类型值lload_1从局部变量1中装载long类型值lload_2从局部变量2中装载long类型值lload_3从局部变量3中装载long类型值fload_0从局部变量0中装载float类型值fload_1从局部变量1中装载float类型值fload_2从局部变量2中装载float类型值fload_3从局部变量3中装载float类型值dload_0从局部变量0中装载double类型值dload_1从局部变量1中装载double类型值dload_2从局部变量2中装载double类型值dload_3从局部变量3中装载double类型值aload_0从局部变量0中装载引用类型值aload_1从局部变量1中装载引用类型值aload_2从局部变量2中装载引用类型值aload_3从局部变量3中装载引用类型值iaload从数组中装载int类型值laload从数组中装载long类型值faload从数组中装载float类型值daload从数组中装载double类型值aaload从数组中装载引用类型值baload从数组中装载byte类型或boolean类型值caload从数组中装载char类型值saload从数组中装载short类型值1.3 将栈中的值存入局部变量的指令

指令功能描述istore将int类型值存入局部变量lstore将long类型值存入局部变量fstore将float类型值存入局部变量dstore将double类型值存入局部变量astore将将引用类型或returnAddress类型值存入局部变量istore_0将int类型值存入局部变量0istore_1将int类型值存入局部变量1istore_2将int类型值存入局部变量2istore_3将int类型值存入局部变量3lstore_0将long类型值存入局部变量0lstore_1将long类型值存入局部变量1lstore_2将long类型值存入局部变量2lstore_3将long类型值存入局部变量3fstore_0将float类型值存入局部变量0fstore_1将float类型值存入局部变量1fstore_2将float类型值存入局部变量2fstore_3将float类型值存入局部变量3dstore_0将double类型值存入局部变量0dstore_1将double类型值存入局部变量1dstore_2将double类型值存入局部变量2dstore_3将double类型值存入局部变量3astore_0将引用类型或returnAddress类型值存入局部变量0astore_1将引用类型或returnAddress类型值存入局部变量1astore_2将引用类型或returnAddress类型值存入局部变量2astore_3将引用类型或returnAddress类型值存入局部变量3iastore将int类型值存入数组中lastore将long类型值存入数组中fastore将float类型值存入数组中dastore将double类型值存入数组中aastore将引用类型值存入数组中bastore将byte类型或者boolean类型值存入数组中castore将char类型值存入数组中sastore将short类型值存入数组中wide指令wide利用附加字节扩展局部变量索引1.4 通用(无类型)栈操作

指令功能描述nop不做任何操作pop弹出栈顶端一个字长的内容pop2弹出栈顶端两个字长的内容dup复制栈顶部一个字长内容dup_x1复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈dup_x2复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈dup2复制栈顶部两个字长内容dup2_x1复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈dup2_x2复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈swap交换栈顶部两个字长内容2. 类型转换

指令功能描述i2l把int类型的数据转化为long类型i2f把int类型的数据转化为float类型i2d把int类型的数据转化为double类型l2i把long类型的数据转化为int类型l2f把long类型的数据转化为float类型l2d把long类型的数据转化为double类型f2i把float类型的数据转化为int类型f2l把float类型的数据转化为long类型f2d把float类型的数据转化为double类型d2i把double类型的数据转化为int类型d2l把double类型的数据转化为long类型d2f把double类型的数据转化为float类型i2b把int类型的数据转化为byte类型i2c把int类型的数据转化为char类型i2s把int类型的数据转化为short类型3. 整数运算

指令功能描述iadd执行int类型的加法ladd执行long类型的加法isub执行int类型的减法lsub执行long类型的减法imul执行int类型的乘法lmul执行long类型的乘法idiv执行int类型的除法ldiv执行long类型的除法irem计算int类型除法的余数lrem计算long类型除法的余数ineg对一个int类型值进行取反操作lneg对一个long类型值进行取反操作iinc把一个常量值加到一个int类型的局部变量上4. 逻辑运算

4.1 移位操作

指令功能描述ishl执行int类型的向左移位操作lshl执行long类型的向左移位操作ishr执行int类型的向右移位操作lshr执行long类型的向右移位操作iushr执行int类型的向右逻辑移位操作lushr执行long类型的向右逻辑移位操作4.2 按位布尔运算

指令功能描述iand对int类型值进行land对long类型值进行“逻辑与”操作ior对int类型值进行“逻辑或”操作lor对long类型值进行“逻辑或”操作ixor对int类型值进行“逻辑异或”操作lxor对long类型值进行“逻辑异或”操作4.3 浮点运算

指令功能描述fadd执行float类型的加法dadd执行double类型的加法fsub执行float类型的减法dsub执行double类型的减法fmul执行float类型的乘法dmul执行double类型的乘法fdiv执行float类型的除法ddiv执行double类型的除法frem计算float类型除法的余数drem计算double类型除法的余数fneg将一个float类型的数值取反dneg将一个double类型的数值取反5. 对象和数组

指令功能描述5.1 对象操作指令

指令功能描述new创建一个新对象checkcast确定对象为所给定的类型getfield从对象中获取字段putfield设置对象中字段的值getstatic从类中获取静态字段putstatic设置类中静态字段的值instanceof判断对象是否为给定的类型5.2 数组操作指令

指令功能描述newarray分配数据成员类型为根本上数据类型的新数组anewarray分配数据成员类型为引用类型的新数组arraylength获取数组长度multianewarray分配新的多维数组6. 控制流

指令功能描述6.1 条件分支指令

指令功能描述ifeq如果即是0,则跳转ifne如果不即是0,则跳转iflt如果小于0,则跳转ifge如果大于即是0,则跳转ifgt如果大于0,则跳转ifle如果小于即是0,则跳转if_icmpcq如果两个int值相等,则跳转if_icmpne如果两个int类型值不相等,则跳转if_icmplt如果一个int类型值小于另外一个int类型值,则跳转if_icmpge如果一个int类型值大于或者即是另外一个int类型值,则跳转if_icmpgt如果一个int类型值大于另外一个int类型值,则跳转if_icmple如果一个int类型值小于或者即是另外一个int类型值,则跳转ifnull如果即是null,则跳转ifnonnull如果不即是null,则跳转if_acmpeq如果两个对象引用相等,则跳转if_acmpnc如果两个对象引用不相等,则跳转6.2 比较指令

指令功能描述lcmp比较long类型值fcmpl比较float类型值(当遇到NaN时,返回-1)fcmpg比较float类型值(当遇到NaN时,返回1)dcmpl比较double类型值(当遇到NaN时,返回-1)dcmpg比较double类型值(当遇到NaN时,返回1)6.3 无条件转移指令

指令功能描述goto无条件跳转goto_w无条件跳转(宽索引)6.4 表跳转指令

指令功能描述tableswitch通过索引访问跳转表,并跳转lookupswitch通过键值匹配访问跳转表,并执行跳转操作6.5 非常

指令功能描述athrow抛出非常或错误finally子句jsr跳转到子例程jsr_w跳转到子例程(宽索引)rct从子例程返回7. 方法调用与返回

7.1 方法调用指令

指令功能描述invokcvirtual运行时按照对象的类来调用实例方法invokespecial根据编译时类型来调用实例方法invokestatic调用类(静态)方法invokcinterface调用接口方法7.2 方法返回指令

指令功能描述ireturn从方法中返回int类型的数据lreturn从方法中返回long类型的数据freturn从方法中返回float类型的数据dreturn从方法中返回double类型的数据areturn从方法中返回引用类型的数据return从方法中返回,返回值为void7.3 线程同步

指令功能描述montiorenter进入并获取对象监视器monitorexit释放并退出对象监视器如何根据以上指令手册翻译java源码呢?

起首新建一个java类,这里用DemoForJavap.java举个例,源码如下:

package com.example.demo;

public class DemoForJavap{

        public int add(){
                int a = 1;
                int b = 2;
                int c = a+b;
                return c;
        }
}利用javac命令编译成class文件后用javap -c命令进行反汇编

https://img2024.cnblogs.com/blog/3436775/202404/3436775-20240426152829894-883362726.jpg
我们主要解读下add这个方法中的汇编码:

public int add();
    Code:
       0: iconst_1      //将int类型常量1压入操作数栈
       1: istore_1                //将int类型值存入局部变量1,此处相当于int a=1;执行完毕
       2: iconst_2                //将int类型常量2压入操作数栈
       3: istore_2                //将int类型值存入局部变量2,此处相当于int b=2;执行完毕
       4: iload_1                //从局部变量1中装载int类型值
       5: iload_2                //从局部变量2中装载int类型值
       6: iadd                        //执行int类型的加法
       7: istore_3                //将int类型值存入局部变量3,此处相当于int c=a+b;执行完毕
       8: iload_3                //从局部变量3中装载int类型值
       9: ireturn                //从方法中返回int类型的数据,此处相当于return c;执行完毕
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java反汇编命令手册