1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Передача названия константы в макрос

Тема в разделе "NASM", создана пользователем Jin X, 23 апр 2017.

Метки:
  1. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    332
    Адрес:
    Кольца Сатурна
    Я хочу сделать так, чтобы макрос получал название константы, а не её значение. И дальше присвоить этой константе нужное значение.
    Т.е.:
    Код (Text):
    1. %macro def 1
    2.   %assign %1 5
    3. %endmacro
    4.  
    5. def y
    6. mov eax,y
    В таком виде всё работает, но! Если значение y уже определено, то передаваться будет не имя константы, а её значение. Т.е. если перед def y написать %assign y 0, конструкция полетит.

    Но это ещё не всё! :)
    Я хочу, чтобы такому макросу можно было передавать локальные константы:
    Код (Text):
    1. %macro dodef 0
    2.   %assign %%y 0
    3.   def %%y
    4.   mov eax,%%y
    5. %endmacro
    Манипуляции с передачей имени в виде строки (с использованием %deftok и т.п.) не помогают.
    Вариант с использованием %undef перед вызовом макроса не хочу (хоть он и работает... вот если бы внутри макроса можно было сделать %undef :)):
    Код (Text):
    1. %macro def 1
    2.   %assign %1 5
    3. %endmacro
    4.  
    5. %assign y 0
    6. %undef y
    7. def y
    8. mov eax,y
    Использование %[%1] вместо %1 тоже не даёт никакого эффекта (да и не должно, т.к. это наоборот принуждение использовать именно значение).

    На данный момент у меня получается сделать только вот так:
    Код (Text):
    1. %macro def 1
    2.   %assign %1_ 5
    3. %endmacro
    4.  
    5. %assign y_ 0
    6. def y
    7. mov eax,y_
    Но это тоже не вот прям красота, т.к. придётся использовать "лишний" символ. Если бы можно было писать def y? и удалить лишний последний символ... может, можно как-то?

    Использовать def 'y' я согласен, но как превратить это в идентификатор внутри макроса? (%deftok, повторюсь, преобразует результат в значение). И смогу ли я тогда передавать локальные константы?

    Как можно решить эту задачку? В TASM/MASM с этим проблем вообще нет...

    p.s. Специально использую слово "константа" во избежание каламбура, хоть они и называются в NASM "однострочными макросами"...
     
    Последнее редактирование: 23 апр 2017