2011-05-04 76 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