Java字节码Instructions部分翻译

学习Java字节码时,由于机翻的效果一般,很难理解,且我在网上并没有找到类似的中文翻译,故自己制作了一份包含常用内容的翻译 原文-Wikipedia
由于制作时的个人水平限制,难免有不严谨和错误的地方出现,仍以英文版原文为准。

指令参数说明
aaloadarrayref, index → value从数组中取出引用加载到堆栈
aastorearrayref, index, value → [empty]将引用保存到数组中
aconst_nullnull压入一个null值
aload_index从local variable加载到堆栈上加载指定索引的局部变量到堆栈
anewarray_indexbyte1_indexbyte2count → arrayref创建特定类型的数组,引用通过常量池中的index指定
areturnobjectref → [empty]返回,弹出栈顶值
arraylengtharrayref → length获取数组的长度
astore_indexobjectref → [empty]将引用保存到local variable
athrowobjectref → [empty], objectref抛出error或exception,清除堆栈,保留throwable
baloadarrayref, index → value从array中加载一个byte或boolean
bipush_byte→ value将一个byte作为integer push到栈中
breakpoint 调试器的保留指令,实际类文件中没有
caloadarrayref, index → value从array中加载一个char
castorearrayref, index, value → [empty]将一个char保存到array中
checkcast_indexbyte1_indexbyte2 → objectref检测一个对象引用是否为特定类型
getfieldobjectref → value获取对象引用的某个值
getstatic→ value获取类的静态变量

数据类型运算

指令参数说明
d2f, d2i, d2lvalue → result基本数据类型转换
daddvalue1, value2 → resultdouble相加
daload, dastore同上操作double类型的array加载和保存
dcmpgvalue1, value2 → result比较double,返回1、0、-1或者NaN
dconst_0/1→ 0.0 或 1.0压入常量0.0或1.0
ddivvalue1, value2 → result除法
dload_index→ 从local variable加载到堆栈上的double类型值
dmulvalue1, value2 → result乘法
dnegvalue → result取相反数
dremvalue1, value2 → result取余数
dsubvalue1, value2 → result减法
dreturn→ [empty]返回
dstore_index→ 压栈double类型值到local variable

跳转操作

指令参数说明
if_acmpeqbranchbyte1, branchbyte2, value1, value2若两个引用相等,跳转
if_acmpnebranchbyte1, branchbyte2, value1, value2若两个引用不相等,跳转
if_icmpeqbranchbyte1, branchbyte2, value1, value2若两个int相等,跳转
if_icmpnebranchbyte1, branchbyte2, value1, value2若两个int不相等,跳转
if_icmpgebranchbyte1, branchbyte2, value1, value2若value1 >= value2,跳转
if_icmpgtbranchbyte1, branchbyte2, value1, value2若value1 > value2,跳转
if_icmplebranchbyte1, branchbyte2, value1, value2若value1 <= value2,跳转
if_icmpltbranchbyte1, branchbyte2, value1, value2若value1 < value2,跳转
ifeqbranchbyte1, branchbyte2, value值为0跳转
ifnebranchbyte1, branchbyte2, value值不为0跳转
ifgebranchbyte1, branchbyte2, value值 >= 0 跳转
ifgtbranchbyte1, branchbyte2, value值 > 0 跳转
iflebranchbyte1, branchbyte2, value值 <= 0 跳转
ifltbranchbyte1, branchbyte2, value值 < 0 跳转
ifnonnullbranchbyte1, branchbyte2, value值不为空跳转
ifnullbranchbyte1, branchbyte2, value值为空跳转
iincindex, const递增local variable const
gotobranchbyte1 << 8branchbyte2跳转到固定位置
goto_w同上,数据类型为有符号int,由四个byte构成

堆栈操作

指令参数说明
dupvalue → value, value复制栈顶的值
dup_x1value2, value1 → value1, value2, value1把栈顶值插入到栈顶下面第二个值后面,value1和value2不能是double或long
dup_x2value3, value2, value1 → value1, value3, value2, value1同上,插到第三个值后面
dup2{value2, value1} → {value2, value1}, {value2, value1}复制栈顶两个值,逻辑同上,double或long为一个值
dup2_x1类推
dup2_x2类推

动态调用(INDY)与方法调用

指令参数说明
invokedynamicindexbyte1, indexbyte2, 0, 0 [arg1, arg2, ...] → result调用动态方法并将结果压栈,方法引用通过常量池中的index指定
invokeinterfaceindexbyte1, indexbyte2, count, 0, objectref, [arg1, arg2, ...] → result执行接口方法并将结果压栈
invokespecialindexbyte1, indexbyte2, objectref, [arg1, arg2, ...] → result执行对象的特定方法,结果压栈
invokestaticindexbyte1, indexbyte2, [arg1, arg2, ...] → result执行静态方法并将结果压栈
invokevirtual同上执行virtual方法

其他操作

指令参数说明
ldc→ value将常量压栈(如String, int, float等)
monitorenterobjectref → [empty]开始synchronized块
monitorexitobjectref → [empty]结束synchronized块
newindexbyte1, indexbyte2 → objectref创建特定类的对象
nop 什么都不做
popvalue → [empty]弹出栈顶值
return

添加新评论