JVM 中的逻辑 NOT 操作

Logical NOT operation in JVM

我正在尝试使用 Jasmin 模仿非门的行为。行为如下:

我已经尝试了两种不同的尝试,但都无济于事。

尝试 1:

    ...(other code1)
    ifeq 3          ; if the top of stack is 0, jump 3 lines down to "i_const1"
    i_const0        ; top of stack was not 0, so we push 0
    goto 2          ; jump 2 lines down to first line of (other code2)
    i_const1
    ...(other code2)

当然,上面的例子是行不通的,因为ifeq <offset>接受的是一个Label而不是一个硬编码的整数作为它的偏移量。 是否接受整数作为参数?

是否有类似ifeq的操作

尝试 2:

    ...
    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?

问题在于我的代码中不止一处使用了 NOT 操作。我尝试将 ifeq 与标签一起使用,但完成后如何知道要使用 goto return 的哪一行?有没有办法动态确定哪个 "ifeq Zero" 跳转了?

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

Is there a similar operation to ifeq that does accept integers as a parameter?

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

    ifeq $+7     ;  0: jump +7 bytecodes forward from this instruction
    iconst_0     ; +3
    goto $+4     ; +4
    iconst_1     ; +7
    # ...        ; +8

Is there a way to dynamically determine which "ifeq Zero" made the jump?

没有。使用多个不同的标签而不是单个 Zero.

嗯,实际上有一对字节码(jsr/ret)支持动态return地址。但是这些字节码是 deprecated 并且在 Java 6+ class 文件中不受支持。