If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
X68k/Assembler: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
m (Xkeeper moved page X68k:Assembler to X68k/Assembler: normalize subpages and titles) |
||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
{{subpage|game=Sharp X68000}} | |||
<pre> - ASSEMBLER MANUAL - | |||
============================================================================== | ============================================================================== | ||
Line 1,271: | Line 1,272: | ||
============================================================================== | ============================================================================== | ||
</ | </pre> |
Latest revision as of 02:42, 24 January 2024
This is a sub-page of X68k.
- ASSEMBLER MANUAL - ============================================================================== ・環境変数 include インクルードファイルの置かれているディレクトリをフルパスで指定する. temp テンポラリファイルを作成するディレクトリをフルパスで指定する. HAS 常に使用するオプションスイッチを指定する. 設定されたオプションスイッチ はコマンドラインの最後に追加される為、取り消す事は出来ないので注意する こと. ============================================================================== ・オプションスイッチ -8 シンボルの識別長を8バイトにする シンボルの識別長を8バイトまでに制限する. この結果、先頭から8バイトが等 しい2つのシンボルは同じものとして扱われる. -b ロングワードの PC 間接を絶対ロングにする 32bitディスプレースメントの PC 間接アドレッシングやブランチ命令で、絶 対ロングアドレッシングに変換可能なものをそれに変換する. 変換が行われるのは以下のアドレッシングや命令で、"adr"のディスプレース メントが16bitで表現出来なくなると変換が行われる. (adr,pc) → adr.l bra adr → jmp adr bsr adr → jsr adr bcc adr → b<ccの反対条件> *+8 jmp adr (2命令に変換される) このスイッチは、68000/010で特に有効である. 68000/010では32bitディスプ レースメントが扱えないので、大きなプログラムで PC 間接やブランチ命令を 使用すると"illegal relative"エラーが発生する事があったが、このスイッチ を使うことでエラーになる場合の大部分で絶対ロングへの変換を行う. また、32bitディスプレースメントを使用しない事を指定する為に、擬似レジ スタ OPC(optional PC)、命令 jbra,jbsr,jb<cc> を使用することが出来る. これらを使用すると、-b スイッチの有無に関係なく、32bitディスプレースメ ントの代わりに絶対ロングアドレッシングを使用するようになる. リロケータブルなプログラムを作成する場合、このスイッチによる変換が行わ れると出力されるオブジェクトがリロケータブルではなくなってしまうので、 このスイッチは指定しないこと. -c HAS v2.x 互換の最適化を行う HAS v3.x では、v2.5 に比べてより小さなコードを出力する為に、新たに以下 の最適化を行うようになっている. 1)-a(絶対ショートアドレス対応モード)が標準となった 2)ディスプレースメント付きアドレスレジスタ間接の最適化 ディスプレースメントの値が0である場合には、それと等価なアドレスレジ スタ間接アドレッシングへの変換を行う. 3)次の命令へのブランチの削除 ブランチ命令(コプロセッサブランチ命令を含む)の飛び先が次の命令だった 場合には、命令自体を削除する. これらの最適化が追加された為、v3.x では同じソースをアセンブルした場合 でも v2.5 よりも小さなオブジェクトを生成する場合がある. この為に、命令 の自己書き換えを行うような一部のプログラムが正常に動作しなくなることが ある. -c スイッチを指定すると、これらの新たな最適化を行わなくなるので、 v2.5 と同じオブジェクトが得られるようになる. また、-a/-q スイッチの指 定が意味を持つようになる. 注意:このスイッチは将来削除される可能性がある. 上に挙げた最適化は、命 令やそのオペランドにサイズを明示する事で、このスイッチに依存しないソー スにした方が安全である. -d 全シンボルの外部定義指定 ソースファイル中で定義されているシンボルを、全て外部定義されているもの として扱う. これによって、そのソースファイル中の全てのシンボルは、リン クの際に他のモジュールから参照することが出来るようになる. -e 外部参照オフセットの標準をロングワードにする 68000/010では、ディスプレースメント付きアドレスレジスタ/PC 間接アドレ ッシングのオフセット(ディスプレースメント)サイズは16bit、インデックス 付きアドレスレジスタ/PC 間接のオフセットサイズは8bitと固定されていたが、 68020以降の CPU ではこれらのオフセットに32bit(ロングワード)の値が使用 出来るように拡張されている. アセンブラソースでこれらのアドレッシングが使用されると、アセンブラはオ フセットに使用された値からそのサイズを決定するが、オフセットに外部参照 値が使用されるとサイズを決定する事が出来なくなる. HAS.X ではこの場合、 68000/010と同様にディスプレースメント付き間接では16bit、インデックス付 き間接では8bitの値を出力するが、-e スイッチを指定すると、この場合に 32bit(ロングワード)の値を出力するようになる. また、68000/010ではブランチ命令のディスプレースメントサイズに8bitまた は16bitの値が使用でき、外部参照値が指定された場合には16bitを使用するよ うになっていたが、68020以降では32bitのディスプレースメントも使用できる ようになっている. これについても同様に、-e スイッチがない場合には16bit、 -e スイッチを指定すると32bitの値を出力する. ただし、オフセット値やブランチ命令にサイズを指定すると、このスイッチに 関係なく指定したサイズで出力される. このスイッチを使用すると、大きなオブジェクトをリンクする際にオフセット が届かなくなる事はなくなるが、生成される実行ファイルは68020以降専用と なる. CPU 指定が68000/010である場合には、このスイッチは意味を持たない. -f[<ページングモード>,<マクロ展開モード>,<表示桁数,<ページ長>] リストファイルのフォーマット指定 4つのパラメータによってリストファイルの出力フォーマットを指定する. 全てのパラメータを省略すると、-f0(ページング禁止)と同じ意味になる. デフォルトでは -f1,0,136,56 が指定されている. パラメータの意味は次の通り. ページングモード リストファイルをページ長ごとに改頁するかどうかを指定する. 0でページングを禁止し、1でページングを行う. マクロ展開モード ソースファイル中でマクロ展開が行われた場合に、展開された内容を リスト出力するかどうかを指定する. .sall/.lall 疑似命令と同様の 効果を持つ. 0でマクロ展開はリスト中に出力せず(.sall と同等)、1 でリスト中に出力する(.lall と同等). 表示桁数 リストファイルの表示桁数を指定する(.width 疑似命令と同等). 80~248の8の倍数を指定することが出来る. ページ長 改頁を行う場合のリストファイルのページ長を指定する(.page 疑似 命令と同等). 10~255までの値を指定することが出来る. -g SCD 用デバッグ情報の出力 SCD.X を使用してアセンブラソースのソースコードデバッグを行う為に、オブ ジェクトファイルにソースコードデバッグ情報を出力する. このスイッチを指 定すると、アセンブラがソースリストから自動的にデバッグ情報を出力する為、 デバッグ情報を明示する為のソースコードデバッグ疑似命令は全て無視される. アセンブラソースから得ることの出来るデバッグ情報が非常に少ない為、実際 にはソースリストの行番号とオブジェクトの対応が得られる程度になる. また、 SCD.X 自体の機能的な問題の為、C 言語のソースコードデバッグに比べてデバ ッグ機能がかなり制限される. -i<パス名> インクルードファイルのパス指定 アセンブル字にインクルードファイルを検索するための<パス名>を指定する. デフォルトでは、インクルードファイルはまずカレントドライブのカレントデ ィレクトリから検索され、そこにファイルが存在しなければ環境変数 include に設定されているパスから検索される. しかし、-i オプションを指定すると、 これらよりも先に、まずオプションによって指定されたパス名から検索される. -l タイトル表示の指定 アセンブルを実行する時にタイトル表示を行うようにする. -i オプションが指定されてなく、かつアセンブルがエラーなしで正常に終了 した時には、画面には何も表示されない. -m<cpu> アセンブル対象 CPU の指定 アセンブル対象となる命令セットを選択する為に、CPU を指定する. 指定可能なパラメータは以下の通り. -m68000 68000 -m68010 68010 -m68020 68020(+68881/882,68851) -m68030 68030(+68881/882) -m68040 68040(68040でソフトウェアエミュレーションの対象となっ ている68881/882命令もアセンブル出来る) このスイッチ指定は、.cpu 疑似命令による CPU 指定がない場合の標準として 使用される. CPU 指定は出来るだけソース中の .cpu 疑似命令によって行う事 を勧める. スイッチによる指定も .cpu 疑似命令による指定もなかった場合には、アセン ブル時の環境によって 68000/030 を選択する. X68000 上でアセンブルを行う 場合には 68000、X68030 上では 68030 が標準となる. -o<ファイル名> オブジェクトファイル名の指定 アセンブルによって作成されるオブジェクトファイルのファイル名を指定する. デフォルトでは、オブジェクトファイルはソースファイル名の拡張子を".o"に 変更した名前で作成するが、-o オプションの使用によって<ファイル名>で指 定したオブジェクトファイル名に変更することが出来る. -p[<ファイル名>] リストファイルの作成 通常、アセンブルによって作成されるファイルはオブジェクトファイルのみで あるが、-p オプションによってリストファイルの作成を指定出来る. -p オプションに<ファイル名>を指定すると、リストファイルはそのファイル 名で作成され、省略するとソースファイル名の拡張子を".prn"に変更した名前 で作成される. -s<シンボル名>[=<定数>] シンボルの定義 シンボルを定義する. <定数>を指定することで、定義するシンボルの値を指定することが出来る(指 定を省略すると、シンボルは定数0を持つものとして定義される). シンボルは .set 疑似命令と同じく、再定義可能な整数として定義される. -t<パス名> テンポラリファイルのパス指定 HAS ではアセンブルの途中経過で必要となる一時的な情報は全てメモリ上に記 録するが、メモリ容量が不足している場合にテンポラリファイルを作成する事 がある. -t オプションでは、この時に実際にテンポラリファイルを作成する パス名を指定する. -t オプションの指定がない場合には、テンポラリファイルは環境変数 temp が設定されていればそのパスに、設定されていない時にはカレントドライブの カレントディレクトリに作成される. -u 未定義シンボルの外部参照指定 ソースファイルで定義されていないシンボルが参照された場合、通常は .xref 疑似命令によって明示的に外部参照宣言しないとエラーになる. しかし -u オ プションを指定すると、この外部参照宣言の有無にかかわらず、未定義のシン ボルを全て自動的に外部参照宣言されているものとして扱う. -w[<警告レベル>] 警告レベルの指定 アセンブルの際、オブジェクトファイルを作成できないほど致命的ではないエ ラーに対しては警告を出力するが、-w オプションによって警告を抑制する事 が出来る. 警告は、種類によって1~4の4つのレベルに分かれている. デフォルトでは全 ての警告を出力するが、<警告レベル>を指定することで、その指定したレベル の値よりも大きいレベルの警告の出力を抑制する. 全ての警告を抑制するには、-w0 と指定する. <警告レベル>の指定を省略する と、-w2 と同じ意味になる. -x[<ファイル名>] シンボル情報の出力指定 アセンブル時に使用したシンボルの情報を出力することを指定する. <ファイル名>が指定された時はそのファイルに、省略された時は画面にシンボ ル情報を出力する. ============================================================================== ・識別名 -- シンボル ラベル 命令のロケーションアドレスを保持する. 定数 .equ 疑似命令でシンボルに値が設定されると、以後このシンボルを 定数として使用することが出来る. 変数 .set 疑似命令で値が設定されたシンボルで、.equ 疑似命令で定義さ れた場合と違い値の変更が可能である. レジスタリスト .reg 擬似命令でレジスタ群を定義したシンボル. アスタリスク(*) 現在処理している行が始まるロケーションアドレスを保持する. ダラー($) これからコードを出力しようとするロケーションアドレスを保持する. ・識別名 -- キーワード 命令のニーモニック 各実行命令をニーモニックで表わしたもの. レジスタ名 レジスタ名をニーモニックコードで表わしたもの. 01234.. d0~d7,r0~r7 データレジスタ 01234.. a0~a7,r8~r15 アドレスレジスタ 01234.. ssp システムスタックポインタ 01234.. usp ユーザースタックポインタ 01234.. sp,a7 カレントスタックポインタ 01234.. pc プログラムカウンタ 01234.. opc オプショナル PC(擬似レジスタ) 01234.. sr ステータスレジスタ 01234.. ccr コンディションコードレジスタ ..234.. zd0~zd7,zr0~zr7 データレジスタ省略 ..234.. za0~za7,zr8~zr15 アドレスレジスタ省略 ..234.. zsp,za7 スタックポインタ省略 ..234.. zpc プログラムカウンタ省略 .1234.. sfc ソースファンクションコード .1234.. dfc ディスティネーションファンクションコード .1234.. vbr ベクタベースレジスタ ..234.. msp マスタスタックポインタ ..234.. isp 割り込みスタックポインタ ..234.. cacr キャッシュコントロールレジスタ ..23... caar キャッシュアドレスレジスタ ...3..m crp CPU ルートポインタ ...34.m srp スーパーバイザルートポインタ ...34.m tc 変換制御レジスタ ...3... tt0~tt1 透過変換レジスタ ...34.m mmusr MMU ステータスレジスタ ...34.m psr PMMU ステータスレジスタ ....4.. urp ユーザルートポインタ ....4.. itt0~itt1 透過変換レジスタ(命令) ....4.. dtt0~dtt1 透過変換レジスタ(データ) ....4.. nc キャッシュ無指定 ....4.. dc データキャッシュ ....4.. ic 命令キャッシュ ....4.. bc データ/命令キャッシュ ......m drp DMA ルートポインタ ......m cal カレントアクセスレベル ......m val 有効アクセスレベル ......m scc スタック変更制御 ......m ac アクセス制御レジスタ ......m pcsr PMMU キャッシュステータスレジスタ ......m bad0~bad7 ブレークポイントアクノリッジデータレジスタ ......m bac0~bac7 ブレークポイントアクノリッジ制御レジスタ ....4f. fp0~fp7 浮動小数点データレジスタ ....4f. fpcr コントロールレジスタ ....4f. fpsr ステータスレジスタ ....4f. fpiar 命令アドレスレジスタ 01234fm ||||||+- 68020 + 68851(MMU) |||||+-- 68020/68030 + 68881/68882(浮動小数点コプロセッサ) ||||+--- 68040(内蔵の数値演算プロセッサを含む) |||+---- 68030 ||+----- 68020 |+------ 68010 +------- 68000 なお、これらのニーモニックは大文字でも小文字でも表記可能である. ・数値定数 10進数 0,1,2,…,9の数字で表わす. 先頭に特殊文字の指定がない数は10進数と見なす. 16進数 0,1,2,…,9,a,b,…,fの数字で表わし、その先頭にドル記号($)か"0x" をつけて16進数であることを示す. 8進数 0,1,2,…,7の数字で表わし、その先頭にアットマーク(@)か"0o"をつ けて8進数であることを示す. 2進数 0,1の数字で表わし、その先頭にパーセント記号(%)か"0b"をつけて2 進数であることを示す. これらの表記には、見やすいようにセパレータとして"_"を使うことが出来る. ・浮動小数点実数 実数(1) 0,1,2,…,9の数字及び小数点(.)で表わし、その先頭に"0f"をつけて 実数値であることを示す. 実数(2) 整数部と仮数部を0,1,2,…,9の数字で表わし、両者を小数点(.)で繋 げて実数値であることを示す. 実数(3) 仮数部と指数部を0,1,2,…,9の数字で表わし、両者を指数記号(e)で 繋げて実数値であることを示す. 指数部の先頭には"+"か"-"の符号を つけることができ、省略時は"+"が指定されたものと見なされる. 実数(4) 0,1,2,…,9,a,b,…,fの数字で表わし、その先頭に感嘆符(!)をつけて 内部表現による実数値であることを示す. この表記ではセパレータとして"_"を使うことが出来る. 実数(5) 整数定数値を必要なだけ並べ内部表現による実数値であることを示す. 各定数値はロングワード値として収得されるので、単精度/倍精度/拡 張精度/パックドデシマルではそれぞれ 1/2/3/3 個の定数を指定する. 浮動小数点実数から整数へ変換した場合、小数点以下の値は切り捨てられる. また、 (1)の表記のつもりで小数点を省略すると(5)の表記として認識されるので注意すること. ============================================================================== ・単項演算子 .pos.(+) この演算子に続く値が正であることを示す. .neg.(-) この演算子に続く値が負であることを示す. .not. 論理 NOT .high. ロングワード(32ビット)の下位ワードの上位バイトを分離する. .low. ロングワード(32ビット)の下位ワードの下位バイトを分離する. .highw. ロングワード(32ビット)の上位ワードを分離する. .loww. ロングワード(32ビット)の下位ワードを分離する. .nul. 常に 0 を返す. ・二項演算子 .mod. 剰余 .shr.(>>) 指定されたビット数だけ右へ論理シフト. .shl.(<<) 指定されたビット数だけ左へ論理シフト. .asr. 指定されたビット数だけ右へ算術シフト. 算術シフトにおいては、最上位ビットは符号とみなされるのでこの内 容は決して変わらない. これに対して論理シフトは、データを数ではなく論理的な0と1の集ま りとみなしているから、符号というものはありえない. 右へシフトし た場合でも、左へシフトした場合でも、空いたビット位置には常に0 が入る. .add.(+) 加算 .sub.(-) 減算 .mul.(*) 乗算 .div.(/) 除算 .eq.(=,==) オペランドが互いに等しいとき真(-1)を返す. .ne.(<>,!=) オペランドが互いに等しくないとき真(-1)を返す. .lt.(<) 左オペランドが右オペランドより小さいとき真(-1)を返す. .le.(<=) 左オペランドが右オペランドより小さいか等しいとき真(-1)を返す. .gt.(>) 左オペランドが右オペランドより大きいとき真(-1)を返す. .ge.(>=) 左オペランドが右オペランドより大きいか等しいとき真(-1)を返す. .slt.(.<.) 符号つきlt .sle.(.<=) 符号つきle .sgt.(.>.) 符号つきgt .sge.(.>=.) 符号つきge .and.(&) 論理 AND. 両オペランドの論理積を返す. .or.(|) 論理 OR. 両オペランドの論理和を返す. .xor.(.eor.,^) 排他的 OR. 両オペランドの排他的論理和を返す. ・演算子の優先順位 ①( )で囲まれた式(内側をより優先) ②単項演算子 + - .not. .high. .low. .highw. .loww. .nul. ③乗算、除算、剰余、シフト * / .mod. .shr. .shl. .asr. ④加算、減算 + - ⑤大小比較演算子 .eq. .ne. .lt. .le. .gt. .ge. .slt. .sle. .sgt. .sge. ⑥論理 AND .and. ⑦論理 OR、排他的 OR .or. .xor. ・式中の浮動小数点実数 式の中で浮動小数点を使用する場合は、以下のいずれかの間でしか演算できない. 浮動小数点実数(実数表記(1~3)であること) 浮動小数点シンボル 整数シンボル(定数) 使用できる演算子は以下のみ. 単項演算子 .pos.(+) .neg.(-) 二項演算子 .add.(+) .sub.(-) .mul.(*) .div.(/) ============================================================================== ・ローカルラベル ソース中にいくつでも置けるラベルとして"@@:","1:"~"9:"が使用でき、"@f","1f" ~"9f"でその位置以降の最も近い対応するローカルラベルを、"@b","1b"~"9b"でその 位置以前の最も近い対応するローカルラベルを参照する. "@@b","@@f"で二番目に近い ローカルラベル、"@@@b","@@@f"で三番目に近いローカルラベルとなり、"@"の数に比例 して遠くのローカルラベルを参照する. ・擬似レジスタ OPC(optional PC) ディスプレースメント付き PC 間接アドレッシング(d16,pc)で、"PC"の代わりに指定 する事が出来る. ディスプレースメントが16bitで表現できなくなると、絶対ロングア ドレッシングを使用する. コマンドラインで -b スイッチを指定すると、全てのディス プレースメント付き PC 間接アドレッシングで"PC"の代わりに"OPC"が指定されたもの として扱うようになる. ・jbra/jbsr/jb<cc>命令 それぞれ、bra/bsr/b<cc>命令と同じ処理を行うが、ブランチ先が16bitオフセットで 表現できなくなると、jmp/jsr 命令を使用してジャンプする. コマンドラインで -b スイッチを指定すると、全ての bra/bsr/b<cc>命令を jbra/ jbsr/jb<cc>命令として扱うようになる. ============================================================================== ・アセンブラ疑似命令 -- アセンブラ制御 .text テキストセクションの指定 書式 .text 機能 テキストセクションの宣言を行う. 解説 プログラムのテキストセクションプログラムコードの定義部の開始を 宣言する. .data データセクションの指定 書式 .data 機能 データセクションの宣言を行う. 解説 プログラムのデータセクション(初期値つきデータ部)の開始を宣言す る. .bss ブロックストレージセクションの指定 書式 .bss 機能 ブロックストレージセクション(bss)の宣言を行う. 解説 プログラムのブロックストレージセクション(初期値なしデータ部を 宣言する. .stack スタックセクションの指定 書式 .stack 機能 スタックセクションの宣言を行う. 解説 プログラムのスタックセクションの開始を宣言する. .offset オフセットの指定 書式 .offset <式> 機能 オフセット表を定義する. 機能 .offset 疑似命令は、.ds 疑似命令によって定義するオフセット表の 開始アドレスを指定する. このオフセット表は一種の擬似セクション であり、リンカには渡されない オフセット表で定義されたシンボル は、モジュール内部に確保される. オフセット表で仕様可能な疑似命令には以下のものがある. .ds .equ .set .reg .xdef .xref なお、オブジェクトコードに変換される実行命令、または疑似命令は 指定できない. <式>の値はオフセット表の開始アドレスで、この式は絶対値でなけれ ばならず、前方参照、未定義値、外部参照などを含んではならない. .offset 疑似命令は、以下の疑似命令のいずれかにより終了する. .text .data .bss .stack .end .include ソースコードの挿入 書式 .include <ファイル名> 機能 ソースコードをソースファイルに挿入する. 解説 アセンブル中に、現ソースファイルにインクルードファイルからソー スコードを挿入する. .comm コモンエリアの指定 書式 .comm <ラベル>,<式> 機能 コモンエリアの指定を行う. 解説 コモンエリアのラベルとサイズを指定する. コモンエリアは別々にアセンブルされたプログラム間で共有すること が出来る. リンカは、同じラベルを持つ全てのコモンエリアを同一ア ドレスに割りつける. 同じラベルを持つコモンエリアのサイズが異なる場合には、その中で の最大のサイズが割りあてられる. .end プログラムの終了指定 書式 .end <ラベル> 機能 プログラムの終了を指定する. またラベルを指定すると、プログラムの実行開始アドレスとなる. 解説 .end 疑似命令はアセンブラに、ソースプログラムの終了を通知する. したがって後続のソースコードは全て無視される. 注意 複数のオブジェクトをリンクする場合には一つのオブジェクトのみに ラベル指定がされている .end 疑似命令を書くこと. .org ロケーションカウンタの指定 書式 .org <式> 機能 ロケーションカウンタの指定. 解説 現在のセクションのロケーションカウンタを<式>の値にする. .comment コメント行の指定 書式 .comment <文字列> 機能 コメント行の指定. 解説 <文字列>で指定された文字列が再び現れる行まで、コメント行とする. 指定された文字列が現れた行は、文字列が行の先頭に現れてもコメン ト行となる. .comment のネストは出来ない. .fail エラーの生成 書式 .fail <式> 機能 エラーの生成 解説 <式>の結果が真ならば、アセンブル時にエラーを発生する. .request リンク時のライブラリを指定 書式 .request <ファイル名>[,<ファイル名>…] 機能 リンク時のライブラリを指定する. 解説 指定されたファイル名をリンカに渡す. リンカではそのオブジェクトをリンクする際に指定ファイルを一緒に リンクする. .cpu アセンブル対象 CPU の指定 書式 .cpu <式> 機能 アセンブラの命令セットを変更する. 解説 アセンブル可能な CPU の命令セットを変更する. 式の値には -m オ プションと同じ数が指定できる. .fpid 浮動小数点コプロセッサ ID の指定 書式 .fpid <式> 機能 浮動小数点コプロセッサ命令に使用するコプロセッサ ID を指定する. 解説 68k系コプロセッサは各々コプロセッサ ID を持っており、コプロセ ッサ命令ではその中の ID フィールドによって使用するコプロセッサ を選択するようになっている. 68030内蔵 MMU や 68851 の ID は0、68040 内蔵浮動小数点コプロセ ッサの ID は1と固定されているが、68881/68882の ID は、それを使 用するハードウェアの実装に依存している(X68030ではID=1). .fpid 疑似命令は、浮動小数点コプロセッサ命令をアセンブルする際 に使用するコプロセッサ ID を指定する. <式>の値には0~7の定数を指定するが、.fpid 疑似命令の指定がない 場合にはID=1が使用される. <式>の値に負数を指定した場合、命令セットから浮動小数点コプロセ ッサ命令を削除し、以後はそれらの命令がアセンブル出来なくなる. ただしこの機能は .cpu 68020/68030 指定時のみ有効で、.cpu 68040 指定時は負数を指定しても何も変わらない. .rdata .rldata .rbbs .rlbbs .rstack .rlstack 相対セクションの宣言 書式 .rdata .rldata .rbbs .rlbbs .rstack .rlstack 機能 相対セクションの宣言を行う. 解説 プログラムのデータ領域を先頭アドレスからの相対値で参照するよう な、相対セクションの宣言を行う. .r~は64Kバイト以内の場合に、 .rl~は64Kバイト以上の場合に使用する. .rcomm .rlcomm 相対コモンエリアの指定 書式 .rcomm <ラベル>,<式> .rlcomm <ラベル>,<式> 機能 相対コモンエリアの指定を行う. 解説 相対コモンエリアのラベルとそのサイズを指定する. <式>には相対コ モンエリアのサイズを指定するが、前方参照値や外部参照値、アドレ ス値等は使えない. 相対コモンエリアは、コモンエリアと同様に複数のプログラムから共 通のデータ領域として共有する領域で、その領域は先頭アドレスから の相対値で参照される. .pragma 最適化オペランドの指定 書式 .pragma <最適化指定オペランド> 機能 最適化オプションを指定する. 解説 現時点ではこの機能は実装されておらず、指定しても無視される. ============================================================================== ・アセンブラ疑似命令 -- 外部名指定 .globl .global グローバルシンボルの宣言 書式 .globl <ラベル>[,<ラベル>…] .global <ラベル>[,<ラベル>…] 機能 <ラベル>を外部名として定義する. 解説 <ラベル>を外部名として定義する. 該当プログラムが他のプログラムとリンクされると、この<ラベル>は 他のプログラムから参照する事が出来る. 逆に指定された<ラベル>がソースコード中に定義されなかった場合、 リンカはこの<ラベル>が他のプログラム中に定義されているものとみ なす. .xdef .public .entry 外部定義名の宣言 書式 .xdef <ラベル>[,<ラベル>…] .public <ラベル>[,<ラベル>…] .entry <ラベル>[,<ラベル>…] 機能 外部から参照可能なシンボルとして定義する. 解説 .xdef、.public、.enrty 疑似命令は、この疑似命令が記述されたモ ジュールと共にリンクされる他のモジュールから参照されるシンボル を定義する. .xref .extrn .external 外部参照名の宣言 書式 .xref <ラベル>[,<ラベル>…] .extrn <ラベル>[,<ラベル>…] .external <ラベル>[,<ラベル>…] 機能 外部で定義されたシンボルを参照することを宣言する. 解説 .xref、.extrn、.external 疑似命令は、他のモジュールで定義され たシンボルを、この疑似命令が記述されたモジュールから参照するこ とを宣言する. ============================================================================== ・アセンブラ疑似命令 -- シンボル値定義 .equ 不変シンボル値の定義 書式 <シンボル> .equ <式> 機能 不変シンボルの値を定義する. 解説 .equ 疑似命令は、オペランドフィールドの<式>の値をラベルフィー ルドのシンボルに割りあてる. ラベルフィールド、オペランドフィールドはともに必要. なお、シンボルは固有のものでなければならない. 一度シンボルを定義すると、そのシンボルはプログラム中の他の箇所 で再定義する事は出来ない. また、式には未定義のシンボルや、この式の後に定義されるシンボル を含んではならない. .set = 可変シンボル値の定義 書式 <シンボル> .set <式> <シンボル> = <式> 機能 シンボルに一時的な値を割りあてる. 解説 .set 疑似命令は、オペランドフィールドの<式>の値をラベルフィー ルドのシンボルに割りあてる. .equ 疑似命令と異なるのは、.set 疑似命令で定義したシンボルの値 を、同じプログラム中の別の .set 疑似命令で再定義できることであ る. 再定義は二回以上可能であり、また前の定義を参照することが出 来る. ラベルフィールド、オペランドフィールドはともに不可欠である. オペランドフィールドには、未定義の式や、.set 疑似命令が出現し た時点でまだ定義されていないシンボルを含んではならない. .reg レジスタリストの定義 書式 <ラベル> .reg <レジスタリスト> 機能 レジスタリストを定義する. 解説 .reg 疑似命令は、movem 命令で使用するレジスタリストの値をラベ ルに割りあてる. 以後、レジスタリストの内容は、ラベルを指定する だけで一意に参照することが出来るようになる. レジスタリストのフォーマットは以下の通り. レジスタ1[-レジスタ2][/レジスタ3[-レジスタ4]] .fequ 浮動小数シンボルの定義 書式 <シンボル> .fequ[.<サイズ>] <浮動小数点実数> 機能 浮動小数シンボルを定義する. 解説 <シンボル>を<浮動小数点実数>の値を持つ浮動小数シンボルとして定 義する. <シンボル>がすでに定義されていたらエラーになる. <浮動小数点実数>に内部表現を使用する場合には、サイズによって内 部表現が変わるため、<サイズ>の指定を省略することは出来ない. .fset 浮動小数シンボルへの代入 書式 <シンボル> .fset[.<サイズ>] <浮動小数点実数> 機能 浮動小数シンボルへ一時的な値を割り当てる. 解説 <シンボル>を<浮動小数点実数>の値を代入する. <シンボル>がすでに定義されている場合、それは浮動小数シンボルで ある必要がある. <浮動小数点実数>に内部表現を使用する場合には、サイズによって内 部表現が変わるため、<サイズ>の指定を省略することは出来ない. ============================================================================== ・アセンブラ疑似命令 -- マクロ制御 .macro マクロ定義の開始 書式 <ラベル> .macro [<パラメータリスト>] 機能 マクロ定義を開始する. 解説 .macro 疑似命令はマクロ開始文であり、ラベルはマクロが呼ばれる 時のニーモニックである. .macro 疑似命令から .endm 疑似命令はでの間の記述がマクロとして 定義される. <パラメータリスト>はマクロに与えられる引数である. .local マクロ定義ブロック内の局所的シンボルの定義 書式 .local <シンボル>[,<シンボル>…] 機能 マクロ定義ブロック内の局所的シンボルの定義を行う. 解説 .local 疑似命令は、マクロ定義ブロック内だけで仕様するシンボル を定義する. この疑似命令はマクロ定義ブロック内でのみ使用可能. .endm マクロ定義の終了 書式 .endm 機能 マクロ定義を終了する. 解説 マクロ定義を終了する. .exitm マクロ展開の打ち切り 書式 .exitm 機能 マクロ展開を途中で打ち切る. 解説 .exitm 疑似命令は、マクロ定義されたソース文の展開を途中で終了 させる. これは条件つきアセンブリ疑似命令とともに用いられ、ある条件によ り残りのマクロ展開が不要、または不適切なものになった場合、 .endm 疑似命令までのマクロ展開を抑制する事が出来る. .rept 繰り返し命令の設定 書式 .rept <式> 機能 繰り返し命令を設定する. 解説 .rept 疑似命令から .endm 疑似命令の間に記述された命令を、<式> の回数分だけ繰り返して展開する. <式>は定数でなければなりません. .irp 不定回の繰り返し設定 書式 .irp <仮引数>,<実引数>[,<実引数>…] 機能 不定回の繰り返しを設定する. 解説 .irp 疑似命令から .endm 疑似命令の間に記述された命令を、仮引数 に実引数の内容を一つずつ割り当てながら展開する. .irpc 文字の不定回の繰り返し設定 書式 .irpc <仮引数>,<文字列> 機能 文字の不定回の繰り返しを設定する. 解説 .irpc 疑似命令から .endm 疑似命令の間に記述された命令を、仮引 数に文字列から一文字ずつ割り当てながら展開する. ・特殊記号 マクロ展開、.irp 疑似命令での実引数に対して、'!'、'<'~'>'、'%'が特殊記号と して使用できる. ! '!'のあとの一文字を文字通りに認識する(','やスペースなどの文字の機能を 失わせる). < ~ > '<'、'>'で囲まれた文字列を文字通りに認識する. % '%'のあとに定数を持ったシンボルの名前を置くと、そのシンボルの持つ値を 引数とする. '%'のあとの語がシンボルとして定義されていなかったり、その 値が定数でない場合はなにも行わない. ============================================================================== ・アセンブラ疑似命令 -- データ定義・領域確保 .dc 定数の定義 書式 .dc[.<サイズ>] <式>[,<式>…] 機能 定数を定義する. 解説 .dc 疑似命令は、メモリ内に一個以上の定数を定義する. 複数の<式>を指定する場合は、各<式>をカンマ(,)で区切る. 各<式>には以下のものを指定することが出来る. 1.数値定数 ・シンボル、または数値が割りあてられる式 ・10進数 ・16進数 ・8進数 ・2進数 2.文字定数 ASCIIコードで表される定数 ASCIIコードの値を指定する時は、引用符(')で文字を囲まなければ ならない. 定数は、バイト、ワード、またはロングワードで指定することが出 来る. その場合、<サイズ>にそれぞれ、b、w、l を指定する. .dc 疑似命令の表記法と規則は次の通り. .dc.b バイト単位で定数を定義する. 奇数個のバイトを指定すると、次のステートメントが奇数番地から始 まる場合があるので注意すること. .dc.b 疑似命令の、次の命令のワ ードバンダリ調整は原則として行わない. .dc.w ワード単位で定数を定義する. 奇数個のバイトを指定した場合、バイト数が偶数個になるように、最 後のワードの上位に0を設定する. .dc.w 疑似命令で奇数バイトの指 定が出来るのは文字定数の時だけである. この命令が奇数番地から始まる場合は、先頭に1バイト0が入りワード バンダリ調整する. .dc.l ロングワード単位で定数を定義する. 指定バイトが4の整数倍に満たない時には、最後のロングワードの上 位に0を設定する. この命令が奇数番地から始まる場合は、先頭に0が入りワードバンダ リ調整する. .dcb 定数ブロックの定義 書式 .dcb[.<サイズ>] <長さ>,<式> 機能 定数ブロックを定義する. 解説 .dcb 疑似命令は、<サイズ>に従って1ブロックのバイト(b)、ワード (w)、ロングワード(l)を割りあてる. ブロック長は未定義参照、前方参照および外部参照を含まない絶対値 を持つ<長さ>で来まる. メモリ領域は<式>で指定したデータで満たされる. .ds メモリ領域の確保 書式 .ds[.<サイズ>] <長さ> 機能 メモリ領域を確保する. 解説 .ds 疑似命令は、メモリ領域を確保する. 確保されたメモリ領域の内 容は初期化されない. 領域の確保は、バイト、ワード、ロングワード単位で行うことが出来 る. その場合、<サイズ>にそれぞれ、b、w、l を指定する. <長さ>は、.ds 疑似命令で確保するバイト、ワード、またはロングワ ードの数を指定する. .even 偶数バンダリの調整 書式 .even 機能 偶数バンダリの調整を行う. 解説 .even 疑似命令は、次の命令はまたデータフィールドを偶数番地に割 りあてる. 例えば、ロケーションカウンタが奇数となった時に、.even 疑似命令 が指定されると、ロケーションカウンタが一つインクリメントされる. .align アドレス境界の指定 書式 .align <境界値>[,<式>] 機能 アドレス境界を指定する. 解説 次の命令のアドレスが指定した<境界値>の倍数になるように、ロケー ションカウンタを進める. <境界値>には、2~256の2の累乗を指定する. Human68k の実行ファイ ルは16の倍数のアドレスにロードされるようになっているので、16よ り大きい境界値指定には事実上意味がない. <式>には、アドレス境界を合わせるために出力するデータを指定する. 指定できるのは、$0000~$ffffの16bitの値に限られる. <式>の指定 が省略された場合には、現在のセクションが .text セクションであ った場合には $4e71(nop の命令コード)、それ以外の場合には$0000 が使用される. 境界合わせは次のように行われる. まず、アドレスを偶数にする為に、 .even 疑似命令と同等の処理が行われる. その後、アドレスが指定し た境界に達するまで、<式>の値がワードで出力される. <式>指定を省 略すると、現在のセクションが .text である場合には$4e71(nop の 命令コード)、それ以外である場合には$0000が使用される. オブジェクト間の境界を埋める為に出力される値はリンカに依存する (HLK v3.01では全て$0000が出力される). .quad アドレスの4バイト境界の指定 書式 .quad 機能 アドレスの4バイト境界を指定する. 解説 次の命令のアドレスが4の倍数になるように、ロケーションカウンタ を進める. .align 4と全く同じ処理が行われる. HLK v3.01では、.quad を使用したオブジェクトを正しくリンク出来 ないので注意すること. ============================================================================== ・アセンブラ疑似命令 -- 条件つきアセンブリ .if 条件つきアセンブル 書式 .if (.ifne) <式> <式>が真のときアセンブル実行 .iff(.ifeq) <式> <式>が偽のときアセンブル実行 .ifdef <シンボル> シンボルが定義されているときアセンブル実行 .ifndef <シンボル> シンボルが定義されていないときアセンブル実行 .else 反対の条件が存在するときアセンブル実行 .elseif <式> 反対の条件が存在し、かつ特定の条件を満たすときアセンブ ル実行 機能 条件が成り立つときアセンブルを実行する. 解説 いずれも条件つきアセンブル開始文であり、条件の真偽により .endif(.endc)疑似命令はでのソース文をアセンブルするか否かを決 定する. 条件つきアセンブリ疑似命令は、アセンブラの開始時に入出力セクシ ョンを挿入したり、削除したりする場合によく用いられる. .endif(.endc) 条件つきアセンブルの終了 書式 .endif .endc 機能 条件つきアセンブルを終了させる. 解説 条件つきアセンブルの終了を宣言する. ============================================================================== ・アセンブラ疑似命令 -- リスティング制御 .list アセンブルリストの出力 書式 .list 機能 リストファイル作成時に、リスト出力することをアセンブラに指示す る. 解説 リストファイル作成時に、リスト出力することをアセンブラに指示す る. この疑似命令はデフォルトとして設定されている. .list 疑似命令に続くソース文は、アセンブラが .end または .nlist 疑似命令を検出するまでリスト出力される. .nlist アセンブルリストの出力抑止 書式 .nlist 機能 リストファイル作成時に、リスト出力されないことをアセンブラに指 示する. 解説 アセンブラが .list 疑似命令を検出するまで、アセンブルリストの 出力を抑制する. .page アセンブルリストの改頁 書式 .page 機能 アセンブルリストの改頁. 解説 .page 疑似命令が検出されたところで改頁し、タイトルやサブタイト ルなどを出力する. .title アセンブルリストのタイトルの指定 書式 .title <文字列> 機能 アセンブルリストのタイトルの指定. 解説 アセンブルリストの各頁の始めに出力されるタイトルを、<文字列>で 指定された文字列に定義する. <文字列>は一行以内でなければならない. .subttl アセンブルリストのサブタイトルの指定 書式 .subttl <文字列> 機能 アセンブルリストのサブタイトルの指定. 解説 アセンブルリストの各頁の始めに出力されるサブタイトルを、<文字 列>で指定された文字列に定義する. <文字列>は一行以内でなければならない. .lall マクロ行の出力 書式 .lall 機能 マクロ行の出力. 解説 .sall 疑似命令を検出するまで、マクロ行を展開してアセンブルリス トに出力する. マクロ行自体は、.lall、.sall 疑似命令の有無に関 係なく出力される. .lall 疑似命令がその前に存在していたならば、 マクロ行の次にそのマクロの内容を出力する. .sall マクロ行の出力の抑止 書式 .sall 機能 マクロ行の出力の抑止. 解説 .lall 疑似命令を検出するまで、マクロ行の展開をせずにアセンブル リストに出力しない. マクロ行自体は、.lall、.sall 疑似命令の有 無に関係なく出力される. .sall 疑似命令がその前に存在していたな らば、マクロ行のみを出力する. .width リストファイルの表示幅設定 書式 .width <式> 機能 リストファイルの表示幅を設定する. 解説 リストファイルを作成する場合の一行の桁数を半角文字の文字数で指 定する. <式>は80~248の8の倍数でなければならない. デフォルトでは136桁が指定されている. ============================================================================== ・アセンブラ疑似命令 -- シンボリックデバッグ情報指定 .file ソースファイル名の出力指定 書式 .file "<ファイル名>" 機能 ソースファイル名をオブジェクトに出力する. 解説 ソースファイル名をオブジェクトに出力する. <ファイル名>は C 言語で記述されたソースファイルを指定する. .ln 行番号とロケーションの対応の出力指定 書式 .ln <行番号>[,<ロケーション値>] 機能 行番号とロケーションの対応をオブジェクトに出力する. 解説 行番号とロケーションの対応をオブジェクトに出力する. <行番号>には、C 言語で記述されたソースプログラムにおける行番号 を指定する. <ロケーション値>には、オブジェクトの先頭からのロケーションの値 を指定する. 省略すると、この疑似命令が存在する所のロケーション が設定される. .def .endef シンボルテーブルエントリの作成 書式 .def <シンボル> (属性を指定する疑似命令) .endef 機能 シンボルテーブルエントリを作成する. 解説 C 言語における変数や関数の属性などを格納するシンボルテーブルエ ントリを作成する. シンボルテーブルはこの .def 疑似命令の間にあ る、シンボルの属性を指定する疑似命令を元に作成する. <シンボル名>には、シンボルテーブルエントリを作成したいシンボル の名前を指定する. この名前は、C 言語のプログラムがコンパイルさ れたアセンブラソース上での名前となる. また、C 言語のプログラム 構造をオブジェクトファイルに出力する為に、ピリオド(.)で開始す る以下のような特殊なシンボル名を使用する. .bf 関数の始まりを宣言するシンボル .ef 関数の終わりを宣言するシンボル .bb 関数内ブロックの始まりを宣言するシンボル .eb 関数内ブロックの終わりを宣言するシンボル .eos 構造体/共有体/列挙宣言の終了を宣言するシンボル .val シンボルの値の指定 書式 .val <式> 機能 式の値をシンボルのものとする. 解説 シンボルテーブルエントリで属性を指定する疑似命令. シンボルに対して式の値を与える. <式>には、シンボルが関数ならばそのロケーションを、シンボルが auto 変数ならスタック上のオフセット値を、構造体のメンバ名なら ば構造体先頭からのオフセット値を指定する. また、<式>の代わりに "."を指定することで、現在のロケーション値を与える事が出来る. .scl 記憶クラスの宣言 書式 .scl <式> 機能 記憶域クラスを宣言する. 解説 シンボルテーブルエントリで属性を指定する疑似命令. シンボルに対して記憶クラスを与える. <式>の値と記憶クラスは、以下のように対応している. 数値 記憶クラス 1 auto 変数 2 extern 変数/関数 3 static 変数/関数 4 register 変数 8 構造体のメンバ名 9 関数の引数 10 構造体のタグ名 11 共有体のメンバ名 12 共有体のタグ名 13 typedef された型の名前 15 列挙タグ名 16 列挙メンバ名 18 構造体/共有体のビットフィールド 100 関数内ブロックの開始/終了(.bb/.eb で使用) 101 関数の開始/終了(.bf/.ef で使用) 102 構造体/共有体宣言の終了(.eos で使用) -1 関数定義の終了 .type C 言語における型の宣言 書式 .type <式> 機能 C 言語における型を宣言する. 解説 シンボルテーブルエントリで属性を指定する疑似命令. シンボルに対してその型を与える. シンボルの型は、<式>の値によって次のように決定される. <式>の値 は16ビットの無符号数値として扱い、このうち最下位の4ビットによ ってシンボルの基本型が決定される. 最下位4ビットと基本型の対応 は以下の通り. 数値 基本型 %0000 void %0010 char %0011 short int %0100 long int %0110 float %0111 double %1000 struct %1001 union %1010 列挙タグ名 %1011 列挙メンバ名 %1100 unsigned char %1101 unsigned short int %1110 unsigned long int シンボルの型が派生型である場合は、基本型の4ビットの上位に2ビッ トずつ、以下のような派生型の情報を付加する. この時、基本型に対 しての優先順位が高いほど、付加するビットは下位になる. 数値 派生型 %01 ~へのポインタ %10 ~を返す関数 %11 ~の配列 .tag タグ名の宣言 書式 .tag <タグ名> 機能 タグ名を宣言する. 解説 シンボルテーブルエントリで属性を指定する疑似命令. シンボルが構造体や共有体、列挙型であった場合に、そのシンボルの 構造を定義しているタグのタグ名を宣言する. <タグ名>は、タグ名という記憶クラスを持ったシンボルテーブルエン トリとして宣言されている必要がある. .line 行番号の指定 書式 .line <式> 機能 シンボルに行番号を与える. 解説 シンボルテーブルエントリで属性を指定する疑似命令. C 言語のプログラム構造を表現するための特殊なシンボルに対して、 <式>によってその構造の開始する行番号や行数を与える. 各シンボルによって、<式>の値の意味が次のように異なる. .bf C 言語のソースプログラムで、関数が開始している行番号を 指定する .ef 関数本体のソースプログラムでの行数を指定する .bb 関数の開始する行から見た、関数内ブロックの開始する相対 的な行番号を指定する .eb 関数の開始する行から見た、関数内ブロックの終了する相対 的な行番号を指定する .size サイズの指定 書式 .size <式> 機能 シンボルにサイズを与える. 解説 シンボルテーブルエントリで属性を指定する疑似命令. シンボルに対して、そのサイズを与える. <式>には、シンボルが配列や構造体/共有体である場合はそのシンボ ルがメモリ上に占めるバイト数、ビットフィールドである場合は使用 するビット数を指定する. .dim 配列の指定 書式 .dim <式1>[,<式2>…] 機能 シンボルに配列名とその次元数を与える. 解説 シンボルテーブルエントリで属性を指定する疑似命令. 配列として宣言されたシンボルに対して、その要素数と次元を与える. <式>には配列の要素数を指定する. <式>は","で区切って、最大4つま で指定することができ、それによって最大4次元までの配列を表すこ とが出来る. ============================================================================== ・アセンブラ疑似命令 -- 別名定義 正しいニーモニック(右辺)だけでなく、別名(左辺)もアセンブル可能であるが、ソー スコードの可読性を維持したい場合は使用すべきではない(但し、dbra だけは別名が認 められており、かつ一般的なのでそちらを使うべきである). 条件分岐命令: bt[.*] label = bra[.*] label bhs[.*] label = bcc[.*] label blo[.*] label = bcs[.*] label bnz[.*] label = bne[.*] label bze[.*] label = beq[.*] label jbt <ea> = jbra <ea> jbhs <ea> = jbcc <ea> jblo <ea> = jbcs <ea> jbnz <ea> = jbne <ea> jbze <ea> = jbeq <ea> 条件セット命令: shs <ea> = scc <ea> slo <ea> = scs <ea> snz <ea> = sne <ea> sze <ea> = seq <ea> 条件ループ命令: dbf dn,label = dbra dn,label dbhs dn,label = dbcc dn,label dblo dn,label = dbcs dn,label dbnz dn,label = dbne dn,label dbze dn,label = dbeq dn,label fdbf dn,label = fdbra dn,label 条件トラップ命令: traphs = trapcc traplo = trapcs trapnz = trapne trapze = trapeq 加算/減算命令: dec[.*] <ea> = subq[.*] #1,<ea> inc[.*] <ea> = addq[.*] #1,<ea> clr[.*] an = suba[.*] an,an 注意:ワードサイズの演算では上位ワードの値は不定. 疑似命令: .68000 = .cpu 68000 .68010 = .cpu 68010 .68020 = .cpu 68020 .68030 = .cpu 68030 .68040 = .cpu 68040 ==============================================================================