JVM中的逻辑NOT操作

时间:2016-03-21 22:13:11

标签: jvm bytecode jasmin

我试图使用Jasmin来模仿NOT门的行为。行为如下:

  • 从堆栈中弹出一个整数
  • 如果整数为0,则将1推回堆栈
  • 否则将0推回堆栈

我已尝试过两次不同的尝试,但无济于事。

尝试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返回哪一行?有没有办法动态确定哪个&#34; ifeq Zero&#34;跳了吗?

非常感谢任何见解。

1 个答案:

答案 0 :(得分:4)

  

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

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

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

有没有办法动态确定哪个&#34; ifeq Zero&#34;跳了吗?

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

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