【问题标题】:Missing instruction numbers in javap outputjavap输出中缺少指令号
【发布时间】:2014-03-21 16:20:51
【问题描述】:

每次我尝试理解编译后的 Java 文件的反汇编代码时,我都想知道为什么缺少一些指令号。

一个小例子:

我反汇编 ($ javap -c HelloWorld) 一个简单的 HelloWorld 类。这是输出:

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        
}

如您所见,构造函数中的指令3和4以及main方法中的一些指令都丢失了。

有人知道为什么缺少这些指令编号吗?是否有一些字节码指令由于某种原因被隐藏了?

【问题讨论】:

    标签: java bytecode disassembly mnemonics javap


    【解决方案1】:

    “漏洞”是当前指令的参数所在的位置,请参阅Java Virtual Machine Specification。它包含Chapter 6 中的完整字节码列表。

    例如 invokevirtualinvokespecial 都接受 2 个参数,因此下一个操作码将在 3 个字节后找到。在这两种情况下,都需要参数(indexbyte1 和 indexbyte2)来计算常量池中的位置为(indexbyte1 &lt;&lt; 8) | indexbyte2)

    Javap 会为您查找这些值,这是实际指令后在 cmets 中的引用。

    【讨论】:

      【解决方案2】:

      那些不是指令号,它们是指令相对于方法的字节偏移量。

      我仍在为此寻找官方文档,但this link 确认了这一点。

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 2016-04-24
        • 2020-01-12
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多