countersince January 6, 2001X68000 LIBRARYEnglish
更新日: 2023 年 7 月 10 日
X68000 LIBRARY > ソフトウェアライブラリ > プログラミング > アセンブラ > HAS060.X > 既知の不具合

既知の不具合

説明

HAS060.X の添付ドキュメントです。

KNOWNBUG.DOC
────────────────────────────────────
                  High-speed Assembler ─ 68060 対応版
                        HAS060.X version 3.09+89

                           < 既知の不具合 >

                               2016/08/07
                                M.Kamada
────────────────────────────────────


━< 修正されていない不具合 >━━━━━━━━━━━━━━━━━━━━━

 以下の不具合は HAS.X v3.09 に存在したものですが、HAS060.X v3.09+89 で
も修正できていません。


● (d,An) の d が 0 でも (An) に置き換えられない場合に対応していない

 これは仕様バグと言ってもよいでしょう。オブジェクトのサイズが 64KB 程度
までのアセンブリ言語で記述されたプログラムを最適化するとき、An をプログ
ラムの先頭から 32KB のあたり(BASE とします)に固定しておいて、オペラン
ドの xxx.L をすべて (xxx-BASE.W,An) に書き換えるという手法が使われること
があります。このとき、ディスプレースメントのサイズ(.W)を明記しておかな
いと、xxx が前方参照のシンボルで偶然 BASE と一致していた場合に、間違った
コードが出力されてしまいます。最適化の過程で一度でも一致するとその時点で
ディスプレースメントが削除されてしまうため、1 つのソースファイルで間違っ
た最適化が何度も行われることもあります。アセンブルされるプログラムの原因
不明のバグのもとになるので注意が必要です。

 極端な例を示します。

        例: (d,An) の最適化を間違えるプログラム
      ┌────────────────────────────
     1│BASE    .EQU    (*)+8
     2│        LEA.L   (BASE,PC),A6
     3│        JSR     (FOO-BASE,A6)
     4│FOO:    RTS

 上の例では、FOO=BASE なので JSR の行の FOO-BASE は 0 ですが、これを省
略してしまうと FOO の手前が 1 ワード減って FOO<BASE となり、FOO-BASE は
0 でなくなってしまいます。つまり、このディスプレースメントは 0 であって
も省略することができません。しかし、これを HAS.X v3.09 や HAS060.X でア
センブルすると、FOO-BASE が省略されて、次のようなプログラムに変化してし
まいます。

        例: (d,An) の間違った最適化の結果
      ┌────────────────────────────
     1│BASE    .EQU    (*)+8
     2│        LEA.L   (BASE,PC),A6
     3│        JSR     (A6)
     4│FOO:    RTS

これでは JSR のところで A6 が FOO+2 を指してしまっていますから、出力され
たオブジェクトは期待通りの動作をしてくれません。

 次のようにディスプレースメントのサイズを明記することで、この不具合を回
避することができます。

        例: (d,An) の間違った最適化を回避する
      ┌────────────────────────────
     1│BASE    .EQU    (*)+8
     2│        LEA.L   (BASE,PC),A6
     3│        JSR     (FOO-BASE.W,A6)
     4│FOO:    RTS

 この不具合はコマンドラインスイッチ -c(HAS.X v2.0x 互換の最適化を行う)
を指示すれば発生しませんが、HAS060.X では (d,An) の最適化だけ禁止するた
めのコマンドラインスイッチ -c1 が新設されています。-c1 については、動作
マニュアル(HAS060.DOC)を参照して下さい。


●マクロ内に記述した .INCLUDE の効果がマクロの展開後に現れる

 仕様バグです。マクロ内で疑似命令 .INCLUDE を使うと、その効果がマクロの
展開後に現れます。これでは見た目の順序と結果が異なるので、かなり不自然で
す。

        例: マクロ内で .INCLUDE を使う

        <MAIN.S>
      ┌────────────────────────────
     1│FOO     .MACRO
     2│        .DC.B   'FIRST'
     3│        .INCLUDE        SUB.S
     4│        .DC.B   'THIRD'
     5│        .ENDM
     6│        FOO

        <SUB.S>
      ┌────────────────────────────
     1│        .DC.B   'SECOND'

        展開結果
      ┌────────────────────────────
     1│        .DC.B   'FIRST'
     2│        .DC.B   'THIRD'
     3│        .DC.B   'SECOND'


●参照されなかったシンボルが未定義シンボルとして通知されることがある

 最終的に参照されなかったシンボルが「未定義シンボル」として通知されるこ
とがあります。エラーにはならないので実害はありませんが、やや不自然です。

 例えば、REG シンボルで他のシンボルを参照しているとき、参照されたシンボ
ルが未定義でも REG シンボルを使用しなければエラーにはなりませんが、その
とき参照されたシンボルが「未定義シンボル」として通知されてしまいます。

        エラーにならないが「未定義シンボル」が通知される例
      ┌────────────────────────────
     1│FOO     REG     ZOO

 上の例では、ZOO が未定義でも FOO を参照していなければエラーにはなりま
せんが、ZOO が「未定義シンボル」として通知されてしまいます。


●マクロ内ローカルシンボルが極端に多いソースを -p を指定してアセンブルす
るとハングアップすることがある

 HAS.X v3.09 では -p を指定しなくてもハングアップしますが、HAS060.X で
はやや改善されています。


● .TAG がエラーになってしまうことがある

 .TAG を使用しているソースリストをアセンブルするとき、AS.X ではエラーに
ならないのに、HAS.X v3.09 と HAS060.X ではエラーになってしまってアセンブ
ルできないことがあります。この影響で、XC で /Ns を指定してコンパイルした
プログラムがアセンブラを通らないことがあります。


● .DC.B 1.0 がエラーになる

        例
      ┌────────────────────────────
     1│        .DC.B   1.0             *不具合発生
     2│        .DC.W   1.0
     2│        .DC.L   1.0


● 式が長すぎるとバスエラーなどの致命的なエラーが発生する

        例
      ┌────────────────────────────
     1│X       REG     1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
     2│        .DC.L   X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X



━< HAS060.X に特有の不具合 >━━━━━━━━━━━━━━━━━━━━

 HAS060.X に特有の不具合で v3.09+89 までに修正されていないものは以下の
通りです。


● ColdFire への対応が不完全

 資料不足のため、ColdFire への対応は暫定的なものになっています。また、
実際に HAS060.X でアセンブルしたプログラムを ColdFire で動かした実績が皆
無なので、不具合が残っていると思われます。

 ColdFire の一部の命令に対応できていません。分かっている限りでは、以下
の命令がアセンブルできません。

        剰余演算命令
                REMS    REMU    (5300/5400のみ)


● .DEFINED. の挙動が不自然

 .DEFINED. で同じ行の行頭のシンボルを検査すると「未定義」と判断されてし
まいます。本来は「定義済み」と判断するべきです。

        例: .DEFINED. が同一行の行頭のシンボルに反応しない
      ┌────────────────────────────
     1│FOO:
     2│        .DC.B   .DEFINED.FOO    *$FFになる
     3│ZOO:    .DC.B   .DEFINED.ZOO    *$00になる

 .DEFINED. で同一行の行頭のシンボルを参照しないようにして下さい。

 また、.DEFINED. で検査したシンボルが未定義だったとき、アセンブル終了時
にそのシンボルが「未定義シンボル」として通知されてしまいます。エラーには
ならないので実害はありませんが、不自然です。


● .OFFSYM セクションで「アラインメントが不正です」が間違って通知される
ことがある

        例: .OFFSYM セクションで間違ったワーニングが出る
      ┌────────────────────────────
     1│        .OFFSYM 0,FOO
     2│        .DS.B   1
     3│        .DS.W   1               *間違ったワーニングが出る
     4│FOO:

 上の例では、3 行目のロケーションカウンタは最終的に -2 になるので、
.DS.W のアラインメントはあっています。しかし、HAS060.X 自身が 3 行目の
.DS.W に関するアラインメントチェックをシンボル FOO が確定する前に行って
しまうため、その時点でのロケーションカウンタの値(この例では 1)によって
「アラインメントが不正です」というワーニングが出てしまいます。

 なお、今のところ、.OFFSYM セクションでは .EVEN/.QUAD/.ALIGN によるアラ
インメント調整はできません。


●不適切なメッセージが出る場合があると思われる

 エラーメッセージの日本語化によって具体的なメッセージを表示するようにな
っていますが、その影響で従来は簡単な英単語で誤魔化されていたメッセージが
明らかに不自然に見える場合があると思われます。メッセージを細分化すること
である程度は改善していますが、まだ十分ではありません。

 メッセージがおかしいと思われた場合は報告して下さい。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 HAS060.X v3.09+89 では上記以外の不具合は確認されていません。

 過去に存在した不具合で既に修正されたものについては、HAS060.X で修正さ
れた HAS.X v3.09 の不具合(DEBUGGED.DOC)または更新履歴(HISTORY.DOC)を
参照して下さい。

 上記以外の不具合を発見された場合は、改造者(M.Kamada)まで、速やかに報
告して下さい。連絡先は README.DOC を参照して下さい。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

(EOF)