2022年02月08日

Pic24MC68Kマイコン(その10)CP/Mアセンブラの謎

 前回の「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事で書いたように CP/M-68 のアセンブラ(as68)でソース内で offset セクションで宣言したシンボルがあるとリンカー(lo68 及び link68 共に)でオブジェクトファイル読込み時にエラーが発生してリンクが出来ません。

 「CP/M-68K Programmer's Guide」にはoffset については下図のように「(offset宣言で作成した)ストレージ定義はリンカーに渡されません」と言うようなことが書いてあります。











Programmer's Guidでのoffsetに関する記述







 下図はエラー(File Format error: Invalid symbol flags = 100100)発生の再現実験した時の画面キャプチャーです。











offset 属性シンボルのリンク時のエラー







 マニュアルには説明があるのに実際には使えないというのは実に気になりますね。
 下図は上のソースをアセンブルして生成された test.o のダンプ画面のキャプチャです。











test.o のダンプ







 赤丸で囲った部分が offset 属性のシンボルのタイプデータになります。ファイルヘッダの構造は Programmer's Guide に書かれている実行ファイルのものと同様で、シンボルデータの構造は
  char name[8];
WORD type;
LONG value;
のようになっているようです。また、上のダンプからタイプの値は
    equ   : C000H
data : 8400H
text : 8200H
bss : 8100H
offset: 8040H
であることが判ります。

 再度、「CP/M-68K Programmer's Guide」を確認したところ、シンボルタイプについての記述がありました。











シンボルタイプ







 やはり、offset シンボルタイプの値の 8040H に該当するものはありませんね。
 しかし、ここまで解れば、object ファイル内の offset 属性シンボルを equ 属性シンボルに変更すればリンクできそうであるということが推測できます。

 試しに 上記の変換機能を有するシンボル変換ツール(convsym)を作って、冒頭で図を貼った test.s のオブジェクトファイルを変換してリンク&実行してみた結果が下記になります。想定外の TRAP が発生することもなく、正常に終了しています。



 L>n:convsym test.o te.o
convert test.o to te.o
Text:0000000A Data:0000000E Bss:00000006 Symbol:0000007E
a001 00000000 a002 00000002 a003 00000006
te.o is created.
L>a:lo68 -r -o test.rel te.o

L>test.rel

L>


 前回の「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事では offset 属性のシンボルがあるとリンクエラーが発生するので ソース内の offset シンボルを全て equ 宣言に書き換えて対応しましたが、元の offset 宣言のソースから作成したオブジェクトファイルを今回作成した convsym ツールで変換後にリンクすることで ehBASIC も問題無く動作しました。^^
 equ 宣言ではソースのメンテ性が悪くなるので、ehBASIC のアセンブラソースも offset 宣言に戻しました。

 変換時の画面キャプチャが下図になります。変換された offset 属性のシンボル名が値と共に表示されます。











convsym での変換状況







 使用する人は居ないとは思いますが今回作成したシンボル変換ツールも前回記事の末尾で公開しました。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
posted by skyriver at 18:30| Comment(0) | 68K | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください