Pic24MC68Kマイコン(その10)CP/Mアセンブラの謎 [68K]
前回の「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事で書いたように CP/M-68 のアセンブラ(as68)でソース内で offset セクションで宣言したシンボルがあるとリンカー(lo68 及び link68 共に)でオブジェクトファイル読込み時にエラーが発生してリンクが出来ません。
「CP/M-68K Programmer's Guide」にはoffset については下図のように「(offset宣言で作成した)ストレージ定義はリンカーに渡されません」と言うようなことが書いてあります。
下図はエラー(File Format error: Invalid symbol flags = 100100)発生の再現実験した時の画面キャプチャーです。
マニュアルには説明があるのに実際には使えないというのは実に気になりますね。
下図は上のソースをアセンブルして生成された test.o のダンプ画面のキャプチャです。
赤丸で囲った部分が offset 属性のシンボルのタイプデータになります。ファイルヘッダの構造は Programmer's Guide に書かれている実行ファイルのものと同様で、シンボルデータの構造は
再度、「CP/M-68K Programmer's Guide」を確認したところ、シンボルタイプについての記述がありました。
やはり、offset シンボルタイプの値の 8040H に該当するものはありませんね。
しかし、ここまで解れば、object ファイル内の offset 属性シンボルを equ 属性シンボルに変更すればリンクできそうであるということが推測できます。
試しに 上記の変換機能を有するシンボル変換ツール(convsym)を作って、冒頭で図を貼った test.s のオブジェクトファイルを変換してリンク&実行してみた結果が下記になります。想定外の TRAP が発生することもなく、正常に終了しています。
前回の「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事では offset 属性のシンボルがあるとリンクエラーが発生するので ソース内の offset シンボルを全て equ 宣言に書き換えて対応しましたが、元の offset 宣言のソースから作成したオブジェクトファイルを今回作成した convsym ツールで変換後にリンクすることで ehBASIC も問題無く動作しました。^^
equ 宣言ではソースのメンテ性が悪くなるので、ehBASIC のアセンブラソースも offset 宣言に戻しました。
変換時の画面キャプチャが下図になります。変換された offset 属性のシンボル名が値と共に表示されます。
使用する人は居ないとは思いますが今回作成したシンボル変換ツールも前回記事の末尾で公開しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
「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] [ 前へ ] 連載記事 [ 次へ ]
コメント 0