更新日: 2023 年 7 月 10 日
改良構想メモ (旧)
説明
HAS060.X の添付ドキュメントです。
PROJECTS.DOC
────────────────────────────────────
High-speed Assembler ─ 68060 対応版
HAS060.X version 3.09+87
< 改良構想メモ >
1999/11/17
M.Kamada
────────────────────────────────────
ハイスピードアセンブラ HAS060.X に「こんな機能が欲しい」と思われるもの
を、これまでに HAS060.X を利用されている方から要望があってまだ実装されて
いないものも含めて、リストアップしてみました。
これらの機能は HAS060.X v3.09+86 までに実装されておらず、本当に実現で
きるかどうかすら定かでないものもあります。「絶対にできない」あるいは「絶
対にやらない」というものは除外しましたが、詳しく吟味していない案もありま
す。
以下の構想は削除される場合があります。
実現度の目安として、独断と偏見によって構想を大まかに 4 段階に分類して
あります。あくまでも目安です。目安は変わることがあります。
◎ … やりたい
○ … やってもよいかも知れない
△ … やらないかも知れない
× … たぶんやらない
以下の構想について、「これはこういうふうに実装して欲しい」あるいは「こ
れはやらないで欲しい」といった意見があれば教えて下さい。また、ここに挙げ
られているかどうかに関わらず、「これは是非実現して欲しい」というアイデア
があれば教えて下さい。
┌───────────────────────────┐
│ ・・・・・・・・ │
│ご注意: 以下の機能は、まだ実装されていないものです。│
│ │
└───────────────────────────┘
━<マクロ関連>━━━━━━━━━━━━━━━━━━━━━━━━━━━━
△マクロ定義中に数字ローカルラベルが使用されたら警告またはエラー
マクロ展開を跨ぐ数字ローカルラベルが予期しない場所を参照するのを防ぐ。
マクロを展開するとき、その直前と直後で .text や .data と同様にローカル
ラベルのスコープを分断する方法もある。しかし、マクロを二重に展開するとき
に外側のマクロと内側のマクロが同じ数字ローカルラベルを使っている場合はそ
のスコープを制限できないので、マクロの中では数字ローカルラベルを使えない
ことにしたほうが安全。
例えば、
inside .macro
moveq.l #2-1,d2
@@: moveq.l #2-1,d3
@@:
dbra @b,d3
dbra @@b,d2
.endm
outside .macro
moveq.l #2-1,d0
@@: moveq.l #2-1,d1
@@: inside
dbra @b,d1
dbra @@b,d0
.endm
outside
の展開結果は、
moveq.l #2-1,d0
@@: moveq.l #2-1,d1
@@:
moveq.l #2-1,d2
@@: moveq.l #2-1,d3 ←─┐
@@: ←┐│
dbra d3,@b ─┤│
dbra d2,@@b ─┼┤
dbra d1,@b ─┘│
dbra d0,@@b ──┘
となり、期待通りに動作しない。
×マクロ展開後のソースを出力する機能
マクロが展開されるだけで、アセンブル可能なソースを出力すること。
FPPP や未実装命令の展開も同時に行う?
×マクロ定義の &〜 およびマクロ展開の %〜 によるシンボル参照の直後に文字
列を連結する手段
━<ローカルラベル関連>━━━━━━━━━━━━━━━━━━━━━━━━
◎定義されながら参照されなかった数字ローカルラベルを警告する
この警告はスイッチで ON/OFF(または警告レベルを上下)できたほうがよい。
△数字ローカルラベルが .text や .data を跨げないようにするスイッチ
.text セクションが続いていても、ルーチンの先頭に毎回 .text と書くこと
で数字ローカルラベルのスコープを制限できるようにする。
@b や @f が .text を跨いでいるときエラーになれば、間違って隣のサブルー
チンの途中に飛び込んでしまうミスが減るはず。
ただし、
pea (@f,pc)
DOS _PRINT
addq.l #4,sp
.data
@@: .dc.b '〜',13,10,0
.text
のようなコードがアセンブルできなくなると困るので、オプションにする必要が
ある。
×名前付きローカルラベル
「@〜:」の形式で定義する。ただし、@b と @f は使用禁止。
名前付きローカルラベルの参照では、ローカルでないラベルを跨ぐことができ
ない。つまり、名前付きローカルラベルのスコープは、ローカルでないラベルと
ローカルでないラベルで囲まれた範囲とする。.text や .data を跨げないよう
にしてもよい。
スコープ内では「@〜」の形式で参照できる。
スコープの外側からローカルラベルを参照したいときは、スコープの先頭のロ
ーカルでないラベルを使って、「〜:@〜」の形式で参照できるものとする。
例:
subB:
move.w countB,d0
bra subA:@dbra ──┐ subA の @dbra へ
│
: │
│
subA: ─┴┐
move.w countA,d0 │
bra @dbra ──┐│@dbra へ
││
@loop: ←┐││
: │││
@dbra: ←┼┴┘
dbra d0,@loop ─┘ @loopへ
ローカルでないラベルの間に同一名称のローカルラベルが複数存在した場合は
エラー。
プログラムの先頭で、まだローカルでないラベルが定義されていない場所に記
述されたローカルラベルの参照は「:@〜」となる。
× .irp/.irpc/.rept の中で .local でローカルシンボルを定義できる
「@〜:」が自動的にマクロ内ローカルラベルと同じ扱いになれば、.local で
定義する必要はない。
━<シンボルおよびセクション関連>━━━━━━━━━━━━━━━━━━━
◎シンボルを未定義にする疑似命令 .undef
◎ .offsym 中にアラインメント調整ができるようにする
.offsym 中に .even/.quad/.align が書けるようにする。
○ .offsym の初期値に定数以外を指定できるようにする
.offsym の初期値でテキストセクション内のシンボルを指定できたりするとよ
いかも知れない。
○グローバル宣言されながら定義も使用もされなかったシンボルをオブジェクト
に残さない
オブジェクトに余計なシンボルが残らないようにすることで、余計なライブラ
リがリンクされる可能性を減らす。
使用しないシンボルを故意にグローバル宣言することで実行ファイルに特定の
オブジェクトを埋め込むプログラムがあるので、削除するかどうかをオプション
で選択できるようにする。
各々のグローバルシンボルが参照された回数を表示できると、プロファイルに
使えて便利。
△ .offsym の末尾を基準にするバージョン .offend
例えば、
.offend 0
prev: .ds.l 1
proc: .ds.l 1
tail: .ds.l 1
next: .ds.l 1
.text
は、
.offsym 0,start
prev: .ds.l 1
proc: .ds.l 1
tail: .ds.l 1
next: .ds.l 1
start:
.text
と同じで、シンボルが 1 つ少なくて済む。
△ .dc のデータ長の取得
「L'ラベル」の型式で、ラベルの行に書いてある .dc 疑似命令のデータ長を
取得できる。
LASCII 型のデータが記述しやすくなる。
name: .dc.b L'trunk
trunk: .dc.b 'hippopotamus'
ただし、LASCII に限れば、
LASCII .macro str
.dc.b @btm-@top
@top: .dc.b str
@btm:
.endm
name: LASCII 'hippopotamus'
とした方が可読性がよい。
△ダミーセクション .dsect(または .offset 疑似命令の機能拡張)と疑似命令
.using/.drop
疑似命令 .dsect または .offset で、セクション名付きの abs セクション
(ダミーセクション)を定義する。
セクション名 .dsect|.offset [初期値]
シンボル1:
:
シンボル2:
:
.text
疑似命令 .using でアドレスレジスタにダミーセクションを割り当てると、そ
のダミーセクションで定義されたシンボルを使ったアドレッシングが指定された
アドレスレジスタをベースレジスタとするアドレスレジスタ間接アドレッシング
に自動的に変化する。
.using セクション名,An
シンボルn+d.WL → (シンボルn+d.WL,An)
シンボルn+d.WL(Xi.WL*SF) → シンボルn+d.WL(An,Xi.WL*SF)
(シンボルn+d.WL,Xi.WL*SF) → (シンボルn+d.WL,An,Xi.WL*SF)
疑似命令 .drop で割り当てを解除できる。
.drop セクション名|An
△データセクションの名前付きサブセクション
疑似命令 .loctr(または .data)で名前付きサブセクションの開始を宣言す
る。
.loctr サブセクション名
:
または、
.data サブセクション名
:
.text や .data でサブセクションを終了することができるが、.loctr をパラ
メータなしで記述すれば、サブセクションを開始する前のセクションに戻すこと
ができる。
.loctr
同じ名前のサブセクションは 1 つにまとめられて、データセクションの末尾
に整理される。
例えば、
:
.loctr msgtbl_section
msgtbl:
msgnum = 0
:
.text
:
DEFINE_MESSAGE .macro lab,str
lab equ msgnum
msgnum = msgnum+1
.loctr msgtbl_section
.dc.l @msg
.loctr msgstr_section
@msg: .dc.b str,13,10,0
.loctr
.endm
:
DEFINE_MESSAGE SYNTAX_ERROR,'Syntax error'
DEFINE_MESSAGE OVERFLOW_ERROR,'Overflow error'
:
moveq.l #OVERFLOW_ERROR,d0
bra draw_message
:
draw_message:
lea.l msgtbl,a0
asl.l #2,d0
move.l (a0,d0.l),a0
bra print
:
とすると、
:
.text
:
SYNTAX_ERROR equ 0
OVERFLOW_ERROR equ 1
:
moveq.l #OVERFLOW_ERROR,d0
bra draw_message
:
draw_message:
lea.l msgtbl,a0
asl.l #2,d0
move.l (a0,d0.l),a0
bra print
:
.data
:
msgtbl:
.dc.l ??0001
.dc.l ??0002
:
??0001:
.dc.b 'Syntax error',0
??0002:
.dc.b 'Overflow error',0
:
となる。
サブセクションの内容はオブジェクトファイルにはデータセクションの一部と
して出力される。サブセクションの情報はオブジェクトファイルに出力されない
ので、複数のソースファイルで同じ名前のサブセクションを定義してもそれが実
行ファイルで 1 つにまとめられるわけではない(それをやるにはリンカにも手
を加える必要がある)。
━<最適化関連>━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◎ move.bwl #0,<mem> → clr.bwl <mem> の最適化
68020 以上ならば -c4 のとき無条件に最適化してよいと思われる。
68000/68010 のとき clr <mem> でデスティネーションオペランドに対するリ
ードが発生してしまうので最適化していなかったが、副作用がないと分かりきっ
ている場合に -cclr を指定すれば最適化されるようにする。
-c4 が指定されたとき、move.bwl #0,<mem> の <mem> のベースレジスタが a7
ならば無条件に最適化するという手もある。
━<ワーニング・エラー関連>━━━━━━━━━━━━━━━━━━━━━━
◎ illegal alignment をエラーにする
アセンブルできなくなるプログラムがある可能性があるので、オプションで指
定できるようにする。
illegal alignment が連続しているときは、1 回だけ通知する。
68020 以上の .dc/.dcb/.ds はワーニングで、それ以外はエラー?
○マクロ展開中にワーニングやエラーが発生したとき、マクロを展開した行だけ
でなく、そのマクロの定義のどの行に該当するかを通知する
マクロ展開中のワーニングやエラーの位置がわかりにくいので。
○最適化終了後に限ってエラーを出す疑似命令
最終的に生成されたオブジェクトのサイズに対してエラーチェックを行いたい。
「最後の仕上げ」の意で、
.finish <条件式>
で条件式が 0 ならエラーとか。ただ、これだと .fail と条件が逆になって分か
りにくいので、.fail と同じ条件にするのにふさわしい単語があればそれを採用。
数値を表示できれば、サイズをどれだけ調整すればよいかがわかる。
プログラムのサイズについては .org でチェックできるとなおよい。
○アセンブル中にメッセージを出す疑似命令 .error/.warn/.message
メッセージは '〜' か?
式の値も表示できるとよい。
パス 1 で出すか、それともパス 3 で出すか?
シンボルの値がすべて確定するのはパス 2 が終わった後なので、パス 3 でな
ければ通知できない条件もあり得る。
例:
.message 'ipl size: ',ipl_end-ipl_start
例:
.error ipl_end-ipl_start>1024,'ipl size: ',ipl_end-ipl_start
○ .include などでファイルが見つからなかったとき、エラーメッセージでファ
イル名を表示する
見つからなかったファイルを確認するためにソースを見るのは面倒。
━<アセンブルリスト関連>━━━━━━━━━━━━━━━━━━━━━━━
△ .insert のデータをアセンブルリストに出力しない
━<その他・特殊機能>━━━━━━━━━━━━━━━━━━━━━━━━━
○インデックス付き PC 間接アドレッシングのディスプレースメントが外部参照
の場合、-e を指定すると 32 ビットディスプレースメントになるが、これを 16
ビットにするオプション
アドレスレジスタ間接の場合は従来通りとする。
○ .if の条件式の値が abs 以外のセクションにある場合は真とみなす
マクロのパラメータにアドレスと 0 のいずれかを指定できるようにしたい場
合などに使う。
○疑似命令 .super/.user
.super
以降はスーパーバイザモード。
特権命令の使用を許可。
read/write の回数が変化する最適化を禁止。
(68000 のとき MOVE.bwl #0,<ea> → CLR.bwl <ea> を禁止)
.user
以降はユーザモード。
特権命令の使用でワーニングまたはエラーを出す。
read/write の回数が変化する最適化を許可。
(68000 のとき MOVE.bwl #0,<ea> → CLR.bwl <ea> を許可)
68010 以上のとき MOVE from SR → MOVE from CCR。
3 つのモードをオプションで選択
(a) 初期状態は .super(デフォルト)。
(b) 初期状態は .user で、特権命令の使用をワーニングで通知。
(c) 初期状態は .user で、特権命令の使用をエラーで通知。
特権命令の許可/禁止、最適化の制御などの各機能を個別に指定できる方がよ
い?
○値のセクションを返す演算子
マクロのパラメータの値の種類を調べたい場合などに使う。
△別バージョンで、FPPP を吸収した FPPPHAS.X のようなものを用意する
直接オブジェクトファイルを出力するだけでなく、変換後のコードをソースコ
ードとして出力できると、手で最適化できるので便利。
×文字列を操作する演算子
マクロのパラメータを解析したい場合などに使う。
×疑似命令 .org を拡張して、以降のオブジェクトを特定の位置から開始できる
ようにする
最適化終了までロケーションカウンタのチェックと修正を続ける。.align と
同様にパディング値を指定できる。ただし、リンカが対応していないので、複数
のオブジェクトファイルにまたがって指定することはできない。
オブジェクトが重なってしまうときはエラー。
オブジェクトのサイズを確認することができる。
×疑似命令 .org を拡張してロケーションカウンタを減らし、オブジェクトを上
書きできるようにする
疑似命令 .org に現在のセクションの中で現在のロケーションカウンタよりも
手前の位置を指定することで、ロケーションカウンタを減らしてプログラムやデ
ータを上書きできる。
ラベル:
:
.org ラベル-n
:
.org ラベル+n
:
または、
.org (*)-n
パラメータなしの .org で、ロケーションカウンタが変更前の位置に元に戻る。
.org
×実際にアセンブルするソースと、アセンブルリストやエラーメッセージに使う
ソースを分けて与えられるようにして、参照するソースファイル名や参照する行
番号を指定するための疑似命令を追加する
プリプロセッサ用。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(EOF)