我很沮丧。我已将这个十六进制代码翻译成IJVM汇编语言,但我不能为我的生活弄清楚如何将它们整合在一起以java格式。
I am using I as local variable 1, j as local variable 2 and k as local variable 3.
Iload I 0x15 0x01
Iload j 0x15 0x02
DUP 0x59 (copy J onto the stack again)
iadd 0x60 (add j+j or 2*j)
isub 0x64 (I- (j+j))
ifeq 0x99 0x00 0x05 (***)
bipush 42 0x10 0x2A
Istore k 0x36 0x03
* 这是我开始感到困惑的地方......我知道这是一个if语句来查看数字是否等于零。我不知道其他声明会是什么。任何帮助都会非常感激!
这是我得到的......
if ((I-(j+j) == 0)
k=42;
答案 0 :(得分:0)
这是我想出的。假设这个.java文件(注意:JVM与IJVM之间可能略有不同):
class test
{
public static void main(String args)
{
int k = 1;
int j = 2;
int n;
if (j - (k + k) != 0);
n = 42;
}
}
编译和反汇编时,结果如下:
C:\java\sample>javap -c test
Compiled from "test.java"
class test {
test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String);
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_2
5: iload_1
6: iload_1
7: iadd
8: isub
9: ifeq 12
12: bipush 42
14: istore_3
15: return
}
答案 1 :(得分:0)
IFEQ的语法具有16位偏移量。在指令开始时将偏移量添加到PC
0x99 0x00 0x05
如果测试为零,则表示跳过5个字节。跳过指令本身的3个字节以及随后的两个字节。