0

生のマシンコード命令を出力するアセンブラファイルを作成するコンパイラを作成しようとしています。アセンブリ言語をマシンコードにコンパイルする段階はどれですか。

私は、コンパイラを書く方法についてのチュートリアルをたくさん見つけたが、すべてのステージは、アセンブラのニーモニックに関連する場合、私は思ったんだけど。たとえば、段階的に単純化されたアセンブラ形式があれば、字句解析が必要なのでしょうか、それとももっと簡単な形式にする必要がありますか?私はそれを見たよう

答えて

2

字句解析器は必要です:あなたは、個々のトークン(単語、数字、句読点など)にテキストを破るだろう何かを持っている必要があります。はるかに単純化されたものの、パーサも必要です。結局のところ、です。

0

は、字句解析はパーサの必要性があるため、アセンブリのフラットな構造の緩和された場合、すべてのことが必要とされています。

0

まず、無効な命令/オペランドがないかどうか、使用されたすべての変数が宣言されているかどうかを確認します。ファイルが有効なプログラムであることを確認したら、コメントを削除し、変数と手続きをアドレスに置き換えます(アドレスをすぐに知ることができないため、翻訳中にラベルを "オンザフライ"に割り当てる必要があります)。最後に実際の変換をバイナリコードで行います。

すべての命令に独自の行があるとすると、現在の行がラベルであれば、それ以降のすべての参照を現在のアドレスに置き換えます。それ以外の場合はすべての領域を削除し、 "(命令とオペランド)。今、命令を処理することは冗談です。 ;)

0

私は何にも適用されることは、あなたが何をするつもりかに依存もちろん、あなたがアセンブラにコンパイラのほぼすべての段階を適用できると思います。 1対1のマッピングを行う場合は、エラーをチェックするための構文解析と、セクショニング、メモリ保護(.dataまたはマクロ)などの指定子のテキストを処理するレクサーおよび/またはパーサーが必要です。可能な限り小さなサイズに即時定数をファネルすることによって適用できるサイズ「最適化」もあります。もちろん、あなたはすべてを徹底的に分析し、命令の並べ替えや融合を行うことができます。また、静的解析ステージで無効な(不正な)シーケンスがないか確認することもできます(LOCK CMPXCHG EDX,EDXは構文上正しいが無効なアセンブリiircの例になります)

関連する問題