タイトルとは関係ないけど、↑の話の続きなので…
セグメント配置の話
前回、COM形式のファイルの中で、コードとデータが混在するような場合に、セグメントを分割してグループ化する話をしました。
そもそも、そんな面倒なことをしなければならなかったのは、コードセグメント(CSEG)の中にデータを配置すると、デフォルトセグメントがCSになるので、メモリをアクセスする時に、CS:のプリフィックスコードがついてしまうからでした。
ここで、コードセグメントではなく、データセグメントに入れたらいいんじゃない?
ということを思いつきました。
実際にやってみたら、うまくいきます。
プログラムコードをデータセグメントに入れても、ジャンプするたびにCS:プリフィックスを強制的につけられるということはないようです。
セグメントを分けずに、すべてDSEGの中に入れたらOKでした。
_TEXT DSEG 'CODE'
という、「えっ、何か間違ってない?」と、思わずツッコミたくなるようなセグメント定義をするとよいようです。
以上、たぶん誰の役にも立たないであろう知識でした。
Watcomアセンブラの話
色々と調べていた中で、Watcomアセンブラが、Windows10上で動いて、かつ、MS-DOSコードを出力することができることを知りました。
当然、R86とは互換性がなく、MASM互換となっています。
32bitベースのソフトなので、PC-88VA上では動きませんが、アセンブルを88VA上でやる必然性はありません。
こちらのアセンブラは、
AND BX,3
のようなコードを AND reg16,imm8 のコードで出力します。
これで、DBを使ってコードを直接埋め込む必要はなくなるかな?と思っていたら、そうはいきませんでした。今度は、
CMP ax,1
というコードに、差異が出ました。
Watcomは、これもCMP reg16,imm8にするのですが、元のコードはCMP reg16,imm16のまま。
こちらの場合、どちらも3バイトで、imm8にしたところで、何もメリットが無いからです。
同様なことが、
SUB ax,12h
というコードでもありました。
まあ、正直、どっちでもいいですが、やっぱりアセンブルした結果が、元と同じになってほしいので、ここはDBでコードを埋め込むことにしました。
なかなか素直に同じコードを出してくれないものですね。
↓この話の続きはこちら