2017-01-20 50 views
0

我遇到了麻煩。 MASM宏似乎不像C宏一樣。 C有一個預處理程序,它將文本處理爲一系列令牌,您可以在任何地方進行宏調用。看起來並非如此。我無法找到適當的文檔,但你不能在指令中調用宏,對吧?除了它是另一個宏調用中的語法的一部分?或者當它在宏觀def裏面?這是唯一的例外嗎?規格/文檔在哪裏?調用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文件。

是否有智能解決這個困境?是否可以使用MASM宏來產生單行輸出?我不知道如何。趕緊去救援,所有你在那裏書呆子! :) Cheerioh

+0

我發現的一個很好的文檔是[來自Randall Hyde](http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html)。有關MASM指令,請參閱第8章。 – zx485

+0

您是否閱讀過文檔? – fuz

+0

投票反對的人只是可怕的。 – pyetti

回答

3

EXTERN directive的簽名是

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

所以,你可以創建一個班輪與CATSTR directive這樣的:

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 

它的輸出是一個行:

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) 

它的工作原理!所以人們確實可以從內部指令中調用宏函數。它們必須是宏函數,而不是宏程序。