将已组装的IJVM代码转换为Java代码

时间:2013-11-22 05:50:46

标签: java stack hex

我很沮丧。我已将这个十六进制代码翻译成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;

2 个答案:

答案 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个字节以及随后的两个字节。