JVM跳转指令的偏移量怎么会是32768呢?

2024-04-05

在写一个回答有关 JVM 字节码偏移量的问题 https://stackoverflow.com/a/30240357/3182664,我注意到 javac 的行为和生成的类文件中有一些我无法解释的内容:

当编译这样的类时

class FarJump
{
    public static void main(String args[])
    {
        call(0, 1);
    }

    public static void call(int x, int y)
    {
        if (x < y)
        {
            y++;
            y++;

            // ... (10921 times - too much code to post here!)

            y++;
            y++;
        }
        System.out.println(y);
    }

}

那么生成的字节码将包含以下内容if_icmpge https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.if_icmp_cond操作说明:

public static void call(int, int);
    Code:
       0: iload_0
       1: iload_1
       2: if_icmpge     32768
       5: iinc          1, 1
       8: iinc          1, 1
       ...

根据跳转指令的文档,偏移量(在本例中为 32768)计算如下:

如果比较成功,则无符号分支字节1 and 分支字节2用于构造有符号的 16 位偏移量,其中偏移量计算为(branchbyte1 .

所以偏移量被称为signed16 位值。然而,最大值signed16位值可以容纳的是32767,而不是32768。

生成的类文件看起来仍然有效,并且可以正常执行。

我看了一下OpenJDK 中的字节码检查 http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/59deb2d00b29/src/share/native/common/check_code.c#l1160,(对我来说)这似乎只是由于括号放错了位置而有效:

int jump = (((signed char)(code[offset+1])) << 8) + code[offset+2];

它将第一个字节转换为signed char. Then它将应用移位,并添加第二个字节。我本来希望它是

int jump = (((signed char)(code[offset+1]) << 8)) + code[offset+2];

或者甚至可能

int jump = (signed char)((code[offset+1]) << 8) + code[offset+2]);

但我不熟悉类型提升以及转换有符号和无符号类型的可能的特定于编译器的警告,所以我不确定这个转换背后是否有更深层次的含义......

那么32768的跳转偏移量是否符合规范呢? OpenJDK 中的跳转计算代码在这方面有什么意义吗?


论点为if_icmpge是一个偏移量,但 javap 将跳转目标显示为绝对位置。也就是说,javap 应该显示getstatic at 32768:并不是32770:(即 2 + 32768)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM跳转指令的偏移量怎么会是32768呢? 的相关文章

  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

    这个问题在这里已经有答案了 我无法使页面正常工作 我有要发布的表单方法和我的 servlet 实现doPost 然而 它不断地向我表明我并不支持POST方法 我只是想做一个简单的网站并将值插入到我的 MySQL 数据库中 type Stat
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • javax.media.jai 类的公共下载?

    这是一个非常简单的问题 我一直在寻找可以下载 javax media jai 库的地方 我找到了 jai imageio 库 但是我发现的所有其他 jai 内容要么已经过时 2008 年及之前 然后我遇到了登录屏幕 是否有 javax me
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到
  • Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明

    我通过剖析示例应用程序来自学 Spring 然后到处添加代码来测试我在剖析过程中开发的理论 在测试添加到 Spring 应用程序中的一些代码时 我收到以下错误消息 An Errors BindingResult argument is ex

随机推荐

  • 如何将模型的整数属性映射到字符串?

    我的数据库中有一个 Hotels 表 其中一列是 status integer 我正在寻找将这些整数转换为字符串 所以1 Awaiting Contract 2 Designing 等等 我在 Stack 中搜索了一些答案 但缺乏答案让我觉
  • Nodejs shell 脚本在 Linux 中工作正常,但在 Windows 中不行。为什么它不会执行多个命令

    我发现我的 node js shell 脚本在 Windows 和 Linux 中的工作方式有所不同 我有一串使用 child process 库同步执行的命令 var cmd echo hello echo Stack echo Over
  • 在unity 3d上绘制3D多边形

    我正在为我正在进行的一个项目尝试统一 我正在尝试从我拥有的一组坐标中绘制 3D 多边形 所以我现在要做的是在两点之间构建一排立方体 我计划将这些点构建成实体形状或只是 墙壁 以形成一个房间 然而 它似乎没有按预期工作 请指教 drawCub
  • 如何让用户选择适用于 Safari 浏览器

    我有这个 html 结构 ol class linenums li class L0 code span span code li ol 代码之前有行号 通过选择代码 我使用此 css 以便仅选择代码而不选择行号 ol linenums l
  • git服务器复制

    我们正在使用 git 进行多站点项目 并且仓库和团队都大幅增长 因此 远程站点正在遭受痛苦 我想向远程站点添加新的 git 服务器 以减少 git 服务器上的负载并使下载速度更快 但是我不确定如何保持这些同步 有什么办法可以原子地复制 gi
  • 键盘位置遮挡了 EditText 下方的视图,希望保持可见

    我的活动基本上是一个长形式的输入字段 在每一行上 我想在每个 EditText 下方显示一个 TextView 作为提示文本 并且我希望 TextView 在用户输入数据时始终保持可见 不幸的是 软键盘掩盖了提示文本 并且总是将其自身定位在
  • 从富文本框控件获取当前滚动位置?

    我在互联网上进行了广泛的搜索 看到了很多这样的问题 但我还没有看到真正的答案 我有一个富文本框控件 其中有很多文本 该控件中有一些法律信息 默认情况下 接受 按钮被禁用 我想检测滚动事件是否垂直滚动条的位置位于底部 如果它位于底部 请启用该
  • strtotime() 的结果是否会根据时区而改变?

    I used strtotime datetime 在 PHP 中将文本日期时间描述转换为 Unix 时间戳 参见下面的代码 datetime 2012 04 17 00 00 00 timestamp strtotime datetime
  • 使用 Enter 按键事件和鼠标单击触发提交按钮

    我是一个完全的初学者 正在使用 Just do it 和以项目为中心的路线学习前端 我的网络应用程序的工作原理基本上与待办事项列表类似 我认为这是因为我对同一个元素有两次 getElementById 这最初有效 add idea to l
  • Kendo Grid - 它自己的加载指示器

    Kendo grid在网格加载 分页 排序时自动提供自己的Loading指示器 它运行良好 但我不希望显示 隐藏这个内置加载指示器 如何禁用此功能 请建议我 谢谢 维诺斯 很简单 用CSS隐藏就可以了 您的选择器需要比内置 Kendo 类更
  • 如何在 C# 中使 winforms 进度条垂直移动?

    我正在开发 WinForms Jukebox 我想要一个垂直的进度条来控制音量 有谁知道这是怎么做到的吗 我不知道我会使用进度条control音量 但要display您可以使用用户绘制的控件来调整音量级别 或者您可以仅使用背景颜色调整标签的
  • 如何在 angular2 中访问父组件中的子组件 HTML 元素值?

    我使用下面的代码在父组件的按钮单击期间访问父组件中的子组件 HTML 元素值 子组件 ts Component selector child component template
  • 关于转向多层 Delphi 架构的建议

    我们有一个与 Firebird 紧密相关的相对较大的应用程序 存储过程 视图等 我们现在收到很多支持其他数据库的请求 我们还希望将很多功能从客户端转移到服务器 现在似乎是迁移到 3 4 层架构的好时机 我们已经了解了 DataSnap 20
  • 如何将变量从 Express.js 传递到 Angular11 通用 SSR

    简单的问题 我们如何从expressjs传递到角度通用HTML组件或主应用程序index html变量 比如从expressjs到ejs或pug app get req res gt res render index req messsag
  • Sublime Text 2 突出显示装订线

    默认情况下 当插入符号位于 Sublime Text 2 中的行号 装订线区域时 该行会突出显示 我怎样才能将其关闭 我看到隐藏装订线的选项 但我希望行号可见 谢谢 要关闭行突出显示 请转到preferences gt settings U
  • Phonegap 页面旋转错误,在横向模式下显示为纵向

    我有一个 简单的 网页打包在phonegap 应用程序中 如果我启动应用程序 它会以纵向显示页面 横向页面宽度 所以文本从左下到左上开始 右侧有一个空白 页面应该在此处结束 这是我所看到的 在我的中支持的方向是横向左和右 Info plis
  • 是否可以使用 XSLT 跳过层次结构中的级别?

    层次结构采用 XML 格式 我使用 XSLT 来转换数据 例如 如果层次结构有 4 个级别 并且我想跳过中间的一个级别 例如第 3 级 Level 1 Level 2 Level 3 Skip this level Level 4 Leve
  • 仅使用 CSS 的最大高度和最大宽度

    我的第一篇文章在这里 我使用 div 以相同的比例 180wx170h 裁剪缩略图 在处理肖像和风景图像时 我陷入了困境 如果我使用它 这对于肖像风格的图像来说很好 crop img max height 170px width auto
  • 为 C# 应用程序制作安装程序并将 .NET Framework 安装程序包含到安装程序中

    我已经完成了 C 应用程序 但有一个小问题 当我尝试在另一台 PC 上运行应用程序时 我始终需要安装 NET Framework 4 0 有什么办法可以使其工作而无需从互联网安装框架吗 我之前尝试过创新设置 http www jrsoftw
  • JVM跳转指令的偏移量怎么会是32768呢?

    在写一个回答有关 JVM 字节码偏移量的问题 https stackoverflow com a 30240357 3182664 我注意到 javac 的行为和生成的类文件中有一些我无法解释的内容 当编译这样的类时 class FarJu