- ベストアンサー
ニーモニックから機械語へ変換する簡易アセンブラ
- ニーモニックから機械語への変換はどのようなアルゴリズムで行われていたか知りたいのですが、H8マイコンなどで実際にコードを書いたウェブサイトなどはありますでしょうか?
- メモリに格納された文字コードを1バイトずつ命令変換テーブルと比較し、同じ場合はそのオペコードを出力するといったようなアルゴリズムになると思うのですが、これは正しいでしょうか?
- アセンブラレベルでどのように実現されているか解説が見当たらなかっため質問させて頂きました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ハンドアセンブルと聞いて。 昔いくつか自作したこともありますが、実用的なアセンブラにしようとすると上記に加えて、ラベルの処理(ジャンプアドレスやメモリ参照)、アドレッシングに応じたオペコード生成、オペランドでの演算処理(定数だけでなくラベルも絡む)、マクロの登録と展開などが必要になります。またエラーメッセージもそれなりに判り易くないと使い難いので、一ヶ所のエラーで中断せず、一通り最後まで処理して欲しいところでもあります。 それに 1-PASS では、相対アドレスやラベルの参照時にそれより後にあるアドレスが未解決になるので、2-PASS で処理しないといけなくなりますし、リンカを併用するなら中間コードが必要かもしれません。同様ににオペランドにより命令コード長が可変な場合なども調整(最適化)が必要になります。 処理速度の点では、昔のマシンは本当に遅かったので、ニーモニックテーブルもハッシュ化しておいて線形サーチを避けたり、ラベルやマクロの処理も 1bit 単位でメモリをせこったものです。 実際の処理系については、高級言語も含めてソースコードの公開されたものがあるので、色々検索してください。ちなみに H8 は GCC も対応してます。
その他の回答 (1)
- DESTROY11
- ベストアンサー率23% (804/3490)
そのとおりです。 まだパソコンがマイコンと呼ばれていた時代は、 紙に書かれたアセンブラコードを手動で機械語に変換していました。 そのときも、そのようにやっています。 実際はジャンプ位置計算なども必要になってきますね。
お礼
ご回答ありがとうございます。 なるほど、やはりこのような処理になっているのですね。 調べても「アセンブリ言語で書かれたコードを機械語に変換する」としか書いておらず、果たしてこれで合っているのか確証がなかったため質問させていただきました。 もし、実際の処理について詳しく書かれているサイトや本などがありましたら教えて下さい。ありがとうございます。
お礼
ご回答ありがとうございます。 >処理速度の点では、昔のマシンは本当に遅かったので、ニーモニックテーブルもハッシュ化しておいて線形サーチを避けたり、ラベルやマクロの処理も 1bit 単位でメモリをせこったものです。 なるほど、やはり実際の実装にはいろいろと工夫がされていたのですね。 ラベルの処理、アドレッシングに応じたオペコード生成、オペランドでの演算処理、マクロの登録と展開など、ニーモニックをオペコードに変換するだけでなく他にも様々な処理が必要になることが分かり、とても勉強になりました。アセンブラも最低限の機能のものから段々と発展してきたのだと思いますが、それを考えると一から現在のアセンブラを作るのがどれほど大変か分かる気がします。 どうもありがとうございました。