x64対応のEXEファイルのPEヘッダ、基本的な部分は解読できました。そして今日はなんとか、簡単な計算プログラムをコンパイルできる状態へと持っていくことができました〜。コンパイルとはいっても、64ビットモードで動作するめちゃくちゃ簡単なネイティブコードがはけるようになっただけですが…

ところで、x64の関数呼び出し規約って、昔のそれとはちょっと違うんですよ。何が違うかってーと、レジスタ経由が前提条件になっているんです(先日も言いましたね(^^;;;)。詳しく言うと、第1〜第4パラメータがrcx、rdx、r8、r9レジスタで引き渡されるんです。

今現在のABコンパイラは、逆ポーランドに則り、pushとpopを多用することにより、演算部分のコード出力を実現させています。しかし、これではレジスタのみで演算が事足りる場合でも、いちいちメモリアクセスを必要としてしまうため、効率的であるとはいえません。コード最適化の面から言えば、「最悪」という評価が下されることでしょう。

しかし、「x64関数はレジスタ経由でのパラメータ引渡しが前提条件になっている」このような機会は逆にチャンスです。このタイミングでコンパイラの演算部分を改良し、適切なレジスタ同士で演算が行われるようなコードを吐けるよう、改修作業を進めようと思います。

まぁ、このレジスタを効率的に利用するってのがコンパイラ設計者の真の悩みだったりするんで、一筋縄ではいかなさそうです…。ボチボチやってきます