荫试图用逻辑和符号执行if语句“&&”。 以下是IAM试图做的:在ASM byteocodeΜy堆栈中的值为0和1,我想要得到的结果与“逻辑和”这在我们的情况下,它不进入if语句。
我试过Opcodes.IFEQ和Opcodes.IFNE指令,但不work.Same去与“||” 和“!” 逻辑符号
有任何想法吗?
谢谢advaned。
荫试图用逻辑和符号执行if语句“&&”。 以下是IAM试图做的:在ASM byteocodeΜy堆栈中的值为0和1,我想要得到的结果与“逻辑和”这在我们的情况下,它不进入if语句。
我试过Opcodes.IFEQ和Opcodes.IFNE指令,但不work.Same去与“||” 和“!” 逻辑符号
有任何想法吗?
谢谢advaned。
&&
和||
想想一个短路操作类似&&
或||
实际上做。 你有一些条件分支。 让我们考虑&&
。 什么你有效的评估是:
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
请注意,你原来的问题建议你已经在堆栈上的左侧和右侧的操作数; 这将是糟糕的。 左操作数已评估后 ,才应评估右操作数true
(非零)为&&
或false
(零) ||
。 如果右操作数会产生副作用,过早评估它会违反规定的这些运营商的行为。
有Opcodes.IAND和Opcodes.LAND。 你不提堆栈上的值是否为整数或多头,但我假设前者,所以我认为Opcodes.IAND是你想要的。
同样,也Opcodes.IOR为OR。 不,javac的似乎发出IFNE和ICONST_1或ICONST_0说明,但如果你知道的值是1或0,好像你可以发出Opcodes.ICONST_1其次Opcodes.IXOR。
见附录A中的ASM用户指南,“字节码指令”,第136页:
http://download.forge.objectweb.org/asm/asm4-guide.pdf