Java 编译器asm字节码表达式

Java 编译器asm字节码表达式,java,assembly,compiler-construction,jvm,bytecode,Java,Assembly,Compiler Construction,Jvm,Bytecode,如果不使用新的JumpInsNode(操作码。IF_ICMPEQ),如何计算asm字节码中的表达式2==2 我还想将结果存储在一个变量中。e、 x print(2==2)结果必须为1 提前感谢。您可以将两个操作数推送到堆栈上,并应用ixor指令;如果结果为零,则操作数相等 bipush 2 bipush 2 ixor // stack holds 0 if operands are equal, nonzero if not equal 您不想使用分支指令的任何特定原因?没有任何用于获取布

如果不使用新的
JumpInsNode(操作码。IF_ICMPEQ)
,如何计算asm字节码中的表达式
2==2

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


提前感谢。

您可以将两个操作数推送到堆栈上,并应用
ixor
指令;如果结果为零,则操作数相等

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

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

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

boolean b = (2 == 2)
相当于

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

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