gasp [-adpsuM] [-c CHAR] [-o OUTFILE] [-DNAME=VALUE] [-IPATH] [--alternate] [--commentchar CHAR] [--copysource] [--debug] [--mri] [-output OUTFILE] [--print] [--unreasonable] INFILE...
gasp [-hv] [--help] [--version]
gasp は、INFILE 引数を処理して、as(1) に直接入力させるために 連結して標準出力に出力する。
as は、他のプログラムによって生成された出力をアセンブルすることを 目的としているので、アセンブラを手で書くときに便利なマクロや条件文といった 一般的な機能を持っていない。 gasp は、これらの (as にはない) 機能を提供する。
strings size S : N
という形式で表す。 これらの統計量はデータを前処理する時に標準エラー出力に書き出される。
コマンドは大文字と小文字を区別せず、1 行は 3 つの部分に分けられる: (任意の) ラベル、コマンド自身、コマンドの引数である。
これらの指示子により、文字列や絶対式の組の比較方法に依存してアセンブリコードの 一部を含めたり除外したりすることが出来る。 条件文の最大ネスト数は 100 である。
有効な CMP 比較演算子で、文字列と絶対式で表されるものは、 以下の通りである:
有効な CMP 比較演算子で、絶対式のみで表されるものは、 以下の通りである:
これらの指示子はコードの部分を繰り返すことを許可する。
変数には文字列、レジスタ、式の結果が入る。 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
マクロ変数はほとんど同じ方法で扱われるが、 それらの値を求めるには、代わりに `\' を前に付ける。
これら全ての指定は、変数名として左端にある "ラベル" を受け入れる。 必要なら、上の `bar' のように、変数名の後ろにコロンを付けてもよい。
.MACRO と .ENDM の指示子により、 アセンブラコードの出力を生成する独自のマクロを定義出来る。
マクロを呼び出すとき、引数の値をポジションかキーワードで指定できる。 たとえば、`SUM 9, 17' は `SUM TO=17, FROM=9' と同じである。 マクロ引数は .ASSIGNA や .ASSIGNC で定義した値と同等なので、 それらをループのコントロールや条件式として使える。 異なっているのは、変数の値を求めるときに接頭語として付ける記号だけである : マクロ引数には `\ARG' を使い、 プリプロセッサ変数には `\&VAR' を使う。
文字列はマクロ展開毎に異なったものになるので、 マクロ展開の間で衝突する恐れなしに、 シンボルを定義するマクロを書くことができる。
これは --alternate を指定している時のみ有効である。
これらの指示子は、メモリのワーキングエリアを指定する。 メモリを初期化する指示子は、以下の通りである:
例えば、`foo .DATA 1,2,3' は `foo: .long 1,2,3' を発行する。
.RES, .SRES, .SRESC, .SRESZ 指示子はメモリを初期化せず予約しておくために使う。 gasp はこれらの指示子を、GNU as .space 指示子の適切なコールとして解決する。
これらの指示子は as の list 指示子をコントロールする。
(スペースかタブで、改行ではない) 空白で、 1 行が 3 つの部分に分かれている時は特に重要である。 空白はいくつあってもよい。
• 最初の部分には、 必須ではない "ラベル" が必ず左寄せ (行頭には空白がない) で書かれる。 ラベルの後ろには、必須ではないコロンが付いている。
• いくつかの空白の後に 2 番目の部分があって、 そこには gasp か as 指示子を含む。
• 行中のそれ以降の部分は指示子の引数であり、 コンマか空白で区切られている。
gasp はいくつかの特別な印を認識する: コメントの境界を定めるもの、 次の行にステートメントを続けるもの、記号をその他のキャラクタと区別するもの、 テキストを出力に直接コピーするもの (一つの特別な印としては、`@f' はマクロの定義の中のみで使われる)。
どんなソースの行でも、その後ろに付いているものはコメントかもしれない。 コメントはクォートされないコメント文字 (デフォルトでは `!') から始まるか、エスケープされたコメント文字や 2 文字のコメント文字 (デフォルトでは、`\!' か `!!') で始まり、行末まで続く。 この 2 種類のコメント印は、取り扱いがわずかに違う :
.MACRO SUM FROM=0, TO=9 ! \FROM \TO
は、第 1 行で呼んだマクロの値の出力を記録して、コメントとして吐き出す。
ファイルの次の行に記述を続けるには、2 行目の先頭に `+' を付ける。 時々、ある特定の文字列を gasp に処理させたくないことがある。 gasp のソースから、その出力に 文字通りにコピーするには、`\(' をコピーしたい文字列の前に置き、 `)' を後ろに置く。 例えば、アセンブラコードの出力に `\!' 文字が欲しい時は、 `\(\!)' と書く。
プリプロセッサ変数と、その直後に続く数値の文字を分離するには、 シングルクォート (''') を書く。 例えば、`.SDATA "P'1"' は変数 P の値と数値の 1 とを連結した文字列になる。 (`P1' 自身がプリプロセッサ変数の有効な名前なので、 `\P1' と書いただけではこの結果は得られないだろう)
文字列定数を書くには、2 通りの方法がある: 全くのテキストと数で示されたバイトの値である。 二重引用符 ("STR") の間で完全な文字列は指定される。 不等号記号 (<EXPR>) の間で絶対式として、 個々の NumericByte 値が指定される。 文字列を出力する指示子は、どんな種類のどんな命令でも、 結果を連結するのを許可する。
特定の進数での、あるいは最後の .RADIX 指示子によって現在選ばれる どんな進数の定数でも書ける。
特定の進数で数を書くためには、パターン `S'DDD' を使う: 進数指定文字 S の次にシングルクォートがあり、数字 DDD が続く。 進数指定文字は、.RADIXで指定できるものと一致する。
gasp は英字または、`_' 、`$' から始まり、 同様に文字または数字が続いているようなシンボルやラベル名を認識できる。
有効なシンボルは、アルファベット・`_'・`$' から始まり、 これらの文字または数字が続く。
結果に依存した 2 つの式がある: 結果が定数 (つまり、それらは gasp が知らない値を含まない) となる 絶対式と、以下の形
ADDSYM+CONST-SUBSYM
に変換できなければならない再配置可能式がある。 ここで ADDSYM と SUBSYM は、不明な値のアセンブラシンボルであり CONST は定数である。
gasp の数値式は、C のルールにとても良く似ている。 優先順位を変える時に括弧を使える; そうでなければ、数値的な基本としては、次に記すような優先順位になる:
• 1. 一つの引数 `+' (同一の場合), `-' (算術的に反対の場合), あるいは `~' (ビット否定)
• 2. `*' (乗算) と `/' (除算)。 引数は、絶対式でなくてはならない。
• 3. `+' (加算) と `-' (減算)。 少なくとも一つの項は絶対式でなくてはならない。
• 4. `&' (ビットの AND)。両方の項は、絶対式でなくてはならない。
• 5. `|' (ビットの OR) と、`~' (ビットの XOR。C における `^')。 両方の引数は、絶対式でなくてはならない。
これらの関数を使って、 文字列 (gasp ステートメントの項にある) を計算できる:
--alternate オプションが指定されている時、 別のマクロ文法が gasp によって使われる。 この文法は、Phar Lap マクロアセンブラを想い出させるが、 これは、Phar Lap マクロのエミュレーションや、 それと似ているアセンブラであるという事を意味してはいない。 特に、gasp は DB や IRP のような指示子をサポートしていない。
• プリプロセッサ指示子を `.' ドットを前に置かずに使える。 例えば、`SDATA' と .SDATA' を同じ効果のものとして書ける。
• LOCAL が有効になっている。
• 文字列の境界を、 "STRING", 'STRING', <STRING> のように書ける。
• 文字列の中のどんな文字も文字通りに取り込むために、 (たとえその文字が他に特別な意味を持っていたとしても) `!' を文字の前につけられる。例えば、`"hello !"world!""
• %EXPR を EXPR 式の数値を求めるために書くことが出来、 その結果は文字列として使用できる。
gasp に
.MACRO saveregs from=8 to=14
count .ASSIGNA \from
! save r\from..r\to
.AWHILE \&count LE \to
mov r\&count,@-sp
count .ASSIGNA \&count + 1
.AENDW
.ENDM
saveregs from=12
bar: mov #H'dead+10,r0
foo .SDATAC "hello"<10>
.END
を与えると、下の GNU as のコードを生成する:
! save r12..r14
mov r12,@-sp
mov r13,@-sp
mov r14,@-sp
bar: mov #57005+10,r0
foo: .byte 6,104,101,108,108,111,10
バグは <bug-gnu-utils@gnu.org> と
<hjl@lucon.org>
にレポートして欲しい。
man ページは Ragnar Hojland Espinosa
<ragnar@ragnar-hojland.com>
によって書かれた。