SSブログ
English Version

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

 前回の「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] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。