2017-01-20 2 views
0

Ich bin in Schwierigkeiten. MASM-Makros scheinen sich überhaupt nicht wie C-Makros zu verhalten. C hat einen Präprozessor, der den Text als eine Folge von Token behandelt, und Sie können einen Makroaufruf nur irgendwo platzieren. Nicht so in MASM scheint es. Ich kann dafür kein geeignetes Dokument finden, aber Sie können kein Makro innerhalb einer Direktive aufrufen, oder? Außer wenn es Teil der Pars in einem anderen Makro-Aufruf ist? Oder wenn es in einem Makro def auftaucht? Sind das die einzigen Ausnahmen? Wo ist die Spezifikation/Dokument?Aufruf von Makros in MASM

OK, was ich versuche, dies zu tun:

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

external puts, fgets, printf, srand, rand 

Und ich bekomme: Fehler Syntax: für

Es scheint bereits die extern Richtlinie zu interpretieren und findet die für Makro innerhalb dessen ist nicht erlaubt => Syntaxfehler.

Was zum Teufel kann ich tun? Sie können eine Anweisung über mehrere Zeilen teilen, wenn Sie jede Zeile mit einem Komma beenden, richtig? Aber wenn Makroaufrufe nicht interpretiert werden, gibt es keine Hilfe.

ich entdeckte, dass ich tun kann:

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

external puts, fgets, printf, srand, rand 

Aber die Richtlinie Multiplikation ist nicht immer eine Option. Nehmen Sie die proc-Anweisung f.ex. Ich kann den proc-Header für den gleichen proc mehrere Male nicht verwenden.

Gibt es eine kluge Lösung für dieses Dilemma? Ist es möglich, MASM-Makros zu verwenden, um eine einzige Ausgabezeile zu erzeugen? Ich weiß nicht wie. Rush zur Rettung, alle Nerds da draußen! :) Cheerioh

+0

Eine gute Dokumentation, die ich fand, ist [diese von Randall Hyde] (http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html). Siehe Kapitel 8 für MASM-Anweisungen. – zx485

+0

Haben Sie die Dokumentation gelesen? – fuz

+0

Leute, die eine Frage abstimmen, sind einfach schrecklich. – pyetti

Antwort

3

Die Unterschrift des EXTERN directive ist

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

So können Sie einen Einzeiler mit dem CATSTR directive wie folgt erstellen:

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 

Es ist Ausgang in einer Zeile:

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

Auch wenn y Wenn Sie die Ausgabe eines MACRO als Eingabe für einen anderen MACRO, Parameter oder Ausdruck verwenden möchten, können Sie die EXITM (https://msdn.microsoft.com/en-us/library/tb4885hc(v=vs.80).aspx) Direktive verwenden.

+0

Großartig! Das löst es. :) Ich experimentierte und entwarf etwas, das deinem sehr ähnlich war. Siehe unten. – Henrik

1

Hier ist, was ich gefunden habe. Sehr ähnlich wie oben:

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) 

Es funktioniert! Man kann also Makrofunktionen tatsächlich aus Insiderdirektiven aufrufen. Sie müssen Makro-Funktionen sein, keine Makro-Prozeduren.