2017-01-20 1 views
0

Je suis en difficulté. Les macros MASM ne semblent pas du tout se comporter comme des macros C. C a un préprocesseur qui gère le texte comme une séquence de jetons, et vous pouvez mettre un appel de macro n'importe où. Pas tellement dans MASM semble-t-il. Je suis incapable de trouver un document approprié pour cela, mais vous ne pouvez pas invoquer une macro dans une directive, n'est-ce pas? Sauf quand il fait partie des pars dans un autre appel de macro? Ou quand il apparaît à l'intérieur d'une macro? Est-ce que ce sont les seules exceptions? Où est la spéc/doc?invoquant des macros dans MASM

OK, ce que je suis en train de faire est la suivante:

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

external puts, fgets, printf, srand, rand 

Et je reçois: erreur de syntaxe: pour

Il semble déjà être l'interprétation de la directive extern et trouve la pour macro à l'intérieur qui n'est pas autorisé => erreur de syntaxe.

Que puis-je faire? Vous pouvez diviser une directive sur plusieurs lignes si vous terminez chaque ligne avec une virgule, n'est-ce pas? Mais s'il n'interprète pas les appels de macro, il n'y a pas d'aide.

J'ai découvert que je peux faire:

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

external puts, fgets, printf, srand, rand 

Mais la multiplication de la directive n'est pas toujours une option. Prenez la directive proc f.ex. Je ne peux pas utiliser l'en-tête proc pour le même proc plusieurs fois.

Y a-t-il une solution intelligente à ce dilemme? Est-il possible d'utiliser des macros MASM pour produire une seule ligne de sortie? Je ne sais pas comment. Rush à la rescousse, tous les nerds là-bas! :) Cheerioh

+0

Une bonne documentation que j'ai trouvée est [ceci de Randall Hyde] (http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html). Voir le chapitre 8 pour les directives MASM. – zx485

+0

Avez-vous lu la documentation? – fuz

+0

Les gens qui votent pour une question sont simplement horribles. – pyetti

Répondre

3

La signature du EXTERN directive est

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

Vous pouvez donc créer un one-liner avec le CATSTR directive comme ceci:

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 

Il est sortie en une ligne:

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

De même, si y Vous souhaitez utiliser la sortie d'un MACRO en entrée d'un autre paramètre ou expression MACRO, vous pouvez utiliser la directive EXITM (https://msdn.microsoft.com/en-us/library/tb4885hc(v=vs.80).aspx).

+0

Super! Cela résout. :) J'ai expérimenté et trouvé quelque chose de très similaire au vôtre. Voir ci-dessous. – Henrik

1

Voici ce que j'ai trouvé. Très similaire à ce qui précède:

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) 

Cela fonctionne! On peut donc invoquer des fonctions de macro à partir de directives internes. Ils doivent être des FONCTIONS de macro, pas des procédures de macro.