2011-05-04 51 views
2

Jasmin是否有能力指定一個常量池?我需要能夠創建一個數千字節的描述符區域。該區域將包含任意字節數據,包括空值。下面是一個典型的集指令的例子來聲明二進制常量:如何在Jasmin中創建數據池?

data 0x00, 0x01, 10, 32 ... 

看來,Java類文件包含這些領域,但我無法找到茉莉的方式對如此大規模的申報值。

回答

2

Java類文件中的該區域稱爲常量池,在§4.4 of the JVM Spec中有詳細描述。

但它不能包含任意的非類型化數據,而是包含類型化數據只有

支持的數據類型是:

  • CONSTANT_Class
  • CONSTANT_Fieldref
  • CONSTANT_Methodref
  • CONSTANT_InterfaceMethodref
  • CONSTANT_String
  • CONSTANT_Integer
  • CONSTANT_Float
  • CONSTANT_Long
  • CONSTANT_Double
  • CONSTANT_NameAndType
  • CONSTANT_Utf8
  • 那些類型的

支持任意長度的任意byte數據。 CONSTANT_Utf8最接近,但要求其內容是有效的UTF-8數據並且不允許0字節。

要找出如何編碼byte[]的最佳方法是在Java中定義一個並反編譯生成的.class文件。 據我所知 A byte[]被編譯到初始化塊設置其字段。

證實:該Java類:

public class Test { 
    byte[] b = { 0, 1, 2, 3, 100 }; 
} 

反編譯這個(使用javac Test.java && javap -v Test):

Compiled from "Test.java" 
public class Test extends java.lang.Object 
    SourceFile: "Test.java" 
    minor version: 0 
    major version: 50 
    Constant pool: 
const #1 = Method #4.#13; // java/lang/Object."<init>":()V 
const #2 = Field #3.#14; // Test.b:[B 
const #3 = class #15; // Test 
const #4 = class #16; // java/lang/Object 
const #5 = Asciz b; 
const #6 = Asciz [B; 
const #7 = Asciz <init>; 
const #8 = Asciz ()V; 
const #9 = Asciz Code; 
const #10 = Asciz LineNumberTable; 
const #11 = Asciz SourceFile; 
const #12 = Asciz Test.java; 
const #13 = NameAndType #7:#8;// "<init>":()V 
const #14 = NameAndType #5:#6;// b:[B 
const #15 = Asciz Test; 
const #16 = Asciz java/lang/Object; 

{ 
byte[] b; 

public Test(); 
    Code: 
    Stack=5, Locals=1, Args_size=1 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: aload_0 
    5: iconst_5 
    6: newarray byte 
    8: dup 
    9: iconst_0 
    10: iconst_0 
    11: bastore 
    12: dup 
    13: iconst_1 
    14: iconst_1 
    15: bastore 
    16: dup 
    17: iconst_2 
    18: iconst_2 
    19: bastore 
    20: dup 
    21: iconst_3 
    22: iconst_3 
    23: bastore 
    24: dup 
    25: iconst_4 
    26: bipush 100 
    28: bastore 
    29: putfield #2; //Field b:[B 
    32: return 
    LineNumberTable: 
    line 1: 0 
    line 2: 4 


} 

正如你所看到的,所產生的構造函數 「手動」 設置的5個值到新分配數組。

+0

有趣的信息,但它沒有解決這個問題。 Jasmin如何做到這一點? – BSalita 2011-05-04 16:35:43

+0

由於Java'class'文件格式不支持存儲任意'byte []',所以它不能在Jasmin中完成**。在Jasmin中唯一可以做的事情是一樣的:生成填充字節[]的代碼。 – 2011-05-04 16:39:24

+0

好的,讓我們簡化請求。我如何在Jasmin中指定Asciz?我已驗證我可以使用操作數至少爲60000字符的引號字符串的ldc操作碼。我寧願在數據聲明聲明中這樣做。那可能嗎? – BSalita 2011-05-04 18:35:43