2017-01-20 7 views
0

У меня проблемы. Макросы MASM, похоже, не ведут себя как макросы C вообще. C имеет препроцессор, который обрабатывает текст как последовательность токенов, и вы можете поместить вызов макроса где угодно. Не так в MASM кажется. Я не могу найти подходящий документ для этого, но вы не можете вызвать макрос внутри директивы, не так ли? За исключением случаев, когда это часть пар в другом вызове макроса? Или когда он появляется внутри макроса def? Это единственные исключения? Где спецификация/документ?вызов макросов в MASM

Хорошо, что я пытаюсь сделать это:

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

external puts, fgets, printf, srand, rand 

И я получаю: ошибку синтаксиса: для

Кажется, уже будет интерпретировать Экстерн директивы и находит для макроса внутри которого недопустимо => синтаксическая ошибка.

Что, черт возьми, я могу сделать? Вы можете разделить директиву на несколько строк, если вы заканчиваете каждую строку запятой, не так ли? Но если он не интерпретирует вызовы макросов, в этом нет никакой помощи.

я обнаружил, что я могу сделать:

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). См. Главу 8 для директив MASM. – 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 ou хотите использовать вывод MACRO в качестве входного сигнала другому параметру или выражению MACRO, вы можете использовать директиву EXITM (https://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) 

Это работает! Поэтому можно действительно вызывать макрофункции из внутренних директив. Они должны быть макрофункциями, а не макро процедурами.