【问题标题】:Compiler asm bytecode expression编译器 asm 字节码表达式
【发布时间】:2013-06-10 12:11:56
【问题描述】:

如何在不使用新的JumpInsNode(Opcodes.IF_ICMPEQ) 的情况下计算 asm 字节码中的表达式 2==2

我还想将结果存储在一个变量中。 e.x print (2==2) 结果必须是 1

提前致谢。

【问题讨论】:

    标签: java assembly compiler-construction jvm bytecode


    【解决方案1】:

    您可以将两个操作数都压入堆栈并应用ixor 指令;如果结果为零,则操作数相等。

    bipush 2
    bipush 2
    ixor   // stack holds 0 if operands are equal, nonzero if not equal
    

    您不想使用分支指令的任何特殊原因?

    【讨论】:

    • 是的,看看这个。我想做这个写 2==2;结果将是 0 或 1。分支指令将没有用,或者我不知道。你有什么建议?
    • 结果必须是0还是1? 0 或非零有什么问题?
    • 无 0 或非零都可以。还有一个问题,如果我有 22 等,我使用什么指令来获得相同的结果?
    • 没有任何分支指令?这将更加棘手,并且可能需要几条指令。除非您想简单地将操作数转换为长值 (i2l),然后执行 lcmp。无论如何,我上面的回答会给你原始问题的 0 或非零答案。如果这符合您的需要,您能接受答案吗?谢谢!
    【解决方案2】:

    没有任何用于获取布尔值的内置指令。当你在 Java 中取比较的值时,编译器会生成一个 if 语句,并在一个分支上赋值 0,在另一个分支上赋值 1。

    boolean b = (2 == 2)
    

    等价于

    boolean b;
    if (2 == 2) { b = true; } else {b = false;}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多