モニタ上でプログラムのロード、実行が簡単にできるようになりましたが、アセンブラが出力するコードは相対アドレスの飛び先に誤りがあるという問題は解決していません。使い方が間違っているのか、アセンブラ自体のバグなのかよくわかりません。
アセンブラのソースコードは公開されているので覗いてみたのですがモジュールが細かく分かれていてどう処理してるか追えないのと、そもそもscalaというプログラム言語で記述されていてちんぷんかんぷんです。
出来上がってしまったバイナリにあとからパッチを当てるという手作業を今までやってましたがこれを自動化するツール:Transputer Convergence Correctorなるものを作ってみました
やってることは手作業の手順をそのままコーディングしただけです
まずソースコードを普通にアセンブルしてバイナリファイルとリスティングファイルを生成しておきます。これらのファイルを入力としてツールを起動させます
PASS1:Table Generateでリスティングファイルからラベル名-物理アドレスの引当表を切り出します
PASS2:Label Searchで飛び先にラベルが使用されているところを物理アドレスに置き換えます
PASS3:References Resolveで命令自身の位置、次の命令の位置、飛び先の位置から正しい相対アドレスを算出しトランスピュータのフォーマットに変換。修正すべきデータのパッチリストを作成、入力されたバイナリファイルに適用します
実行例として修正版モニタDLL4.asmを処理したログです。アセンブラソース340行のうち相対アドレスが間違っている可能性のあるJ/CJ/CALLを使用した行は53行、修正箇所は104か所にものぼりました
ツールでの処理は瞬時に終わりますがこれ手作業だと相当大変です
出力バイナリは即パッチが当たるのでもう一度処理すると修正箇所が0になることがわかります