我正在为类似 Java 的字节码构建一个汇编程序。本质上,它是一个 Python 函数,它接收从包含操作码的文本文件中读取的字符串,并将编译后的二进制数据写入文件。以下是输入字符串字符串的示例(来自Example.txt
):
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
)正好是一个字节长(即 0 到 255 范围内的数字)。一些操作码也接受一个字节长的操作数。
仅将方法的操作码保存在二进制文件中非常容易。我会将每个操作码解析为 0 到 255 范围内的数字,然后使用array.append(op)
, 然后array.tofile(handle)
.
但是,我不仅需要保存操作码,还需要保存数据,例如类名、方法名等。
如何将单字节值和更复杂的数据保存到二进制文件中?
我曾设想过这样的事情......
该文件分为多个部分。例如,第一部分将是class Example
. 下一节是由Method add
.
本质上,只有两种类型的部分,名称部分,其中仅包含class name
,以及方法部分,然后将其细分为元和代码部分。
名称部分以00
(十六进制)开头,然后需要显示类的名称(这是我的问题)。这00
本质上是 的十六进制表示class
。方法部分以 开头FF
,然后它们也需要在接下来的几个字节中显示它们的名称。然后,我可能不得不在主要方法部分0F
中表示“元部分的F0
开始”和“代码部分的开始”。
然而,问题仍然存在。如何命名这些部分?我有一个想法,将例如“示例”中的每个字符转换为其十六进制表示形式,一个字节,然后将它们保存在文件中00
or之后FF
。这可能意味着我需要一些“部分结束”符号。
有没有更好/更简单/已经实施的方法来做到这一点?