更新日: 2023 年 7 月 10 日
HAS060.X で修正された HAS.X v3.09 の不具合
説明
HAS060.X の添付ドキュメントです。
DEBUGGED.DOC
──────────────────────────────────── High-speed Assembler ─ 68060 対応版 HAS060.X version 3.09+89 < HAS060.X で修正された HAS.X v3.09 の不具合 > 2016/08/07 M.Kamada ──────────────────────────────────── 以下の不具合は HAS.X v3.09 に存在したものですが、HAS060.X では修正され ています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● スケールファクタを使用しているプログラムが正常にアセンブルできないこ とがある不具合 例: スケールファクタの不具合 ┌──────────────────────────── 1│ .CPU 68030 2│ TST.L (A0,D0.L*4) 3│ .REPT 200 4│@@: 5│ BRA @B 6│ .ENDM 上の例のプログラムを HAS.X v3.09 でアセンブルしようとすると、アセンブ ル中にバスエラーが発生します。 HAS.X v3.09 では、スケールファクタを使用したとき、シンボルハッシュテー ブルのごく一部が破壊されてしまっていました。シンボルハッシュテーブルには 10000 個のエントリがあります。スケールファクタの使用によって破壊されるの は特定の数個のエントリ(HAS.X v3.09 の場合は 161〜163 番のあたり)だけな ので滅多に影響が出ません。しかし、破壊されたエントリが偶然使用されたとき に、バスエラーなどの重大な障害が発生します。 この不具合は大きなプログラムほど影響が出やすく、同種のローカルラベルを 大量に定義および参照しているプログラムでは、スケールファクタを使っただけ で HAS.X v3.09 ではアセンブルできなくなってしまっていました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● (bd,PC) の bd のサイズが変化するとき拡張ワードを更新しない不具合 例: (bd,PC) の不具合 ┌──────────────────────────── 1│ .CPU 68030 2│ JSR ([(*)+$10000,PC]) *不具合発生 最適化の過程で、フルフォーマットの PC 間接アドレッシングのベースディス プレースメントのサイズが変化することがあります。このとき、HAS.X v3.09 で は、拡張ワード内のベースディスプレースメントサイズフィールドを更新してい ませんでした。この結果、拡張ワードではワードサイズのベースディスプレース メントの存在を示しているのに、実際のベースディスプレースメントはロングワ ードサイズで出力されるという矛盾が生じ、間違ったオブジェクトが出力されて しまいます。-e を指定した場合は逆の不具合が発生します。これらはアセンブ ルされるプログラムの原因不明のバグのもとになります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● DIVSL/DIVUL でオペレーションサイズを省略すると命令長が 5 バイトになる 不具合 例: DIVSL/DIVUL の不具合 ┌──────────────────────────── 1│ .CPU 68030 2│ DIVSL #1000,D0:D0 *不具合発生 3│ DIVUL #255,D0:D0 *不具合発生 4│ DIVSL.L #255,D0:D0 5│ DIVUL.L #255,D0:D0 HAS.X v3.09 では、上の例の 2 行目は「overflow error」となり、3 行目は 命令長が 5 バイトになって 4 行目で警告「illegal alignment」が発生します。 これは、DIVSL/DIVUL でオペレーションサイズを省略するとイミディエイトオペ ランドを 1 バイトだけ出力するためです。なお、4〜5 行目のようにオペレーシ ョンサイズを明記すればこの不具合は発生しません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● CHK でオペレーションサイズを省略すると命令長が 3 バイトになる不具合 例: CHK の不具合 ┌──────────────────────────── 1│ CHK #1000,D0 *不具合発生 2│ CHK #255,D0 *不具合発生 3│ CHK.W #1000,D0 4│ CHK.L #255,D0 HAS.X v3.09 では、上の例の 1 行目は「overflow error」となり、2 行目は 命令長が 3 バイトになって 3 行目で警告「illegal alignment」が発生します。 これは、CHK でオペレーションサイズを省略するとイミディエイトオペランドを 1 バイトだけ出力するためです。なお、3〜4 行目のようにオペレーションサイ ズを明記すればこの不具合は発生しません。なお、HAS060.X でオペレーション サイズを省略したときはワードサイズになります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● BTST Dn,#<data> でオペレーションサイズを省略すると命令長が 3 バイトに なる不具合 例: BTST の不具合 ┌──────────────────────────── 1│ BTST D0,#0 *不具合発生 2│ BTST.B D0,#0 HAS.X v3.09 では、上の例の 1 行目は命令長が 3 バイトになって 2 行目で 警告「illegal alignment」が発生します。これは、BTST Dn,#<data> でオペレ ーションサイズを省略したときイミディエイトオペランドを 1 バイトだけ出力 するためです。なお、2 行目のようにオペレーションサイズを明記すればこの不 具合は発生しません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● PMOVE #<data>,<PMMU Register> で <PMMU Register> が CRP/SRP/DRP のい ずれかのとき正しくアセンブルできない不具合 HAS.X v3.09 では、PMOVE 命令で 64 ビットのイミディエイトオペランドが指 定される可能性が考慮されていませんでした。 例: PMOVE の不具合 ┌──────────────────────────── 1│ .CPU 68020 2│ PMOVE #0,CRP *不具合発生 3│ PMOVE.D #0,CRP *不具合発生 4│ PMOVE.Q #0,CRP *不具合発生 5│ PMOVE.D #!81000003_00BF0000,SRP *不具合発生 6│ PMOVE.D #$81000003,$00BF0000,SRP *不具合発生 7│ PMOVE.D #$81000003,#$00BF0000,SRP *不具合発生 HAS.X v3.09 では、上の例の 2〜4 行目はイミディエイトオペランドが 1 バ イトだけ出力されるために 3 行目以降でワーニング「illegal alignment」が発 生してしまいます。また、5 行目ではエラー「illegal operand」、6〜7 行目で はエラー「illegal addressing」が発生して、いずれも正しくアセンブルできま せんでした。 HAS060.X では、PMOVE 命令のイミディエイトオペランドに 64 ビットまでの 整数を指定できます。また、浮動小数点命令と同様に 32 ビットの整数 2 つに 分けて記述することも可能です。詳しくは、HAS060.DOC の<整数の記述>の 「PMOVE 命令のイミディエイトオペランド」の項目を参照して下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● MOVE (d,OPC),(d,An) の OPC が単なる PC として解釈される不具合 例: MOVE (d,OPC),(d,An) の不具合 ┌──────────────────────────── 1│ MOVE.B (($)+$8000,OPC),(A0) 2│ MOVE.B (($)+$8000,OPC),(A0)+ 3│ MOVE.B (($)+$8000,OPC),-(A0) 4│ MOVE.B (($)+$8000,OPC),(1,A0) *不具合発生 5│ MOVE.B (($)+$8000,OPC),(A0,D0.L) HAS.X v3.09 では、上の例の 4 行目の OPC だけが単なる PC として解釈され てしまいます。その結果、この行だけ絶対ロング形式に変換されず、アセンブル 対象の CPU が 68020 以上ならば (bd,PC) としてアセンブルされ、それ以外の ときはエラーになってしまいます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● CINV/CPUSH 命令を行頭から書いたとき、オペランドに DC が指定されている と「illegal operand」エラーが発生する不具合 例: CINV/CPUSH 命令の不具合 ┌──────────────────────────── 1│ .CPU 68040 2│ CPUSHA IC 3│ CPUSHA DC 4│ CPUSHA BC 5│CPUSHA IC 6│CPUSHA DC *不具合発生 7│CPUSHA BC HAS.X v3.09 では、CINV/CPUSH を行の先頭から空白を空けずに書いたとき、 オペランドに DC が指定されていると、エラー「illegal operand」が発生しま す。これは、DC が命令として解釈できるので CINV/CPUSH は命令と同名のラベ ルで DC の方が命令だと判断され、DC のオペランドが何も書かれていないため にエラーが出てしまうのです。 HAS060.X では、CINV/CPUSH 命令と同名のラベルを定義するときは、その後ろ に“:”を伴うか、その行の命令の先頭に“.”を書かなければならないことにし ました。“:”と“.”のどちらも書かれていなければ、CINV/CPUSH は常に命令 として解釈されます。 例: CINV/CPUSH 命令の HAS060.X における解釈 ┌──────────────────────────── 1│ .CPU 68040 2│ CPUSHA DC *CPUSHA は命令 3│ CPUSHA: DC *CPUSHA はラベル 4│CPUSHA DC *CPUSHA は命令 5│CPUSHA: DC *CPUSHA はラベル 6│CPUSHA .DC *CPUSHA はラベル ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● PMOVE 命令を行頭から書いたとき、オペランドに SCC または VAL が指定さ れていると正常にアセンブルされない不具合 例: PMOVE 命令の不具合 ┌──────────────────────────── 1│ .CPU 68020 2│ PMOVE VAL,(A0) 3│ PMOVE SCC,(A0) 4│PMOVE VAL,(A0) *不具合発生 5│PMOVE SCC,(A0) *不具合発生 HAS.X v3.09 では、PMOVE を行の先頭から空白を空けずに書いたとき、オペラ ンドに SCC または VAL が指定されていると正しいオブジェクトが生成されませ ん。これは、SCC と VAL が命令として解釈できるため、PMOVE は命令と同名の ラベルで SCC または VAL の方が命令だと判断されてしまうからです。 HAS060.X では、PMOVE 命令と同名のラベルを定義するときは、その後ろに “:”を伴うか、その行の命令の先頭に“.”を書かなければならないことにしま した。“:”と“.”のどちらも書かれていなければ、PMOVE は常に命令として解 釈されます。 例: PMOVE 命令の HAS060.X における解釈 ┌──────────────────────────── 1│ .CPU 68020 2│ PMOVE VAL,(A0) *PMOVE は命令 3│ PMOVE SCC,(A0) *PMOVE は命令 4│ PMOVE: VAL,(A0) *PMOVE はラベル 5│PMOVE VAL,(A0) *PMOVE は命令 6│PMOVE SCC,(A0) *PMOVE は命令 7│PMOVE: VAL,(A0) *PMOVE はラベル 8│PMOVE .VAL,(A0) *PMOVE はラベル ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 負の整数から浮動小数点数への変換を間違える不具合 例: 負の整数から浮動小数点数への変換の不具合 ┌──────────────────────────── 1│ .DC.X 0.0+3000000000 *不具合発生 2│ .DC.X 0.0+$FFFF9999 *不具合発生 HAS.X v3.09 では、この例の 1 行目は -3000000000 になってしまいます。ま た、2 行目は C00E00009999FFFF00000000 というオブジェクトに変換されます。 前者は符号が間違っています(符号つき 32 ビットで解釈するなら -1294967296 になるはずです)。後者は符号反転する代わりに上位ワードと下位ワードが入れ 替わっており、指数部分も間違っています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 浮動小数点数を 0f を使わずに書くとき、小数点“.”と指数部の開始の“E” の間(小数部)に数字が 1 つもないとエラーになる不具合 例: 浮動小数点数の解釈の不具合 ┌──────────────────────────── 1│ .CPU 68030 2│ FMOVE.X #1.0E+10,FP0 3│ FMOVE.X #1.E+10,FP0 *不具合発生 4│ FMOVE.X #1E+10,FP0 HAS.X v3.09 では、0f を使わなかったとき、小数点の直後が数字でなければ 浮動小数点数と判断されないようになっていました。上の例では、3 行目だけエ ラーになります。 確かに小数点の直後が“E”だと .EOR. の先頭部分と紛らわしいのですが、指 数部として正しい記述かどうかを確認すれば演算子でないことは明らかなので、 HAS060.X では小数点と“E”がくっついていても浮動小数点数として解釈できる ようになっています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .ALIGN 1 がエラーにならない不具合 仕様では、.ALIGN 疑似命令の 1 番目の式の値の範囲は 2〜256 の 2 の累乗 の数となっていますが、HAS.X v3.09 では式の値が 1 でもエラーになりません でした。 例: .ALIGN の不具合 ┌──────────────────────────── 1│ .ALIGN 1 *不具合発生 .ALIGN 1 は無意味で、.ALIGN 16 の書き間違いの可能性もあるので、 HAS060.X では .ALIGN 1 に対してエラー「illegal value」を通知するように修 正しました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .OFFSET セクションで .ALIGN 疑似命令を使用した場合に、オブジェクトフ ァイルにアラインメント情報が出力される不具合 HAS.X v3.09 では .OFFSET セクションの .ALIGN 疑似命令の指定がオブジェ クトファイルに出力されており、リンク時に余計なアラインメントが発生してし まうことがありました。 例: .OFFSET セクションで .ALIGN を使用した場合の不具合 ┌──────────────────────────── 1│ .OFFSET 0 2│ .DS.B 1 3│ .ALIGN 16 *不具合発生 4│ .DS.B 16 5│ .TEXT HAS060.X では、.OFFSET セクションの .ALIGN 疑似命令の指定をオブジェク トファイルに出力しないように修正しました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .OFFSET セクションで .DS 疑似命令の引数にその行の行頭のシンボルを使用 するとエラーになる不具合 HAS.X v3.09 で .OFFSET セクションの .DS 疑似命令の引数にその行の行頭で 定義したシンボルを使用すると、エラー「illegal value」が発生してしまいま す。 例: .OFFSET セクションの .DS の不具合 ┌──────────────────────────── 1│ .OFFSET 0 2│x: .DS.B 1 3│y: .DS.B y-x *不具合発生 この不具合は、行頭のシンボルの定義と .DS 疑似命令の行を分けるとエラー が出なくなるという不自然な挙動をします。 例: .OFFSET セクションの .DS の不具合でエラーが出ない例 ┌──────────────────────────── 1│ .OFFSET 0 2│x: .DS.B 1 3│y: 4│ .DS.B y-x HAS060.X では、上記のいずれの例のプログラムも正しくアセンブルできるよ うになっています。 なお、.DS 疑似命令の引数は定数でなければならないので、.OFFSET セクショ ン以外のセクションで上記のような書き方をすると、常にエラーになります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .END の右側に注釈を書くとき実行開始位置のラベルを省略すると注釈の部分 を解釈しようとする不具合 例: .END の不具合 ┌──────────────────────────── 1│ .END *先頭から開始 *不具合発生 上記の例を HAS.X v3.09 でアセンブルしようとすると、「“先頭から開始” というシンボルが見つからない」というエラーが出てしまいます。これは“*” 以降を注釈と見なしていないためです。 .END の実行開始位置の指定にロケーションカウンタを示す“*”が入ることは ないので、HAS060.X では .END の右側に“*”または“;”があるときはそれ以 降を注釈と見なして無視します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .ENDIF が足りないと異常な動作をすることがある不具合 HAS.X v3.09 で .IF の条件成立部のまま .ENDIF が足りない状態でソースフ ァイルが終了してしまったとき、エラー「missing if」の後に存在しない行番号 を示したエラーメッセージが大量に通知されることがあります。 例: .ENDIF が足りないときの不具合 ┌──────────────────────────── 1│ .IF 1 *EOF の後に不具合発生 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ●シフト・ローテート命令のイミディエイトオペランドが 1〜8 の範囲外のとき のエラーメッセージが不適切 例: シフト・ローテート命令のエラーメッセージの不具合 ┌──────────────────────────── 1│ LSR.W #0,D0 *不具合発生 HAS.X v3.09 では、上記の命令をアセンブルしようとすると、エラー 「illegal quick size」が通知されます。 HAS060.X ではエラーメッセージの日本語化に伴ってエラーやワーニングのメ ッセージをできるだけ適切なものに変更してあります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ●メモリが極端に不足している状態で実行すると誤動作する可能性がある HAS.X v3.09 ではメモリ確保時のエラーチェックが不完全だったため、メモリ が極端に不足している状態で実行するとバスエラーが発生する可能性がありまし た。また、CV.X などで .R 形式に変換した場合は、メモリ不足のメッセージを 出して終了した場合に直後のメモリブロックの一部が破壊されている可能性があ りました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ●コマンドラインでの“=”の扱いがおかしい HAS.X v3.09 では、コマンドラインに“=”で始まる単語があるとバスエラー などが発生してハングアップします。また、ソースファイル名、-t のパス名、 -i のパス名、-o のオブジェクトファイル名、-p のリストファイル名に“=”を 含めることができませんでした。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● -o./foo のように記述すると拡張子の .o が補完されない不具合 HAS.X v3.09 では、オブジェクトファイル名の指定に拡張子以外の“.”が含 まれていると、拡張子があると判断されて .o が補完されませんでした。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● .IF などの引数に浮動小数点数が含まれていると期待通りの動作をしない不 具合 これは HAS.X v3.09 で .IF などの疑似命令の引数のエラーチェックが甘すぎ ることによって発生する仕様バグです。 例: .IF の引数に浮動小数点数が含まれているとき ┌──────────────────────────── 1│FOO FEQU 1.0 2│ .IF FOO<>1.0 *条件は成立しないはずなのに 3│ NOP *成立したことになってしまう 4│ .ENDIF 上の例では、不等号以降が無視されて FOO(=1.0)だけが .IF の条件として 使用されるため、条件が成立したと見なされてしまいます。 HAS.X v3.09 では浮動小数点数を含む式で比較演算子が使えないのですが、そ れを忘れて上の例のような記述をしてしまってもエラーにならず、アセンブルさ れたプログラムの原因不明のバグのもとになることがあります。 HAS060.X では浮動小数点数同士の比較ができるので、上の例のような記述を した場合でも期待通りにアセンブルされます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 1 つのマクロの中のローカルシンボルが多すぎるとバスエラーなどの致命的 なエラーが発生することがある不具合 HAS.X v3.09 では、マクロ定義中に使用されるローカルシンボル名のバッファ が小さく、溢れのチェックが行われていなかったため、1 つのマクロの中のロー カルシンボルが多すぎると他のワークエリアが破壊されて正常に動作しなくなっ ていました。 HAS060.X でも 1 つのマクロの中で定義できるローカルシンボルのバッファの サイズに上限がありますが、バッファのサイズを大幅に増やしてあり、溢れのチ ェックも行っています。なお、バッファが溢れたときはエラー「1 つのマクロの 中のローカルシンボルが多すぎます」で通知しますが、アセンブラの構造上、処 理の続行が難しいので、このエラーが出るとその行でアセンブルが中止されます。 その場合は、ローカルシンボルを減らすか、マクロを分割するなどして対処して 下さい。 HAS060.X でも、-p を指定するとまだこの不具合が発生することがあるようで す。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 文字列→浮動小数点数変換で正確に表現できる数に誤差が入る不具合 例: 1.000 が 1 にならない ┌──────────────────────────── 1│ .CPU 68030 2│ FMOVE.X #1.000,FP0 ┌──────────────────────────── 7│ 1 00000000 .CPU 68030 8│ 2 00000000 F23C48003FFE0000 FMOVE.X #1.000,FP0 9│ FFFFFFFFFFFFFFFF HAS.X v3.09 は文字列の 1.000 を (((1*10+0)*10+0)*10+0)*(0.1*0.01) とい う計算で数値に変換します。単精度でも正確に表現できる 1.000 を拡張精度で も正確に表現できない 0.1 や 0.01 を使って作ろうとするので誤差が入ります。 HAS060.X は文字列の末尾の 0 を省いて仮数部の桁数を減らした上で 10 の指 数が負になるときは 10 の正の累乗で割ります。仮数部が 19 桁以内で仮数部を 整数とみなしたときの指数部が -27〜+27 の範囲内ならば拡張精度で表現できる 最も近い浮動小数点数に変換できます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● BRA.L の後に .CPU 68000 があるとアセンブルできない不具合 HAS.X v3.09 は BRA.L/BSR.L/Bcc.L や (bd.L,PC) などのロングワードサイズ の PC 相対オフセットの後に .CPU 68000 があるとエラーになります。 BRA.L の後に .CPU 68000 があってアセンブルできない例 ┌──────────────────────────── 1│ .CPU 68020 2│FOO: 3│ BRA.L FOO *不具合発生 4│ .CPU 68000 この例のプログラムは 3 行目の BRA.L に対して「illegal relative error」 が通知されてアセンブルできません。4 行目の .CPU 68000 を消すとアセンブル できるようになります。 原因はパス 2 以降で擬似命令 .CPU の位置でアセンブル対象の CPU を切り替 える処理が欠落しているためです。パス 3 で 1 行目の .CPU 68020 が処理され ず、3 行目の BRA.L を出力するときアセンブル対象の CPU が 68000 のままな ので、ロングワードサイズのオフセットがエラーになります。 HAS060.X はパス 2 以降もアセンブル対象の CPU が切り替わります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (EOF)