标签:float java int double 局部变量 long 手册 反汇编 类型
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类型值存入局部变量0 |
istore_1 |
将int类型值存入局部变量1 |
istore_2 |
将int类型值存入局部变量2 |
istore_3 |
将int类型值存入局部变量3 |
lstore_0 |
将long类型值存入局部变量0 |
lstore_1 |
将long类型值存入局部变量1 |
lstore_2 |
将long类型值存入局部变量2 |
lstore_3 |
将long类型值存入局部变量3 |
fstore_0 |
将float类型值存入局部变量0 |
fstore_1 |
将float类型值存入局部变量1 |
fstore_2 |
将float类型值存入局部变量2 |
fstore_3 |
将float类型值存入局部变量3 |
dstore_0 |
将double类型值存入局部变量0 |
dstore_1 |
将double类型值存入局部变量1 |
dstore_2 |
将double类型值存入局部变量2 |
dstore_3 |
将double类型值存入局部变量3 |
astore_0 |
将引用类型或returnAddress类型值存入局部变量0 |
astore_1 |
将引用类型或returnAddress类型值存入局部变量1 |
astore_2 |
将引用类型或returnAddress类型值存入局部变量2 |
astore_3 |
将引用类型或returnAddress类型值存入局部变量3 |
iastore |
将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 |
从方法中返回,返回值为void |
7.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命令进行反汇编
我们主要解读下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;执行完毕
标签:float,
java,
int,
double,
局部变量,
long,
手册,
反汇编,
类型
From: https://www.cnblogs.com/MC-Bonnie/p/18160197