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であると仮定すると、これをプログラムの実行の最初の行の最初の 4 つの数字としてどのように記述すればよいでしょうか?

2) OS (OS X または Ubuntu) に、プログラムを物理メモリにロードするように指示するにはどうすればよいですか? コンパイラが最初に行うことは、結果のバイナリ ファイルに OS の命令を書き込むことだと思いますか?

3) 私を助けることができるあなたが知っているかもしれないどんなリソースでも感謝します.

4

2 に答える 2

7

それはあなたがそこで計画しているかなりのプロジェクトです。コンパイラの仕組みを学ぶだけでなく、ELF などの読み込み可能なファイル形式や、オペレーティング システムの詳細に関する膨大な情報を読む必要があります。

アセンブリ ファイルをコンパイラの出力として出力することをお勧めします。次に、既存のアセンブラを使用して、ファイルをマシン コードに変換できます。実際、これはほとんどの C コンパイラ (GCC を含む) が「表面下」で行っていることです。

編集:コンパイラまたはアセンブラの出力は通常、オブジェクト ファイルです。これは後でリンカーによって他のオブジェクト ファイルと結合されます。ツールチェーン全体、コンパイラ、アセンブラ、リンカ、およびその他の関連ツールを作成すると、簡単に数年かかります。この観点から、既存のアセンブラとリンカを不正行為として使用するような単純な解決策を見るべきではないと思います。

于 2013-01-13T17:56:27.370 に答える
3

Python のコンパイルは簡単ではありません。ジャストインタイムコンパイラを備えたpypyを見ることができます。

もう 1 つのオプションは、python プログラムが標準の Cpython インタープリターによって実行される場合、ファイルに保存されている pythonバイトコードから開始することです。.pycこれには、CPU のアセンブリ/実行可能コードを生成する必要がある限られた量の命令があります。

すべての組み込み型と関数を実装するには、大量のコードを記述する必要があることに注意してください。

于 2013-01-13T19:04:39.493 に答える