10

最近我读了很多关于 CPU 和架构的文章。主要是操作码,集成电路等。我已经做了几年的python开发人员,我想在编写机器码方面得到一些练习。

我想为了好玩,我会将一个非常简单的 python 脚本编译成机器码作为练习它的一种方式。脚本如下:

a = 2
b = 3
c = a + b
print c

我正在用 python 编写编译器,因为我在 C 方面不如在 python 方面好。我看了一圈,我可以使用以下python库,这可能会有所帮助,即

binascii.hexify(hex(2))  <-- should convert 2 to binary, correct?

file = open('/usr/local/bin/my_sample_program','wb') <-- should write the resulting binary file

我仍然需要找到 Intel Core i5 的操作码,但这应该很容易。

我的问题如下:

1)如何将操作码写入文件?换句话说,假设用于设置寄存器以包含值 2 的操作码是0010,我如何将其写为程序第一行执行中的前四个数字?

2) 我如何告诉 OS X 或 Ubuntu 将程序加载到物理内存中?我假设编译器做的第一件事是将操作系统的指令写入生成的二进制文件?

3)您可能知道的任何可以帮助我的资源将不胜感激。

4

2 回答 2

7

那是你在那里计划的一个项目。除了了解编译器的工作原理之外,您还需要阅读 ELF 等可加载文件格式以及有关操作系统详细信息的大量信息。

我建议您发出一个汇编文件作为编译器的输出。然后您可以使用现有的汇编程序将文件转换为机器代码。事实上,这是大多数 C 编译器(包括 GCC)“在表面下”所做的。

编辑:编译器或汇编器的输出通常是一个目标文件。稍后通过链接器将其与其他目标文件组合。编写整个工具链、编译器、汇编器、链接器和其他相关工具将很容易花费多个人年。从这个角度来看,我认为您不应该看到一个直接的解决方案,比如使用现有的汇编器和链接器作为作弊。

于 2013-01-13T17:56:27.370 回答
3

编译python并不容易。您可以查看具有即时编译器的pypy 。

如果标准 Cpython 解释器运行 python 程序,另一种选择是从保存在文件中的 python字节码开始。.pyc这具有有限数量的指令,您必须为您的 CPU 生成汇编/可执行代码。

请注意,您还必须编写大量代码来实现所有内置类型和函数!

于 2013-01-13T19:04:39.493 回答