JAVAP反编译中助记符的含义

未归类

nop:什么都不做

aconst_null:将 null 推送至操作数栈栈顶

const

负责把整数送到操作数栈栈顶

只能操作整数型,例如 1.0,1,-1都可以操作

数值范围:-1~5

iconst_m1 :将int基础类型的数值为 -1 的数据推送至操作数栈栈顶

const_0 :将int基础类型的数值为 0 的数据推送至操作数栈栈顶

前缀:基础类型

后缀:数值

前缀含义
iint
llong
ffloat
ddouble
后缀含义
_m1数值:-1
_0~5数值:0~5
  • -1.0 ~ 5.0 也是用其操作。
  • 该助记符只能操作一定范围内的整数数值,超出该范围(-1~5)的将使用 push 命令系列。

push

负责把整数送到操作数栈栈顶

数值范围:-32768~32767

bipush 7:将整数 7 推送至操作数栈栈顶

前缀:基础类型

无后缀

前缀含义范围
bibyte int-128~127
sishort int-32768~32767
  • 该助记符只能操作一定范围内的整形数值,超出该范围(-32768~32767)的将使用 ldc 命令系列。
  • 该助记符不会操作精度高于 int 的基础类型,例如:double、float 和 long。

ldc

负责把数值(小数和整数)或 String(不包含String引用) 推送至操作数栈栈顶

超出该范围的数值会报错

操作数值范围最大的助记符

  • String引用:即new String();

ldc #2:将数值或 String 推送至操作数栈栈顶且分配的域编号为 2。

无前缀

后缀:基础类型

后缀含义
int、float 或 String(宽索引)
2_wlong 或 double
  • 宽索引:可包含足够大的序列
  • 从 #2 开始,表示第一个变量的位置
  • # :域编号,后续操作可以通过这个域编号获取内容

load

负责把本地变量表的变量(基础类型和引用类型)送到操作数栈栈顶

iload 4:将本地变量表编号为 4 的int类型的数值送到操作数栈栈顶

前缀:数据的基础类型或引用类型

后缀:本地变量表里面变量的编号 _2

前缀含义
iint
llong
ffloat
ddouble
a引用类型
  • 前缀 a 可以和前缀搭配表示引用类型的索引值的类型,例如数组 int i = {1, 0};i[0]对应前缀ia

store

负责把操作数栈栈顶的变量(基础类型和引用类型)存到本地变量表

istore 4:将操作数栈栈顶的int类型的数值存到本地变量表且分配编到的编号为 4。

前缀:数据的基础类型或引用类型

后缀:本地变量表分配到的变量的编号 _2

前缀含义
iint
llong
ffloat
ddouble
a引用类型
  • 前缀 a 可以和前缀搭配表示引用类型的索引值的类型,例如数组 int i = {1, 0};i[0]对应前缀ia

pop

负责将操作数栈栈顶的变量弹出栈

无前缀

pop:将栈顶数值弹出(变量不能是long或double类型的)

pop2:将栈顶的一个(long或double类型的)或两个变量弹出(其它)

dup

负责将操作数栈栈顶的变量复制并压入操作数栈栈顶

无前缀
无后缀

dup:将栈顶的变量(数值不能是long或double类型)复制并将其复制值压入栈

数学操作及移位

swap:执行变量的值互换操作(数值不能是long或double类型的)

iadd:执行int型的乘法操作

isub:执行int型的减法操作

imul:执行int型的乘法操作

idiv:执行int型的除法操作

irem:执行int型求余数操作

ineg:执行int型取反操作

ishr:执行int型移位操作

iand:执行int型按位与操作

ior:执行int型按位或操作

iinc:执行int型与常量int型加法操作

类型转换

负责对操作数栈栈顶数值进行基础类型转化,并将其操作后压回操作数栈栈顶

i2l:将操作数栈栈顶int型数值强制转换成long型数值并将其压回操作数栈栈顶

前缀:基础类型

后缀:基础类型

前缀含义
iint
llong
ffloat
ddouble
后缀含义
iint
llong
ffloat
ddouble

方法操作命令

用于对静态方法和非静方法进行调用

invokespecial #1 :调用超类(父类,一般指Object)构造器,并放到操作数栈栈顶分配到的域编号为 #1 来保存类信息

invoke :调用,执行

无前缀

后缀:方法的类型

后缀含义
special超类构造方法,实例初始化方法,私有方法
virtual实例方法
static静态方法
interface接口方法

实例初始化方法和实例方法之间是否有区别?

实例方法:需要从操作数栈栈顶弹出一个this引用(指之前入栈的对象地址)。

实例初始化方法:包括实例方法,会调用 class.<init>() 方法。

域操作指令

用于对静态域和非静态域进行读写

getstatic #4:获取域编号为 4 的静态域将其值压入操作数栈栈顶

前缀:操作方法

后缀:域空间类型

前缀含义
get获取指定域并将其值压栈
put用栈顶的值为指定域赋值
后缀含义
static静态域
field实例域

静态域:静态方法、静态类和静态属性

实例域:对象实例


如果你是无意刷到这篇文章并看到这里,希望你给我的文章来一个赞赞👍👍。如果你不同意其中的内容或有什么问题都可以在下方评论区留下你的想法或疑惑,谢谢你的支持!!😀😀

参考文献

  1. JVM指令详解_温水青蛙-CSDN博客_jvm 指令
  2. Java SE Specifications (oracle.com)
  3. Chapter 2. The Structure of the Java Virtual Machine (oracle.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hjhcos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值