Java ライクなバイトコード用のアセンブラを構築しています。基本的に、これは、オペコードを含むテキスト ファイルから読み取られた文字列を受け取り、コンパイルされたバイナリ データをファイルに書き込む Python 関数です。Example.txt
入力文字列 string (から)の例を次に示します。
class Example
Method add
meta
lva 4
code
0: ipush 1 0
1: ipush 2 2
2: iload 1
3: iload 2
4: iadd
5: istore 3
6: iload 3
7: ireturn
私の仕事は、Example.txt
テキスト ファイルをバイナリ表現 (仮想マシンのマシン コード) に変換することです。各オペコード (例: iadd
) は、正確に 1 バイトの長さ (つまり、0 から 255 の範囲の数値) です。一部のオペコードはオペランドを取り込みますが、これも 1 バイト長です。
メソッドのオペコードのみをバイナリ ファイルに保存するのは非常に簡単です。各オペコードを 0 から 255 の範囲の数値に解析し、 、および を使用しarray.append(op)
ますarray.tofile(handle)
。
ただし、オペコードだけでなく、クラス名、メソッド名などのデータも保存する必要があります。
1 バイト値とより複雑なデータの両方をバイナリ ファイルに保存するにはどうすればよいですか?
こんなものを想定していた...
ファイルはセクションに分かれています。たとえば、最初のセクションはclass Example
. 次のセクションは、 によって開始されるセクションですMethod add
。
class name
基本的に、セクションには、 のみを含む name セクションと、 meta セクションと code セクションにサブセクション化される method セクションの 2 種類しかありません。
名前セクションは00
(16 進数) で始まり、クラスの名前を提示する必要があります (これは私の問題です)。これ00
は基本的に の 16 進表現ですclass
。メソッド セクションは で始まりFF
、次の数バイトで名前を示す必要があります。次に、プライマリ メソッド セクション内の「0F
メタ セクションの開始」と「コード セクションの開始」を意味する必要があります。F0
ただし、問題が残ります。これらのセクションに名前を付けるにはどうすればよいですか? たとえば「例」の各文字を16進表現である1バイトに変換し、00
またはFF
. これはおそらく、「セクションの終わり」記号が必要になることを意味します。
これを行うためのより良い/簡単な/すでに実装されている方法はありますか?