GASP(1) GASP(1)
名前
gasp - GNU アセンブラプリプロセッサ
書式
gasp [-adpsuM] [-c CHAR] [-o OUTFILE] [-DNAME=VALUE] [-IPATH] [--alter-
nate] [--commentchar CHAR] [--copysource] [--debug] [--mri] [-output
OUTFILE] [--print] [--unreasonable] INFILE...
gasp [-hv] [--help] [--version]
説明
gasp は、INFILE 引数を処理して、as(1) に直接入力させるために連結して標
準出力に出力する。
as は、他のプログラムによって生成された出力をアセンブルすることを目的と
し ているので、アセンブラを手で書くときに便利なマクロや条件文といった一
般的な機能を持っていない。 gasp は、これらの (as にはない) 機能を提供す
る。
オプション
-a, --alternate
別のマクロ文法を使用する。
-c CHAR, --commentchar CHAR
CHAR をコメント文字として使う。デフォルトのコメント文字は ‘!’ で
ある。
-d, --debug
gasp が内部的に割り当てる文字列バッファについてのデバッグ統計 情
報 を表示する。それぞれ定められたバッファサイズ S について、割り
当てられた文字列 N を
strings size S : N
という形式で表す。これらの統計量はデータを前処理する時に標準エラ
ー出力に書き出される。
-o OUTFILE, --output OUTFILE
gasp によって生成された出力を OUTFILE に書き出す。デフォルトでは
標準出力に書き出される。
-p, --print
コメントとして行番号を出力する。 -s が指定されない限り、無視され
る。
-s, --copysource
コメントとしてソースの行を出力する。
-u, --unreasonable
無制限の (「非現実的な」) ネスト展開を許可する。他のマクロの定義
の中に gasp のマクロを定義できる時、プリプロセッサは通常、sanity
チェックを含める。プログラムが 1000 回以上のネストされた展開を必
要とする時には、 gasp は通常、エラーメッセージを出して終了する。
このチェックをオフにして無制限のネストされた展開を許したい時には
、このオプションを使用せよ。
-M, --mri
MRI 互換モードに入る。 Microtec Research ASM68K アセンブラ文法と
疑似オペレーションを使うために必要である。
-DNAME=VALUE
プリプロセッサ定数 NAME を値 VALUE で定義する。
-IPATH PATH をインクルードパスのリストに追加する。
-h, --help
標準出力に使用方法を出力し、正常終了する。
-v, --version
バージョン情報を標準出力に出力し,正常終了する。
プリプロセッサコマンド
コ マンドは大文字と小文字を区別せず、1 行は 3 つの部分に分けられる: (任
意の) ラベル、コマンド自身、コマンドの引数である。
条件文
これらの指示子により、文字列や絶対式の組の比較方法に依存してアセンブ リ
コ ードの一部を含めたり除外したりすることが出来る。条件文の最大ネスト数
は 100 である。
.AIF ARG1 CMP ARG2
.AIF "ARG1" CMP "ARG2"
有効な CMP 比較演算子で、文字列と絶対式で表されるものは、以下 の
通りである:
EQ ARG1 と ARG2 は等しいか?
NE ARG1 と ARG2 は異なっているか?
有 効な CMP 比較演算子で、絶対式のみで表されるものは、以下の通り
である:
LT ARG1 は ARG2 より小さいか?
LE ARG1 は ARG2 と等しいか、それより小さいか?
GT ARG1 は ARG2 より大きいか?
GE ARG1 は ARG2 と等しいか、それより大きいか?
.AELSE 条件文が失敗したときに実行されるアセンブリコードの最初の部分に含
まれる印。必須ではなく、(.AIF と .AENDI の間の) 条件ブロックの中
でのみ与えられる。
.AENDI .AIF 条件ブロックの終りを示す。
ループ
これらの指示子はコードの部分を繰り返すことを許可する。
.AREPEAT EXPR
.AENDR
.AREPEAT と .AENDR の間のアセンブリコードを絶対式 EXPR で指定 さ
れた回数だけ繰り返す。
.AWHILE ARG1 CMP ARG2
.AENDW
.AWHILE と .AENDW の間のアセンブリコードを CMP 比較演算子の結果
が true である限り繰り返す。 CMP のフォーマットは.AIF のものと同
じである。
.EXITM ループから抜け出す。
変数
変数には文字列、レジスタ、式の結果が入る。 2 種類の変数がある。
· .EQU か .ASSIGN により定義される変数。アセンブラコードの出力において
この種の変数の値を求めるには、単に変数名を書けばよい。これらの変数は ア
セ ン ブ ラ コ ー ド の出力をしているときにのみ計算されるので、条件式や
.AWHILE ループの中に使うべきではない。
foo .EQU FLIP-64
bar: .EQU FLIP-64
mov.l foo, r0
· 前処理をしている間に使われる変数で、 .ASSIGNC か .ASSIGNA によって 定
義される。この種の変数の値を求めるには、‘\&’ を前に付ける。
opcit .ASSIGNA 47
.AWHILE \&opcit GT 0
.AENDW
マ クロ変数はほとんど同じ方法で扱われるが、それらの値を求めるには、代わ
りに ‘\’ を前に付ける。
PVAR .EQU EXPR
プリプロセッサ変数 PVAR に式 EXPR の値を割り当てる。再定義には、
制限はない。
PVAR .ASSIGN EXPR
.EQU と似ているが、PVAR は再定義できない。
PVAR .ASSIGNA AEXPR
前 処理の間使用され、数値を定義する。 AEXPR は絶対式でなくてはな
らない。再定義には、制限は無い。
PVAR .ASSIGNC STR
前処理の間使用され、文字列の値を定義する。再定義には、制限はない
。
PVAR .REG (REGISTER)
レ ジスタと同じ働きをする変数を定義する。特に、REGISTER は式とし
ては計算されない。再定義には、制限はない。
これら全ての指定は、変数名として左端にある "ラベル" を受け入れる。必 要
なら、上の ‘bar’ のように、変数名の後ろにコロンを付けてもよい。
マクロ定義
.MACRO と .ENDM の指示子により、アセンブラコードの出力を生成する独自の
マクロを定義出来る。
.MACRO NAME
.MACRO NAME [ARG[=DEFAULT_VALUE], ...]
NAME というマクロの定義を開始する。もしマクロの定義で引数が必 要
なら、コンマかスペースで区切ってマクロの名前のあとにそれらの名前
を書く。マクロ引数のデフォルトの値は、 ARG=VALUE というフォー マ
ットで指定する。
マクロを呼び出すとき、引数の値をポジションかキーワードで指定でき
る。たとえば、‘SUM 9, 17’ は ‘SUM TO=17, FROM=9’ と同じである 。
マクロ引数は .ASSIGNA や .ASSIGNC で定義した値と同等なので、それ
らをループのコントロールや条件式として使える。異なっているのは、
変 数の値を求めるときに接頭語として付ける記号だけである : マクロ
引数には ‘\ARG’ を使い、プリプロセッサ変数には ‘\&VAR’ を使う。
NAME .MACRO
NAME .MACRO ( [ARG[=DEFAULT_VALUE], ...] )
マクロを定義する別の形式 : ラベル位置にマクロの名前を、名前の 後
のかっこ内にすべての引数を指定する。
.ENDM マクロ定義の終りの印。
.EXITM 現在のマクロ定義や、マクロループから抜け出す。
\@ この疑似変数は、gasp がマクロをいくつ実行したかを表す。この変数
はマクロ定義の中でのみ使うことができる。
LOCAL NAME[, NAME...]
NAME 毎に固有の文字列を生成し、マクロ展開において NAME のイン ス
タンスを置き換える。
文字列はマクロ展開毎に異なったものになるので、マクロ展開の間で衝
突する恐れなしに、シンボルを定義するマクロを書くことができる。
これは --alternate を指定している時のみ有効である。
データ
これらの指示子は、メモリのワーキングエリアを指定する。メモリを初期化 す
る指示子は、以下の通りである:
.DATA EXPR[, EXPR...]
.DATA.B EXPR[, EXPR...]
.DATA.W EXPR[, EXPR...]
.DATA.L EXPR[, EXPR...]
EXPR 式の数値を計算し、一致する as 指示子 (LAB でラベルされてい
る) を発行する。無指定の .DATA は.longを発行し、.DATA.B は .byte
を、 .DATA.W は .short を、.DATA.L は .long を発行する。
例えば、‘foo .DATA 1,2,3’ は ‘foo: .long 1,2,3’ を発行する。
.DATAB REPEAT, EXPR
.DATAB.B REPEAT, EXPR
.DATAB.W REPEAT, EXPR
.DATAB.L REPEAT, EXPR
(as 指示子 .fill を使って) 式 EXPR の値を REPEAT 個作る。REPEAT
は絶対値の絶対式である。 .DATAB.B は 1 byte の 値 を 作 り 、
.DATAB.W は 2 byte の値を、.DATAB.L は 4 byte の値を作る。サフィ
ックス無しの .DATAB は、ちょうど .DATAB.L と同じように 4 byte の
値を作る。
.SDATA "STR"...
文字列のデータ。 (.SDATAZ と違い、文字列終わりの印はない) コンマ
区切りのそれぞれの STR 引数の連続するバイトを発行する。
.SDATAB REPEAT, "STR"...
繰り返された文字列のデータ。いくつ発行されるかを特徴付ける。 STR
引数を何回発行するかを、REPEAT で指定する。
.SDATAZ "STR"...
NUL 文 字で終端された文字列のデータ。.SDATA と同様だが、最後に
NUL 文字一つが書かれている点が異なる。
.SDATAC "STR"...
長さの数値が前に付いた文字列データ。 .SDATA と同様だが、文字列の
前 に 1 byte の 数値がある。例えば、‘.SDATAC "HI"’ は ‘.byte
2,72,73’ を生成する。数値フィールドが 1 byte だけなので、.SDATAC
は 256 byte 以下の長さの文字列に対してのみ使える。
.RES, .SRES, .SRESC, .SRESZ 指示子はメモリを初期化せず予約しておくため
に使う。 gasp はこれらの指示子を、GNU as .space 指示子の適切なコール と
して解決する。
.RES COUNT
.RES.B COUNT
.RES.W COUNT
.RES.L COUNT
COUNT 用の初期化されていないデータ要素のためのメモリを予約する。
サフィックスはそれぞれの要素の大きさを指定している : .RES.B は
COUNT byte を予約し、 .RES.W は COUNT byte のペアを予約し、そし
て .RES.L は COUNT の 4 つ組を予約する。サフィックス無しの .RES
は .RES.L に等しい。
.SRES COUNT
.SRES.B COUNT
.SRES.W COUNT
.SRES.L COUNT
.SRES は .RES と同義である。
.SRESC COUNT
.SRESC.B COUNT
.SRESC.W COUNT
.SRESC.L COUNT
.SRES と同じようなものだが、‘COUNT+1’ 要素のメモリを予約する。
.SRESZ COUNT
.SRESZ.B COUNT
.SRESZ.W COUNT
.SRESZ.L COUNT
.SRESZ は .SRESC と同義である。
リスト
これらの指示子は as の list 指示子をコントロールする。
.PRINT LIST
.PRINT NOLIST
.FORM LIN=LN
.FORM COL=COLS
.FORM LIN=LN COL=COLS
アセンブルリストのためのページサイズ、 LN 行 COLS 桁 (デフォルト
は 60x132) を指定する。行と列の一方または両方を指 定 で き る 。
.FORM の前の例で示されたどんな値でも、デフォルトとはならない。
.psizef は GNU as 指示子を発行する。
.HEADING STRING
STRING は、アセンブリリストのタイトルになる。 ‘.title "STRING"’
を発行する。
.PAGE アセンブリリストで新しいページに強制する。.eject を発行する。
その他のコマンド
.ALTERNATE
アセンブリの中で別のマクロ文法をこれ以降は使用する。
.ORG こ のコマンドは認識されるが、まだ実装されていない。gasp は .ORG
を使用しているプログラムに対してエラーメッセージを出す。
.RADIX S
明示的に符号化の進数が指定されていない数値について、デフォルトの
基数 (radix) を指定する (デフォルトは D である)。 S は大文字小文
字を区別しない。
.RADIX B
2 進数。
.RADIX Q
8 進数。
.RADIX D
10 進数。
.RADIX H
16 進数。
.EXPORT NAME
.GLOBAL NAME
NAME をグローバルに宣言する (.global NAME を発行する)。
.PROGRAM
無視される。
.END それぞれのプリプロセッサファイルの最後の印。ファイルの最後がこの
コマンドなしで終っていた場合は、ワーニングが出る。
.INCLUDE STR
フ ァイル名 STR を .INCLUDE 指示子で指定されている項目として処理
する。インクルードの最大の深さは 30 である。
.ALIGN SIZE
絶対式 SIZE を計算し、 .align evaluated_expression を発行する。
GASP の文法
(スペースかタブで、改行ではない) 空白で、 1 行が 3 つの部分に分かれてい
る時は特に重要である。空白はいくつあってもよい。
· 最初の部分には、必須ではない "ラベル" が必ず左寄せ (行頭には空白がな
い) で書かれる。ラベルの後ろには、必須ではないコロンが付いている。
· いくつかの空白の後に 2 番目の部分があって、そこには gasp か as 指示子
を含む。
· 行中のそれ以降の部分は指示子の引数であり、コンマか空白で区切られてい
る。
特別な文法の印
gasp はいくつかの特別な印を認識する: コメントの境界を定めるもの、次の行
に ステートメントを続けるもの、記号をその他のキャラクタと区別するもの、
テキストを出力に直接コピーするもの (一つの特別な印としては、‘@f’ はマク
ロの定義の中のみで使われる)。
ど んなソースの行でも、その後ろに付いているものはコメントかもしれない。
コメントはクォートされないコメント文字 (デフォルトでは ‘!’) から始まる
か、エスケープされたコメント文字や 2 文字のコメント文字 (デフォルトでは
、‘\!’ か ‘!!’) で始まり、行末まで続く。この 2 種類のコメント印は、取り
扱いがわずかに違う :
! 1 文字のエスケープされてないコメント文字は gasp の出力の
中にアセンブラコードのコメントを生成する。 gasp はどの 様
な プ リプロセッサの変数 (マクロ引数や、その前に .ASSIGNA
か .ASSIGNC で定義された変数) でも計算する。例えば、次 の
ように始まるマクロ
.MACRO SUM FROM=0, TO=9
! \FROM \TO
は、第 1 行で呼んだマクロの値の出力を記録して、コメントと
して吐き出す。
\!
!! エスケープされたコメント文字か、2 文字のコメント文字は 、
gasp のソースコメントの印である。 gasp はアセンブラコード
の出力にこのようなコメントをコピーしない。
ファイルの次の行に記述を続けるには、2 行目の先頭に ‘+’ を付ける。時々、
あ る特定の文字列を gasp に処理させたくないことがある。 gasp のソースか
ら、その出力に文字通りにコピーするには、‘\(’ をコピーしたい文字列の前に
置き、 ‘)’ を後ろに置く。例えば、アセンブラコードの出力に ‘\!’ 文字が欲
しい時は、 ‘\(\!)’ と書く。
プリプロセッサ変数と、その直後に続く数値の文字を分離するには、シング ル
ク ォ ート (’’’) を書く。例えば、‘.SDATA "P’1"’ は変数 P の値と数値の 1
とを連結した文字列になる。 (‘P1’ 自身がプリプロセッサ変数の有効な名前な
ので、 ‘\P1’ と書いただけではこの結果は得られないだろう)
文字列定数と数値定数
文 字列定数を書くには、2 通りの方法がある: 全くのテキストと数で示された
バイトの値である。二重引用符 ("STR") の間で完全な文字列は指定される。不
等号記号 (
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa