JVM学习-字节码指令集(三)

代码下载

操作数栈管理指令
  • 如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作数栈的指令
  • 将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2
  • 复制栈顶一个或两个数值并将复制值成双份的复制值重新压入栈顶:dup,dup2,dup_x1,dup_x1,dup_x2,dup_x2
  • 将栈最顶端的两个Slot数值位置交换,swap,Java虚拟机没有提供交换两个64位数据类型(long,double)数值的指令
  • 指令nop,是一个非常特殊指令,它的字节码为0x00。和汇编语言中的nop一样,表示什么都不做,这条指令一般可用于调试,占位等
  • 上述指令属于通用型,对栈的压入或弹出无需指明数据类型
  • 说明
  • 不带_x指令是复制栈顶数据并压入栈顶,包括两个指令,dup和dup2,dup的系数代表要复制的Slot个数
  • dup开头的指令用于复制1个Slot的数据,例如1个int可1个reference类型数据
  • dup2开头的指令用于复制2个Slot的数据,如1个long,2个int或1个int+1个float类型数据
  • 带_x的指令是复制栈顶数据并插入栈顶以下的某个位置,共有4个指令,dup_x1,dup_x1,dup_x2,dup_x2,对于带_x的复制插入指令,只要将指令的dup和x的系数相加,结果即为需要插入的位置,因此
  • dup_x1插入位置:1 + 1 = 2,即栈顶2个Slot下面
  • dup_x2插入位置:1 + 2 = 3,即栈顶3个Slot下面
  • dup2_x1插入位置:2 + 1 = 3,即栈顶3个Slot下面
  • dup2_x2插入位置:2 + 2 = 4,即栈顶4个Slot下面
  • pop:将栈顶的1个Slot数值出栈,如1个short类型数值
  • pop2:将栈顶的2个Slot数值出栈,如1个double类型数值,或2个int类型数值
//可以编译后,通过IDEA的jclasslib插件查看字节码
public class StackOperateTest {public void print() {Object obj = new Object();//String info = obj.toString();obj.toString();}public void foo() {bar();}public long bar() {return 0;}public long nextIndex() {return index ++;}private long index = 0;
}
控制转移指令
比较指令
  • 比较指令的作用是比较栈顶两个元素的大小,并将比较结果入栈
  • 比较指令有dcmpg,dcmpl,fcmpg,fcmpl,lcmp
  • 对于double和float类型的数字,由于NaN的存在,各有两个版本的比较指令,以float为例,fcmpg和fcmpl两个指令,它们的区别在于在数字比较时,若遇到NaN值,处理结果不同
  • 指令dcmpl和dcmpg也是类似的,根据其命名可以推测其含义
  • 指令lcmp针对long型整数,由于long整数没有NaN值,无需准备两套指令
  • 举例:指令fcmpg和fcmpl都从栈中弹出两个操作数,并将它们做比较,设栈顶的元素为v2,栈顶顺位第2位的元素为v1,若v1=v2,则压入0,若v1>v2则压入1,若v1<v2则压入-1,两个指令不同之处在于,如遇到NaN值,fcmpg会压入1而fcmpl会压入-1
条件跳转指令
  • 条件跳转指令通常和比较指令结合使用,在条件跳转执行前,一般可以先用比较指令进行栈顶元素的准备,然后进行条件跳转

  • 条件跳转指令:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,这些指令都接收两个字节的操作数,用于跳转的位置(16位符号整数作为当前位置的offset)

  • 它们统一含义为:弹出栈顶元素,测试它是否满足某一条件,如果满足条件,则跳转到给定位置
    在这里插入图片描述

  • 注:

  • 对于boolan,byte,char,short类型的条件分支比较操作,都使用int类型比较指令完成
  • 对于long,float,double类型的条件分支比较操作,则会执行相应类型的比较运算指令,运算指令会返回一个整数值到操作数栈中,随后再执行int类型的条件分支比较操作来完成整个分支跳转
  • 由于各种类型的比较最终会转为int类型的比较操作,所以JVM提供的int类型的条件分支指令是最为丰富和强大的
比较条件跳转指令
  • 比较条件跳转指令类似于比较指令和条件跳转指令的结合体,它将比较和跳转两个步骤合二为一
  • 这类指令有if_icmpeq,if_icmpne,if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq和if_acmpne
  • 其中指令助词符加上"if_"后,以字符i开头的指令针对int型整数操作(包括short和byte类型),以字符a开头的指令表示对象引用的比较
    在这里插入图片描述
  • 这些指令都接收两个字节的操作数作为参数,用于计算跳转的位置,同时在执行指令时,栈顶需要准备两个元素进行比较,指令执行完成后,栈顶的这两个元素被清空,且没有任何数据入栈,如果预设条件成立,则执行跳转,否则,继续执行下一条语句
//可通过jclasslib插件查看字节码public void ifcompare1() {int i = 10;int j = 20;System.out.println(i < j);}public void ifcompare2() {short s1 = 9;byte b1 = 20;System.out.println(s1 > b1);}public void ifcompare3() {Object obj1 = new Object();Object obj2 = new Object();System.out.println(obj1 == obj2);System.out.println(obj1 != obj2);}//ifcompare3字节码0 new #10 <java/lang/Object>3 dup4 invokespecial #1 <java/lang/Object.<init>>7 astore_18 new #10 <java/lang/Object>
11 dup
12 invokespecial #1 <java/lang/Object.<init>>
15 astore_2
16 getstatic #4 <java/lang/System.out>
19 aload_1
20 aload_2
21 if_acmpne 28 (+7)
24 iconst_1
25 goto 29 (+4)
28 iconst_0
29 invokevirtual #5 <java/io/PrintStream.println>
32 getstatic #4 <java/lang/System.out>
35 aload_1
36 aload_2
37 if_acmpeq 44 (+7)    //比较相等时跳转,见上图
40 iconst_1
41 goto 45 (+4)
44 iconst_0
45 invokevirtual #5 <java/io/PrintStream.println>
48 return
多条件分支跳转指令
  • 多条件分支跳转指令是专门为switch-case语句设计的,主要有tableswitch和lookupswitch
    在这里插入图片描述
  • tableswitch要求多个条件分支值是连续的,它内部只存放起始值和终止值,以及若干个跳转偏移量,通过给定的操作数index,可以立即定位到跳转偏移量位置,因此效率较高
  • lookupswitch内部存放着各个离散的case-offset对,每次执行都要搜索全部的case-offset对,找到匹配的case值,并根据对应的offset计算跳转地址,因此效率较低
  • 指令tableswitch的case是连续的,只需要记录最低值和最高值,以及每一个项对应的offset偏移量,根据给定index值通过简单计算可直接定位offset
public void switch1(int select) {int num;switch (select) {case 1:num = 10;break;case 2:num = 20;break;case 3:num = 30;break;default:num = 40;}}
//--字节码0 iload_11 tableswitch 1 to 3	1:  28 (+27)    //switch... case 1-32:  34 (+33)3:  40 (+39)default:  46 (+45)
28 bipush 10
30 istore_2
31 goto 49 (+18)
34 bipush 20
36 istore_2
37 goto 49 (+12)
40 bipush 30
42 istore_2
43 goto 49 (+6)
46 bipush 40
48 istore_2
49 returnpublic void switch2(int select) {int num;switch (select) {case 100:num = 10;break;case 500:num = 20;break;case 200:num = 30;break;default:num = 40;}}//字节码0 iload_11 lookupswitch 3100:  36 (+35)200:  48 (+47)500:  42 (+41)default:  54 (+53)
36 bipush 10
38 istore_2
39 goto 57 (+18)
42 bipush 20
44 istore_2
45 goto 57 (+12)
48 bipush 30
50 istore_2
51 goto 57 (+6)
54 bipush 40
56 istore_2
57 return
无条件跳转指令
  • 无条件跳转指令为goto,指令goto接收两个字节的操作数,共同组成一个带符号的整数,用于指定指令的偏移量,指令执行的目的就是跳转到偏移量给定的位置处
  • 如果指令偏移量太大,超过双字节的带符号整数的范围,则可以使用指令goto_w,它和goto有相同的作用,接收4个字节的操作数,可以表示更大的地址范围
  • 批评jsr,jsr_w,ret虽也是无条件跳转,但主要用于try-finally语句,且已经被虚拟机逐渐废弃,故不在这里介绍
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

半导体光子电学期末笔记1: 电磁光学基本理论

Chapter 2: 电磁光学基本理论 电磁光学理论概述 真空中麦克斯韦方程组[p9] 在自由空间中&#xff0c;麦克斯韦方程组可以写成如下形式&#xff1a; { ∇ H ϵ 0 ∂ E ∂ t (1) ∇ E − μ 0 ∂ H ∂ t (2) ∇ ⋅ E 0 (3) ∇ ⋅ H 0 (4) \begin{cases} \nabla \times \…

Dubbo调用流程与启动流程

Dubbo调用流程与启动流程技术文档 一、概述 Dubbo是一个高性能、轻量级的开源服务框架&#xff0c;用于开发高性能微服务应用。它主要提供了三大核心功能&#xff1a;服务治理、远程调用和集群容错。本文档将详细介绍Dubbo的调用流程和启动流程。 二、Dubbo调用流程 2.1 服务…

SD NAND、SD卡和NOR Flash的区别

存储技术在现代电子设备中的应用越来越广泛&#xff0c;三种常见的存储解决方案是SD卡、SD NAND和NOR Flash。了解它们之间的区别&#xff0c;有助于选择合适的存储介质以满足特定的应用需求。 SD卡 1.接口和传输速度:SD卡&#xff08;Secure Digital Card&#xff09;是一种广…

迅狐短剧小程序源码:打造个性化的追剧体验

随着移动互联网的普及&#xff0c;短剧小程序源码的开发成为了影视爱好者的新宠。它不仅为用户提供了便捷的追剧体验&#xff0c;还通过推荐系统、观看历史、个性化喜好等特色功能&#xff0c;满足了用户的多样化需求。本文将深入探讨短剧小程序源码的特点、优势以及如何实现多…

fly-barrage 前端弹幕库(6):实现人像免遮挡

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

(文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略

参考文献&#xff1a; [1]潘虹锦,高红均,杨艳红,等.基于主从博弈的售电商多元零售套餐设计与多级市场购电策略[J].中国电机工程学报,2022,42(13):4785-4800. 1.摘要 随着电力市场改革的发展&#xff0c;如何制定吸引用户选择的多类型零售套餐成为提升售电商利润的研究重点。为…

【TB作品】MSP430F5529,单片机,打地鼠游戏

功能 针对这块开发板做了一个打地鼠游戏&#xff1a; 1 给单片机上电后&#xff0c;初始化显示界面&#xff0c;显示出分数和等级。 2 游戏是一轮一轮进行的&#xff0c;每一轮会以50%几率点亮板子上的五个小灯&#xff0c;表示地鼠露头需要打了。 3 一轮游戏开始后&#xff…

最难沟通的,是那些一脸正确的人!寻找那上等的螃蟹!——早读(逆天打工人爬取热门微信文章解读)

端午节的代表&#xff1a;粽子 引言Python 代码第一篇 最难沟通的&#xff0c;是那些一脸正确的人第二篇结尾 路漫漫其修远兮&#xff0c;吾将上下而求索 ——屈原 引言 端午节 马上就要到了 大家有吃粽子的习俗吗&#xff1f; 我们潮汕那边就有 不过基本都是肉粽 去年还是前…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点&#xff1a;窗口坐标体系的原点位于窗口的左上角&#xff0c;即坐标(0, 0)位置。 轴方向&#xff1a; X轴&#xff1a;向右为正方向&#xff0c;随着X坐标值的增加&#xff0c;元素在窗口中从…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 &#xff0c;可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

UTONMOS:元宇宙游戏,散发无尽魅力与可能

在数字世界的浩瀚星海中&#xff0c;utonmos元宇宙游戏宛如一颗璀璨的明珠&#xff0c;散发着无尽的魅力与可能。 utonmos可不单单只是一款游戏&#xff0c;它更是一个令人惊叹的全新虚拟宇宙&#xff0c;急切地等待着你去深入探索和豪迈征服。 在这里&#xff0c;你能随心所欲…

LeetCode-77. 组合【回溯】

LeetCode-77. 组合【回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯背诵版解题思路三&#xff1a;0 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&a…

自定义类型:结构体类型

在学习完指针相关的知识后将进入到c语言中又一大重点——自定义类型&#xff0c;在之前学习操作符以及指针时我们对自定义类型中的结构体类型有了初步的了解&#xff0c;学习了结构体类型的创建以及如何创建结构体变量&#xff0c;还有结构体成员操作符的使用&#xff0c;现在我…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第32课-旋转动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第32课-旋转动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

某直聘zp_stoken纯算法还原

郑重声明&#xff1a;本项目的所有代码和相关文章&#xff0c; 仅用于经验技术交流分享&#xff0c;禁止将相关技术应用到不正当途径&#xff0c;因为滥用技术产生的风险与本人无关。 难点概要&#xff1a; 每日切换一次算法&#xff0c;其中包括环境&#xff0c;运行方式等。…

24.6.2(动态开点线段树)

星期一&#xff1a; cf edu round 36 E cf传送门 题意&#xff1a;1到n天初始全为工作日&#xff0c;有两种操作&#xff0c;将 l-r 区间变为 工作日/休息日&#xff0c;每次操作后询问剩余总工作日有多少 思路&…

前端调用接口有参数正常显示返回值,但是打印是undefined

前端调用接口有参数正常显示返回值&#xff0c;但是打印是undefined 这种有几种情况&#xff0c;但总的来说是因为我们做了接口拦截器的处理 一、后端返回code值有误 比如新来的后端忘记传code了。&#xff08;按照公司规范&#xff0c;一般都是200成功码&#xff09; 或者网上…

Oracle 序列-SEQUENCE

文章目录 序列-SEQUENCE创建序列访问序列序列的修改和删除查询序列信息 序列-SEQUENCE 创建序列 访问序列 序列的修改和删除 DROP SEQUENCE SEQ_EKPO;查询序列信息 可以通过视图 dba/all/user_sequences 查询序列的相关信息 SELECT SEQUENCE_NAME FROM DBA_SEQUENCES WHERE …

洪师傅代驾系统开发 支持公众号H5小程序APP 后端Java源码

代驾流程图 业务流程图 管理端设置 1、首页装修 2、师傅奖励配置 师傅注册后,可享受后台设置的新师傅可得的额外奖励; 例:A注册了师傅,新人奖励可享受3天,第一天的第一笔订单完成后可得正常佣金佣金*奖励比例 完成第二笔/第三笔后依次可得正常佣金佣金*奖励比例 完成的第四…