2012-03-24 3 views
4

x86アセンブリでコードを記述するための良いリファレンスはありますか。私はコンパイラを書いており、現在はコード生成段階に入っています。私が実装している言語はObject Orientedです。例えば、クラス宣言やオブジェクトレイアウトなどのアセンブリを書くのに問題があります。このトピックをカバーする書籍やリファレンスはありますか?x86コンパイラコードの生成コード

+1

あなたの質問はAです大きな曖昧さ。クラスの宣言やオブジェクトのレイアウトにはアセンブリは必要ありません。 –

+2

[clang/llvm](http://llvm.org/)ソースコードを読むことはできますか?私の経験では理解するのがとても簡単でした。 –

+0

クラス宣言に含まれるアセンブリが何もないことを意味しますか?複数のメソッドやフィールドを持つクラスがあればどうなりますか?アセンブリのメソッドをコード化していないと、後で使用する場合はどこで宣言されますか? –

答えて

2

architecture reference documentationが最適です。

ただし、クラス宣言やオブジェクトレイアウトのヘルプは期待しないでください。コンパイルされる言語仕様にはいくつかのものがありますが、クラス宣言のために生成されたマシンコードは、言語に非常に疎結合しており、主にCPUアーキテクチャではなく実装者の選択肢です。

+0

メソッドの減速がアセンブリなどにどのように変換されるのかを説明するリファレンスがあります。 –

+0

@MikeG:コードへのメソッド宣言の変換はCPUアーキテクチャの問題ではありませんドキュメントはのためのものです。コンパイラライターの仕事は、ソースコードをオブジェクトコードにコンパイルするコードを作成することです。コンパイラを書くという課題を選択したので、ソースからパースツリーを生成し、特定のアーキテクチャをターゲットとする疑似命令(または実際の命令)に変換する方法を既に理解していることが期待されます。 – wallyk

+1

@MikeG:既に述べたように、スタックフレームのレイアウトのようなものです。メソッド呼び出しのためにスタックにargsを置く。メモリオブジェクト内のフィールド、ディスパッチテーブルポインタなどをレイアウトする方法は、命令セットに束縛されない。それを行う方法があります。あなたはドラゴンブックを見ているべきです。 – blackcompe

0

あなたの質問に「直接」と「有用な」回答があり、互換性がない可能性があります。

直接的な答えは、アーキテクチャのリファレンス(以前の回答のリンクを参照)と、このために選択した正確なアセンブラの詳細を組み合わせることです。ガス、鼻炎、ヤスム、攣縮、痙攣[32]、攣縮など。それらはすべて、命令構文、擬似命令(セグメンテーション、メモリ割り当てなど)、実装の詳細、オブジェクトファイル形式についてのリファレンスを持っています。

有用な(jIMHO)答えは、業界リーダーの結果をGNUコンパイラコレクション、Microsoft Developer Studioなどには何千人もの人的年が必要です。これは非常に奇妙な方法です。既存の測定値を可能な限り再利用する必要があります。例えば、あなたの言語のコンセプトを検証するために、コンバータをCコードに実装し、このためのライブラリをサポートすることができます。または、よく知られている仮想マシンとその言語をJavaまたはC#として記述します。上級レベルでは、コンパイラのフロントエンドを独自のもの(GCCとLLVMのようなもの)に置き換え、複数のターゲットに対してうまく書かれ調整されたバックエンドを生成するコードを再利用することができます。

私は、あなたがC言語に変換できず、ライブラリ呼び出しをサポートしていないものを設計しているのは間違いありません。中間コードは細かいものではなく、ただ機能します。あなたはまだ手動で夕日を行いたい場合は、ターゲットプラットフォームの詳細と質問を編集してください

する(Windows/Linuxのは/ etc。、16 32ビットまたは64ビット...)

関連する問題