Java 虚拟机指令集
source link: https://www.diguage.com/post/jvm-instruction-set/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Java 虚拟机指令集
最近在研究 Java 虚拟机字节码。在 《Java虚拟机规范》 看到一个整理完整的 Java 虚拟机指令集(也叫操作码)列表。转载过来,方便查阅。
现在只是单纯转载,后续有自己的理解时,再逐步丰富内容和解释。
分类 | 操作码 | 助记符 | 指令含义 | |
---|---|---|---|---|
| 什么都不做 | |||
| 将 null 推送至栈顶 | |||
| 将 int 类型 -1 推送至栈顶 | |||
| 将 int 类型 0 推送至栈顶 | |||
| 将 int 类型 1 推送至栈顶 | |||
| 将 int 类型 2 推送至栈顶 | |||
| 将 int 类型 3 推送至栈顶 | |||
| 将 int 类型 4 推送至栈顶 | |||
| 将 int 类型 5 推送至栈顶 | |||
| 将 long 类型 0 推送至栈顶 | |||
| 将 long 类型 1 推送至栈顶 | |||
| 将 float 类型 0 推送至栈顶 | |||
| 将 float 类型 1 推送至栈顶 | |||
| 将 float 类型 2 推送至栈顶 | |||
| 将 double 类型 0 推送至栈顶 | |||
| 将 double 类型 1 推送至栈顶 | |||
| 将单字节的常量值(-128 ~ 127)推送至栈顶 | |||
| 将一个短整类型常量值(-32,768 ~ 32,767)推送栈顶 | |||
| 将 int、 float 或 String 类型常量值从常量池中推送至栈顶 | |||
| 将int、 float 或 String 类型常量值从常量池中推送栈顶(宽索引) | |||
| 将 long 或 double 类型常量值从常量池中推送至栈(宽索引) | |||
| 将指定的 int 类型本地变量推送至栈顶 | |||
| 将指定的 long 类型本地变量推送至栈顶 | |||
| 将指定的 float 类型本地变量推送至栈顶 | |||
| 将指定的 double 类型本地变量推送至栈顶 | |||
| 将指定的引用类型本地变量推送至栈顶 | |||
| 将第 1 个 int 类型本地变量推送至栈顶 | |||
| 将第 2 个 int 类型本地变量推送至栈顶 | |||
| 将第 3 个 int 类型本地变量推送至栈顶 | |||
| 将第 4 个 int 类型本地变量推送至栈顶 | |||
| 将第 1 个 long 类型本地变量推送至栈顶 | |||
| 将第 2 个 long 类型本地变量推送至栈顶 | |||
| 将第 3 个 long 类型本地变量推送至栈顶 | |||
| 将第 4 个 long 类型本地变量推送至栈顶 | |||
| 将第 1 个 float 类型本地变量推送至栈顶 | |||
| 将第 2 个 float 类型本地变量推送至栈顶 | |||
| 将第 3 个 float 类型本地变量推送至栈顶 | |||
| 将第 4 个 float 类型本地变量推送至栈顶 | |||
| 将第 1 个 double 类型本地变量推送至栈顶 | |||
| 将第 2 个 double 类型本地变量推送至栈顶 | |||
| 将第 3 个 double 类型本地变量推送至栈顶 | |||
| 将第 4 个 double 类型本地变量推送至栈顶 | |||
| 将第 1 个引用类型本地变量推送至栈顶 | |||
| 将第 2 个引用类型本地变量推送至栈顶 | |||
| 将第 3 个引用类型本地变量推送至栈顶 | |||
| 将第 4 个引用类型本地变量推送至栈顶 | |||
| 将 int 类型数组的指定元素推送至栈顶 | |||
| 将 long 类型数组的指定元素推送至栈顶 | |||
| 将 float 类型数组的指定元素推送至栈顶 | |||
| 将 double 类型数组的指定元素推送至栈顶 | |||
| 将引用类型数组的指定元素推送至栈顶 | |||
| 将 boolean 或 byte 类型数组的指定元素推送至栈顶 | |||
| 将 char 类型数组的指定元素推送至栈顶 | |||
| 将 short 类型数组的指定元素推送至栈顶 | |||
| 将栈顶 int 类型数值存入指定本地变量 | |||
| 将栈顶 long 类型数值存入指定本地变量 | |||
| 将栈顶 float 类型数值存入指定本地变量 | |||
| 将栈顶 double 类型数值存入指定本地变量 | |||
| 将栈顶引用类型数值存入指定本地变量 | |||
| 将栈顶 int 类型数值存入第 1 个本地变量 | |||
| 将栈顶 int 类型数值存入第 2 个本地变量 | |||
| 将栈顶 int 类型数值存入第 3 个本地变量 | |||
| 将栈顶 int 类型数值存入第 4 个本地变量 | |||
| 将栈顶 long 类型数值存入第 1 个本地变量 | |||
| 将栈顶 long 类型数值存入第 2 个本地变量 | |||
| 将栈顶 long 类型数值存入第 3 个本地变量 | |||
| 将栈顶 long 类型数值存入第 4 个本地变量 | |||
| 将栈顶 float 类型数值存入第 1 个本地变量 | |||
| 将栈顶 float 类型数值存入第 2 个本地变量 | |||
| 将栈顶 float 类型数值存入第 3 个本地变量 | |||
| 将栈顶 float 类型数值存入第 4 个本地变量 | |||
| 将栈顶 double 类型数值存入第 1 个本地变量 | |||
| 将栈顶 double 类型数值存入第 2 个本地变量 | |||
| 将栈顶 double 类型数值存入第 3 个本地变量 | |||
| 将栈顶 double 类型数值存入第 4 个本地变量 | |||
| 将栈顶引用类型数值存入第 1 个本地变量 | |||
| 将栈顶引用类型数值存入第 2 个本地变量 | |||
| 将栈顶引用类型数值存入第 3 个本地变量 | |||
| 将栈顶引用类型数值存入第 4 个本地变量 | |||
| 将栈顶 int 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 long 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 float 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 double 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶引用类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 boolean 或 byte 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 char 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶 short 类型数值存入指定数组的指定索引位置 | |||
| 将栈顶数值弹出(数值不能是 long 或 double 类型的) | |||
| 将栈顶的一个 long 或 double 类型的数值或两个其他类型的数值弹出 | |||
| 复制栈顶数值并将复制值压入栈顶 | |||
| 复制栈顶值并将其插入栈顶那两个值的下面 | |||
| 复制栈顶值并将其插入栈顶那两个或三个值的下面 | |||
| 复制栈顶的一个 long 或 double 类型的值,或两个其他类型的值,并将其压入栈顶 | |||
| 复制栈顶的一个或两个值,并将其插入栈顶那两个或三个值的下面 | |||
| 复制栈顶的一个或两个值,并将其插入栈顶那两个、三个或四个值的下面 | |||
| 将栈顶的两个数值互换(数值不能是 long 或 double 类型的) | |||
| 将栈顶两 int 类型数值相加并将结果压入栈顶 | |||
| 将栈顶两 1ong 类型数值相加并将结果压入栈顶 | |||
| 将栈顶两 float 类型数值相加并将结果压入栈顶 | |||
| 将栈顶两 double 类型数值相加并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值相减并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值相减并将结果压入栈顶 | |||
| 将栈顶两 float 类型数值相减并将结果压入栈顶 | |||
| 将栈顶两 double 类型数值相减并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值相乘并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值相乘并将结果压入栈顶 | |||
| 将栈顶两 float 类型数值相乘并将结果压入栈顶 | |||
| 将栈顶两 double 类型数值相乘并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值相除并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值相除并将结果压入栈顶 | |||
| 将栈顶两 float 类型数值相除并将结果压入栈顶 | |||
| 将栈顶两 double 类型数值相除并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值作取模运算并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值作取模运算并将结果压入栈顶 | |||
| 将栈顶两 float 类型数值作取模运算并将结果压入栈顶 | |||
| 将栈顶两 double 类型数值作取模运算并将结果压入栈顶 | |||
| 将栈顶 int 类型数值取负并将结果压入栈顶 | |||
| 将栈顶 long 类型数值取负并将结果压入栈顶 | |||
| 将栈顶 float 类型数值取负并将结果压入栈顶 | |||
| 将栈顶 double 类型数值取负并将结果压入栈顶 | |||
| 将 int 类型数值左移位指定位数并将结果压入栈顶 | |||
| 将 long 类型数值左移位指定位数并将结果压入栈顶 | |||
| 将 int 类型数值(有符号)右移位指定位数并将结果压入栈顶 | |||
| 将 long 类型数值(有符号)右移位指定位数并将结果压入栈顶 | |||
将 int 类型数值(无符号)右移位指定位数并将结果压入栈顶 | ||||
| 将 long 类型数值(无符号)右移位指定位数并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值作“按位与”并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值作“按位与”并将结果压入栈顶 | |||
| 将栈顶两 int 类型数值作“按位或”并将结果压入栈顶 | |||
将栈顶两 long 类型数值作“按位或”并将结果压入栈顶 | ||||
| 将栈顶两 int 类型数值作“按位异或”并将结果压入栈顶 | |||
| 将栈顶两 long 类型数值作“按位异或”并将结果压入栈顶 | |||
| 将指定 int 类型变量增加指定值( | |||
| 将栈顶 int 类型数值强制转换成 long 类型数值并将结果压入栈顶 | |||
| 将栈顶 int 类型数值强制转换成 float 类型数值并将结果压入栈顶 | |||
| 将栈顶 int 类型数值强制转换成 double 类型数值并将结果压入栈顶 | |||
| 将栈顶 long 类型数值强制转换成 int 类型数值并将结果压入栈顶 | |||
| 将栈顶 long 类型数值强制转换成 float 类型数值并将结果压入栈顶 | |||
| 将栈顶 long 类型数值强制转换成 double 类型数值并将结果压入栈顶 | |||
| 将栈顶 float 类型数值强制转换成 int 类型数值并将结果压入栈顶 | |||
| 将栈顶 float 类型数值强制转换成 long 类型数值并将结果压入栈顶 | |||
| 将栈顶 float 类型数值强制转换成 double 类型数值并将结果压入栈顶 | |||
| 将栈顶 double 类型数值强制转换成 int 类型数值并将结果压入栈顶 | |||
| 将栈顶 double 类型数值强制转换成 long 类型数值并将结果压入栈顶 | |||
| 将栈顶 double 类型数值强制转换成 float 类型数值并将结果压入栈顶 | |||
| 将栈顶 int 类型数值强制转换成 byte 类型数值并将结果压入栈顶 | |||
| 将栈顶 int 类型数值强制转换成 char 类型数值并将结果压入栈顶 | |||
| 将栈顶 int 类型数值强制转换成 short 类型数值并将结果压入栈顶 | |||
| 比较栈顶两 long 类型数值大小,并将结果(1,0,-1)压入栈顶 | |||
| 比较栈顶两 float 类型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为“NaN”时,将 -1 压入栈顶 | |||
| 比较栈顶两 float 类型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为“NaN”时,将1压入栈顶 | |||
| 比较栈顶两 double 类型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为“NaN”时,将-1压入栈顶 | |||
| 比较栈顶两 double 类型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为“NaN”时,将1压入栈顶 | |||
| 当栈顶 int 类型数值等于 0 时跳转 | |||
| 当栈顶 int 类型数值不等于 0 时跳转 | |||
| 当栈顶 int 类型数值小于 0 时跳转 | |||
| 当栈顶 int 类型数值大于等于 0 时跳转 | |||
| 当栈顶 int 类型数值大于 0 时跳转 | |||
| 当栈顶 int 类型数值小于等于 0 时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者等于后者时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者不等于后者时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者小于后者时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者大于等于后者时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者大于后者时跳转 | |||
| 比较栈顶两 int 类型数值大小,当前者小于等于后者时跳转 | |||
| 比较栈顶两引用类型数值,当结果相等时跳转 | |||
| 比较栈顶两引用类型数值,当结果不相等时跳转 | |||
| 无条件跳转 | |||
| 跳转至指定 16 位 offset 位置,并将 jsr 下一条指令地址压入栈顶 | |||
| 返回至由指定的局部变量所给出的指令位置(一般与 jsr、jsr_w 联合使用) | |||
| 用于 switch 条件跳转,case 值连续(变长指令) | |||
| 用于 switch 条件跳转,case 值不连续(变长指令) | |||
| 从当前方法返回 int | |||
| 从当前方法返回 long | |||
| 从当前方法返回 float | |||
| 从当前方法返回 double | |||
| 从当前方法返回对象引用 | |||
| 从当前方法返回void | |||
| 获取指定类的静态字段,并将其值压入栈顶 | |||
| 为指定类的静态字段赋值 | |||
| 获取指定类的实例字段,并将其值压入栈顶 | |||
| 为指定类的实例字段赋值 | |||
| 调用实例方法 | |||
| 调用父类方法、实例初始化方法、私有方法 | |||
| 调用静态方法 | |||
| 调用接口方法 | |||
| 调用动态链接方法 | |||
| 创建一个对象,并将其引用值压入栈顶 | |||
| 创建一个指定原始类型(如int、float 、char等)的数组,并将其引用值压入栈顶 | |||
| 创建一个引用型(如类、接口、数组)的数组,并将其引用值压入栈顶 | |||
| 获得数组的长度值并压入栈顶 | |||
| 将栈顶的异常抛出 | |||
检验类型转换,检验未通过将抛出 ClassCastException | ||||
检验对象是否是指定类的实例。如果是,就将 1 压入栈顶,否则将 0 压入栈顶 | ||||
| 获得对象的锁,用于实现同步块 | |||
| 释放对象的锁,用于实现同步块 | |||
| 扩展本地变量索引的宽度 | |||
| 创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶 | |||
| 为nu11时跳转 | |||
| 不为nu11时跳转 | |||
| 无条件跳转(宽索引) | |||
| 跳转至指定 32 位 offset 位置,并将 jsr_w 下一条指令地址压入栈顶 | |||
| breakpoint | 调试时的断点标记 | ||
| impdep1 | 为特定软件面预留的语言后门 | ||
| impdep2 | 为特定硬件面预留的语言后门 |
看在D瓜哥码字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
欢迎关注D瓜哥的微信公众号,在公众号可以获取我的微信二维码:
公众号的微信号是: jikerizhi 。如果图片加载不出来,可以直接通过搜索公众号的微信号来查找D瓜哥的公众号。 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK