CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

エラー対策(2)

飛び先ラベルとの間に無駄コードの詰め物をして語長を増やす対策ですが数行追加でOKになる場合もありますが数十行挿入しても全く語長が変わらないこともあります。相対アドレスの算出ミスの規則性が全くわかりません。

以下の例では正しい相対アドレスは 0x7FF80116-0x7FF8022B=0xFFFFFEEB(-277)で3語長必要ですが6D/02=nfix #2/j #2と2語長でエンコードされ0xFFFFFFF22(-222)と誤って算出されています

これはもう間に挿入してアドレスを調整するのではなく問題があるコードの後に1バイトスペースを作っておきパッチを当てる余裕を持つ方が手っ取り早いです。しかもそうした方が全体のプログラムサイズもほとんど変わりません。ここではジャンプ命令の後0x7FF8022B番地に「DB 0」を挿入しておきました。

このソースをそのままアセンブル、修正ツールにかけると今まで通り0x7FF80229番地で語長が足りないのエラーを検出します

ここでアセンブラが出力したバイナリファイルを開いて生成されているジャンプ命令6D/02FF/FFで潰しておきます。次の00はジャンプ命令の終端に見せかけるためそのまま残さなければなりません(なのでCALLの次だったら「90」、CJの次だったら「A0」にしておく)

このバイナリを入力にして修正ツールに再度かけると

元々3語長あったと認識されてパッチが成功します

3バイトの空きに61/2E/0A=nfix #E/pfix #E /J #A = J FFFFFEEAが正しく上書きされました

手作業が入りますがこれが一番確実のようです