JVM中的逻辑NOT操作

JVM中的逻辑NOT操作,jvm,bytecode,jasmin,Jvm,Bytecode,Jasmin,我试着用Jasmin来模仿非大门的行为。行为如下: 从堆栈中弹出一个整数 如果整数为0,则将1推回堆栈 否则将0推回堆栈 我尝试了两种不同的尝试,但都没有成功 尝试1: 当然,上面的示例不起作用,因为ifeq接受标签而不是硬编码的整数作为其偏移量。是否有类似于ifeq的操作接受整数作为参数 尝试2: 问题是我的代码中不止一个地方使用NOT操作。我尝试使用带有标签的ifeq,但在我完成之后,我如何知道使用goto返回到哪一行?有没有办法动态确定哪个ifeq Zero进行了跳转 如有任何见解,将不胜

我试着用Jasmin来模仿非大门的行为。行为如下:

从堆栈中弹出一个整数 如果整数为0,则将1推回堆栈 否则将0推回堆栈 我尝试了两种不同的尝试,但都没有成功

尝试1:

当然,上面的示例不起作用,因为ifeq接受标签而不是硬编码的整数作为其偏移量。是否有类似于ifeq的操作接受整数作为参数

尝试2:

问题是我的代码中不止一个地方使用NOT操作。我尝试使用带有标签的ifeq,但在我完成之后,我如何知道使用goto返回到哪一行?有没有办法动态确定哪个ifeq Zero进行了跳转

如有任何见解,将不胜感激

是否有类似于ifeq的操作接受整数作为参数

是的,可以使用$符号指定相对偏移。 但是相对偏移量是以字节计算的,而不是以行计算的

    ifeq $+7     ;  0: jump +7 bytecodes forward from this instruction
    iconst_0     ; +3
    goto $+4     ; +4
    iconst_1     ; +7
    # ...        ; +8
有没有办法动态确定哪个ifeq Zero进行了跳转

否。请使用多个不同的标签,而不是单个零


实际上,有一对字节码jsr/ret支持动态返回地址。但是这些字节码在Java 6+类文件中不受支持。

根据您的要求,如果您知道值为0或1,则可以使用x^1。这可以避免分支或标签。@Peter Lawrey:…或1-x。应该注意的是,问题代码中的注释是错误的。或者该值预期正好为1或零,那么不为零意味着正好为1,而不是“1或更大”,或者不为零也可能意味着小于零值,因此不能保证为“1或更大”。在任何一种情况下,“堆栈顶部为1或更大”都是错误的…
    ...
    ifeq Zero       ; top of stack is 0, so jump to Zero
    i_const0        ; top of stack was 1 or greater, so we push 0
    ...
    ... (some code in between)
    ...
    ifeq Zero       ; top of stack is 0, so jump to Zero
    i_const0        ; top of stack was 1 or greater, so we push 0
    ...
    Zero:
    i_const1        ; top of stack was 0, so push 1 to stack
    goto <???>      ; How do I know which "ifeq Zero" called this label?
    ifeq $+7     ;  0: jump +7 bytecodes forward from this instruction
    iconst_0     ; +3
    goto $+4     ; +4
    iconst_1     ; +7
    # ...        ; +8