JVM 中的逻辑 NOT 操作
Logical NOT operation in JVM
我正在尝试使用 Jasmin 模仿非门的行为。行为如下:
- 从堆栈中弹出一个整数
- 如果整数为 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 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 文件中不受支持。
我正在尝试使用 Jasmin 模仿非门的行为。行为如下:
- 从堆栈中弹出一个整数
- 如果整数为 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而不是一个硬编码的整数作为它的偏移量。 是否接受整数作为参数?
尝试 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 文件中不受支持。