asm编译器中的二进制表达式

2024-02-09

我正在尝试使用逻辑和符号“&&”执行 if 语句。这是我想要做的:asm字节码中的μy堆栈具有值0和1,我想得到结果 在我们的例子中,“逻辑与”不会出现在 if 语句中。

我已经尝试过 Opcodes.IFEQ 和 Opcodes.IFNE 指令,但不起作用。“||”也一样和 '!'逻辑符号

有任何想法吗?


字节码模式&& and ||

想想短路运算符是什么样的&& or ||事实上确实如此。你有一些条件分支。让我们考虑一下&&。您有效评估的是:

if (left)
    if (right) <do something>
endIf

没有单个字节码指令可以描述这种行为。您需要一些标签和条件分支指令:

.start
    <left expression>
    IFEQ .endIf // if left evaluates to zero (false), skip to end
    <right expression>
    IFEQ .endIf // if right evaluates to zero (false), skip to end
.ifTrue
    <body of 'if' block>
.endIf

的行为||运算符有点不同;在这种情况下,逻辑看起来像这样:

    if (left)
        goto .ifTrue
    if (!right)
        goto .endIf
.ifTrue
    <do something>
.endIf

请注意如何反转对右操作数的检查,以避免当右操作数计算为时出现额外分支true。这种行为可以在字节码中实现,如下所示:

    <left operand>
    IFNE .ifTrue  // if left evaluates true, skip right, enter 'if' body
    <right operand>
    IFEQ .endIf   // if right evaluates false, skip 'if' body
.ifTrue
    <do something>
.endIf

何时推送操作数

请注意,您最初的问题表明您已经在堆栈上有了左右操作数;那会很糟糕。您应该只评估正确的操作数after左操作数的计算结果为true(非零)对于&& or false(零)对于||。如果正确的操作数会产生副作用,那么过早地对其求值将违反这些运算符的定义行为。

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

asm编译器中的二进制表达式 的相关文章

随机推荐

  • Google 云容器构建器并不总是从 bitbucket 触发

    我在 Google Cloud Container Builder 中设置了构建触发器 这些触发器设置为在特定分支上触发并使用存储库中的 cloudbuild yml 配置 大约在我将提交推送到这些分支的第一天 它触发了容器构建并成功完成
  • 使用 Go 将数据发送到 Datadog

    我使用 Go 收集数据并希望将其可视化 我选择了 Datadog 但没有找到 Go 用于向 Datadog 发送指标的示例或实时项目 但官方网站说支持Go 第一步是在运行应用程序的服务器上安装 DataDog 代理 https docs d
  • tableView didSelectRowAtIndexPath 在 iOS 7 上无法正常工作。为什么?

    首先我想说我只是提出这个问题 因为我想了解发生了什么 我在 Xcode5 上全新安装时打开了一个旧的 Xcode 项目 一个非常简单的项目 当我意识到它在 iOS 7 上不起作用时 为什么 不知道 我看到了一些其他问题 没有得到任何有用的答
  • Vue.js 组件不工作

    我似乎无法弄清楚如何使组件工作 如果没有该组件 它可以正常工作 注释代码 这是我的 HTML strong Total Price strong span span br strong CPC strong span span 这是我的 V
  • Snap:编译的拼接代码示例

    我想我前段时间确实问过类似的问题 但由于 API 不稳定 没有得到回答 所以我一直在等待0 13的过去 我不确定提出类似问题是否正确 解释的替代方案是什么runChildrenWith Text and mapSplices在编译的拼接世界
  • 为什么 Safari 或 Firefox 无法处理来自 MediaElementSource 的音频数据?

    Safari 或 Firefox 都无法处理来自MediaElementSource使用网络音频 API http jsbin com ImUmOXe 1 edit js output var audioContext audioProce
  • 需要 grunt@>=0.4.0 的对等点

    为什么我会收到以下错误 我的 grunt 版本是 gt v0 4 0 npm install grunt contrib concat save dev 未满足的对等依赖 grunt gt 0 4 0 错误信息 Projects Hartz
  • Kotlin 本机互操作链接器找不到框架

    我正在尝试在 Kotlin 多平台项目中使用 cocoapods 框架 所以我 将框架添加到 Pods 文件中 运行 pod install created def file added cinterop配置在build gradle gr
  • 不使用指针迭代 C 风格数组

    我正在学习指针算术 并且有一段代码在相当长的一段时间内给我带来了错误 任何帮助将不胜感激 我找不到它 int arr 1 2 3 4 5 for int i 0 i lt 5 i cout lt lt arr arr cout lt lt
  • 匹配标准 10 位电话号码的正则表达式

    我想为支持以下格式的标准美国电话号码编写正则表达式 其中 表示任意数字 到目前为止我想出了以下表达方式 1 9 d 2 d 3 d 4 d 3 s d 3 d 4 1 9 d 2 s d 3 s d 4 1 9 d 2 d 3 d 4 分别
  • 在Python中初始化固定大小的数组[重复]

    这个问题在这里已经有答案了 我想知道如何初始化一个数组 或列表 尚未填充值 以具有定义的大小 例如在 C 中 int x 5 declared without adding elements 我如何在 Python 中做到这一点 您可以使用
  • 给定组合时如何计算索引(字典顺序)

    我知道有一种算法允许给定数字组合 无重复 无顺序 计算字典顺序的索引 这对于我的应用程序加快速度非常有用 例如 combination 10 5 1 1 2 3 4 5 2 1 2 3 4 6 3 1 2 3 4 7 251 5 7 8 9
  • Ember 数据模型重新加载导致 {{each}} 中的项目被删除/插入回来 - 丢失当前状态

    我怎样才能防止itemView在迭代控制器时被删除并重新渲染回原位arrangedContent 如果观察到的模型的属性没有改变值 下面是使用博客文章的简短版本App Post作为示例模型 控制器 sortProperties create
  • 使用“C”执行 API 将 sqlite3 表导出到文件中

    我在 fedora 14 中使用 sqlite3 版本 3 6 23 1 我可以使用这样的命令提示符将表导出到文件中 sqlite3 data db sqlite gt output sample txt sqlite gt select
  • 如何使 TeamCity 构建出现在 TFS 构建资源管理器中?

    我们使用 TFS 2010 进行源代码控制和项目管理 使用 TeamCity 6 0 执行构建和构建报告 测试人员的 CI 和日常部署 在 TeamCity 中设置 TFS 源标签以匹配内部版本号非常简单 但我找不到将其链接回 TFS Bu
  • 使用 osmosis 将 POSTGIS 表转换为 .OSM

    我正在使用 osmosis 0 42 和 PostGIS 2 0 1 并且我正在尝试将一些 postGIS 表导出到 OSM xml 文件 我使用 read pgsql 命令从 postgis 读取 而不是 read apidb 因为它在连
  • 自我类型和特质子类有什么区别?

    特质的自我类型A trait B trait A this B gt 说 A不能混合到一个不扩展的具体类中B 另一方面 如下 trait B trait A extends B 说 任何 具体或抽象 类混合A也会混入B 这两个说法不是说的是
  • 如何基于一个 xcode 项目构建精简版和完整版 iPhone 应用程序?

    我不想维护两套代码 我只需要限制 Lite 版本中的一些功能并在其上添加一些广告即可 怎么做 创建多个目标 您可以通过右键单击目标并选择获取信息来改变构建配置 从那里 你可以做一些事情 比如改变Info plist文件它正在查看 执行诸如将
  • 我们可以在 PWA 应用程序中使用 SQLite 数据库吗

    我正在创建渐进式网络应用程序应用程序 我想将用户信息存储在本地设备中 那么 我该如何做到这一点 如何存储用户登录信息 以便他不必一次又一次登录 浏览器没有 SQLite 您可以使用更接近的方法索引数据库 https caniuse com
  • asm编译器中的二进制表达式

    我正在尝试使用逻辑和符号 执行 if 语句 这是我想要做的 asm字节码中的 y堆栈具有值0和1 我想得到结果 在我们的例子中 逻辑与 不会出现在 if 语句中 我已经尝试过 Opcodes IFEQ 和 Opcodes IFNE 指令 但