2015-12-13 3 views
-2

У меня есть макрос X, который делает некоторые вещи вроде этого.Как вызвать макрос c из процедуры сборки?

#define X(a,b,c) \ 
    a.foo = b;  \ 
    a.bar = c; 

Я хочу назвать X из обычной сборки, например, так:

.data 
pushl $eax; 
call X(a, b, c); 

Есть ли способ сделать это?

+3

макрос не является функцией – Alexguitar

+0

вправо, но мой макрос инициализирует некоторые переданные ему переменные, как мне запустить этот инициализирующий макрос из сборки? – Alex

+1

Макросы являются частью препроцессора ** C **. Ассемблер не C. Итак ... – Olaf

ответ

3

Макрос не является функцией, что означает, что у него нет адреса, поэтому вы не можете его назвать.

Макросы оцениваются препроцессором. Использование их просто приводит к простой замене текста, в результате они существуют только в исходном файле и нигде больше.

Однако, что вы можете сделать, это настроить функцию-оболочку для макроса и вызвать ее вместо этого. Например:

#define X(a, b, c) (a).foo = (b); \ 
    (a).bar = (c) 

void _X(struct foo *a, int b, int c) 
{ 
    X(*a, b, c); 
} 

Но это просто устраняет необходимость в макросе в первую очередь. Таким образом, вы можете также избавиться от макроса и использовать функцию.

+0

Мне нравится окончание первого предложения :-) Обратите внимание, что макросы не вычисляются ** во время ** компиляции, а раньше (таким образом, ** pre ** processor) - строго говоря ; как инструментальная цепочка фактически обрабатывает это, является другим предметом. – Olaf

+0

@ Олаф да, мой плохой – Alexguitar

+0

Спасибо! Это была моя первоначальная догадка, но ваш ответ прояснил концепцию alot – Alex

Смежные вопросы