6809/6800用クロス逆アセンブラを修正しました
9月1日のブログ「必要に迫られて自作したアセンブラ等のツールソフトの紹介」で紹介した自作ソフトの内のクロス逆アセンブラですが、不具合がありました。
公開したものより以前のバージョンでは、スキップ範囲で指定した部分が1バイトずつFCB疑似命令に置き換えられていたので、表示メッセージなどではそれを手作業でFCC疑似命令に置き換えていました。
例えば、スキップ範囲指定したデータが 36,38,30,39,53,59,53,54,45,4D や 0D,0A,04では
FCB $36 FCB $0D
FCB $38 FCB $0A
FCB $30 FCB $04
FCB $39
FCB $53
FCB $59
FCB $53
FCB $54
FCB $45
FCB $4D
となっていましたが、リストを見やすくするために、それを手作業で
FCC /6809SYSTEM/ や FCB $0D,$0A,$04
と書き換えていました。
これを逆アセンブラ自身にさせたいということで、公開したものでは、スキップ範囲に指定したデータの先頭の値が$20~$7Fの表示可能データの場合にはFCC疑似命令に、それ以外の場合にはFCB疑似命令に置き換えるとともに複数バイト列を一つの疑似命令にまとめられるようにしました。
この置き換えが可能になるようにプログラムを書き換えたのですが、一つ忘れていたのは、結果として作成されるFCCやFCB疑似命令のオペランドの長さが不定であり、場合によってはかなり長くなることがあるということでした。特にFCB疑似命令の場合には1バイトのデータあたり4バイト必要になります。
ということで、公開したバージョンではスキップ範囲指定の範囲を大きくとりすぎるとオペランドを格納するための文字列変数のサイズを超えてしまってプログラムが落ちてしまいました。(動作テストではそれほど大きな範囲を指定していなかったので気づきませんでした... ちなみに、スキップ範囲指定は100個まで可能なので、細かく分ければこのバグを回避できます。)
今回公開する修正版では、スキップ範囲指定の入力時に長さをチェックして32バイトを超えた場合は32バイトに制限することにしました。
指定範囲が32バイトを超えている場合は |
32バイトに縮小される |
動作している様子を示します。FCC,FCB疑似命令のオペランドが複数バイトになっています。
まず6809版です。
6809版のLst |
0 件のコメント:
コメントを投稿