在汇编编译器的二进制表达(Binary expression in asm compiler)

2019-10-18 05:37发布

荫试图用逻辑和符号执行if语句“&&”。 以下是IAM试图做的:在ASM byteocodeΜy堆栈中的值为0和1,我想要得到的结果与“逻辑和”这在我们的情况下,它不进入if语句。

我试过Opcodes.IFEQ和Opcodes.IFNE指令,但不work.Same去与“||” 和“!” 逻辑符号

有任何想法吗?

谢谢advaned。

Answer 1:

字节码模式对&&||

想想一个短路操作类似&&|| 实际上做。 你有一些条件分支。 让我们考虑&& 。 什么你有效的评估是:

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 (零) || 。 如果右操作数会产生副作用,过早评估它会违反规定的这些运营商的行为。



Answer 2:

有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



文章来源: Binary expression in asm compiler