2017-01-20 9 views
0

困っています。 MASMマクロは、Cマクロのように動作しないようです。 Cにはテキストを一連のトークンとして扱うプリプロセッサがあり、どこでもマクロ呼び出しを行うことができます。 MASMではそうではありません。私はこれについて適切な文書を見つけることができませんが、指示の中でマクロを呼び出すことはできません、そうですか?他のマクロ呼び出しのparsの部分を除いて?または、マクロdefの内部にappers?それらは唯一の例外ですか? spec/docはどこですか?MASMでマクロを呼び出す

OK、私がやろうとしていることはこれです:

external macro fnames:VARARG 
extern stdin:qword, 
for fname, <fnames> 
    fname&_ptr: qword, 
endm 
endm 

external puts, fgets, printf, srand, rand 

そして私が手: 構文エラー:

のためにそれはEXTERNディレクティブを解釈するために、既にらしいとマクロのために見つけました内部で許可されていない=>構文エラーです。

私は何ができますか?カンマで各行を終了すると、複数の行にまたがる指示文を分割することができます。しかし、マクロ呼び出しを解釈しないと、それには何の助けもありません。

私は私が行うことができますことを発見:

external macro fnames:VARARG 
extern stdin:qword 
for fname, <fnames> 
    extern fname&_ptr: qword 
endm 
endm 

external puts, fgets, printf, srand, rand 

しかしディレクティブを掛けることは常にオプションではありません。 procディレクティブf.exを参照してください。私は同じprocのprocヘッダを何度も使うことはできません。

このジレンマにはスマートな解決策がありますか? 1行の出力を生成するためにMASMマクロを使用することは可能ですか?私はどのようにわからない。救助のために急いで、あなたはすべてそこにおとぎ話する! :) Cheerioh

+0

私が見つけた良いドキュメンテーションは、[this from Randall Hyde](http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html)です。 MASMディレクティブについては第8章を参照してください。 – zx485

+0

ドキュメントを読んだことがありますか? – fuz

+0

質問を投票した人は恐ろしいだけです。 – pyetti

答えて

3

EXTERN directiveの署名はあなたがこのようなCATSTR directiveでワンライナーを作成することができます

EXTERN [[ langtype]] name [[(altid)]] : type 
     [[, [[langtype]] name [[(altid)]] : type]]... 

である:それは出力です

external MACRO fnames:VARARG 
    txt textequ <stdin: qword> 
    for fname, <fnames> 
    txt CATSTR txt, <, &fname&_ptr: qword> 
    endm 
    extern txt 
endm 

external puts, fgets, printf, srand, rand 

1行にあります。

extern stdin: qword, puts_ptr: qword, fgets_ptr: qword, printf_ptr: qword, srand_ptr: qword, rand_ptr: qword 

また、y MACROの出力を別のMACROのパラメータまたは式への入力として使用する場合は、EXITMhttps://msdn.microsoft.com/en-us/library/tb4885hc(v=vs.80).aspx)指令を使用できます。

+0

素晴らしい!それはそれを解決する。 :)私は実験し、あなたと非常によく似た何かを考え出しました。下記参照。 – Henrik

1

これは私が思いついたものです。上記と非常に似ています:

functions macro fnames:VARARG 
local list 
list textequ <> 
for fname, <fnames> 
    list catstr list, <,fname&_ptr: qword> 
endm 
list substr list, 2 
exitm list 
endm 

extern stdin:qword, functions(puts, fgets, printf, srand, rand) 

これは機能します!だから、実際には、内部のディレクティブからマクロ関数を呼び出すことができます。マクロ・プロシージャではなく、マクロ・ファンクションである必要があります。

関連する問題