CPU実験室

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

アセンブラ動作

モニタプログラムの修正をやっていますが機能追加でだんだんサイズが大きくなっていく過程で全く動作しないプログラムができることがあります。アセンブル、飛び先修正が正常に終了しているのに何故なんだろうと。改造の時に変な処理を入れ込んだのかとソース差分を見たりしていたのですがリスティングファイルを開いたら意外なことがわかりました。

なんと全くコードを生成していない行があります

それも1つや2つではなくラベルを参照する相対アドレスをオペランドにもつ行が全滅です。もちろんこれらのラベルは同じソース内に既存であるんですが・・・

と思ったらこれからサブルーチンを作ろうとして呼出し側だけ作っていた未定義ラベルが1つだけあることに気付きました。つまり1個でも参照が解決しないと、参照がある全てのコードは生成しない。しかもエラー、ワーニングも出さないという謎仕様のようです。

ラベルの2重定義は検出するんですけどね・・・

未定義ラベルがエラーにならないとか、既知の問題:飛び先アドレスがおかしい、というのは実はアセンブラの後にリンカみたいなものがあってそこでアドレス解決をするんじゃないかとも考えましたが、そういうツールは無いし最初からアブソリュートバイナリを生成してしまう訳で、やはりアセンブラ自体も開発途上なんでしょうか