最近我一直在阅读有关CPU和架构的内容;主要是操作码,集成电路等。几年来我一直是一名python开发人员,我想在编写机器码时做一些练习。
我觉得很有趣我会将一个非常简单的python脚本编译成机器码,作为练习它的一种方式。脚本如下:
a = 2
b = 3
c = a + b
print c
我在python中编写编译器,因为我不像C在py上那么擅长。我看了一下,我有以下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
我仍然需要找到英特尔酷睿i5的操作码,但这应该很容易。
我的问题如下:
1)如何将操作码写入文件?换句话说,假设用于设置寄存器以包含值2的操作码是 0010 我该怎么写这个作为程序第一行执行中的前四个数字?
2)如何告诉操作系统(OS X或Ubuntu)将程序加载到物理内存中?我假设编译器做的第一件事就是将操作系统的指令写入生成的二进制文件中?
3)您可能知道的任何可以帮助我的资源都将受到赞赏。
答案 0 :(得分:7)
这是你正在计划的一个项目。除了学习编译器的工作原理之外,您还需要阅读有关ELF等可加载文件格式以及大量有关操作系统详细信息的信息。
我建议你发出汇编文件作为编译器的输出。然后,您可以使用现有的汇编程序将文件转换为机器代码。事实上,这就是大多数C编译器(包括GCC)“在表面下”所做的事情。
编辑:编译器或汇编程序的输出通常是目标文件。稍后通过链接器将其与其他目标文件组合。编写整个工具链,编译器,汇编器,链接器和其他相关工具很容易就能完成多个人工年。有鉴于此,我认为您不应该看到像使用现有的汇编器和链接器那样直截了当的解决方案。
答案 1 :(得分:3)