FASM и генерация меток с порядковым номером

FASM и генерация меток с порядковым номером

Сообщение xRom » Пн апр 25, 2011 9:31 am

Можно ли в фасме сгенерировать метку вида: "a0001:" где номер задается переменной? То есть примерно так:

a = 1
m1:
a = 2
m2:
a = 10000
m10000:

и тд?
xRom
посетитель
 
Сообщения: 16
Зарегистрирован: Пн апр 25, 2011 9:17 am

Re: FASM и генерация меток с порядковым номером

Сообщение xrnd » Пн апр 25, 2011 11:23 pm

Хм. Надо подумать. Можно написать макрос с оператором #. Примерно такой:
Код: Выделить всё
macro metka num
{
  m#num:
}


Он будет нормально работать с константами, но вот переменную ему передать не получится. Вместо значения подставляется её имя.
Код: Выделить всё
    metka 101   ; Объявляет метку m101:
    a = 1
    metka a ; Объявляет ma:


А для чего нужен такой изврат? Может проще обойтись локальными или анонимными метками? :?
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm

Re: FASM и генерация меток с порядковым номером

Сообщение xRom » Пн апр 25, 2011 11:51 pm

xrnd писал(а):Он будет нормально работать с константами, но вот переменную ему передать не получится. Вместо значения подставляется её имя. А для чего нужен такой изврат? Может проще обойтись локальными или анонимными метками? :?

Ну если ты не будешь смеяться, то хочу написать аналог for/next, то есть из одного макроса нужна возможность переходить внутрь друого например если for проверил условие и цикл не должен повториться ни разу, или когда next переходит на следующую итерацию. Вобще странно что в таком продвинутом языке отсутствует аналог тасмовсого & позволяющего подставлять имя переменной в качестве символа.
xRom
посетитель
 
Сообщения: 16
Зарегистрирован: Пн апр 25, 2011 9:17 am

Re: FASM и генерация меток с порядковым номером

Сообщение xrnd » Вт апр 26, 2011 1:05 pm

Для этого можно использовать директиву local внутри макроса.
Вот пример:

Код: Выделить всё
macro .while [arg]
{
  common
  local ..while
  __WHILE equ ..while
  local ..endw
  __ENDW equ ..endw
  __WHILE:
  JNCOND __ENDW,arg
}

macro .endw
{
  jmp __WHILE
  __ENDW:
  restore __ENDW
  restore __WHILE
}


Директива local объявляет имена меток, которые заменяются уникальными именами при каждом вызове макроса.
Зачем-то имя должно начинаться с двух точек. Я до конца не разобрался.
Директивы restore восстанавливают предыдущее значение __ENDW и __WHILE, чтобы можно было делать вложенные циклы.
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm

Re: FASM и генерация меток с порядковым номером

Сообщение xrnd » Вт апр 26, 2011 1:08 pm

Скорее всего, возможно сделать и такое объявление меток, как ты хочешь.
Вот только нужен будет специальный макрос для преобразования числа в строку с именем метки.
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm

Re: FASM и генерация меток с порядковым номером

Сообщение xRom » Вт апр 26, 2011 4:11 pm

xrnd писал(а):Скорее всего, возможно сделать и такое объявление меток, как ты хочешь.
Вот только нужен будет специальный макрос для преобразования числа в строку с именем метки.

Спасибо большое! Я совсем забыл про restore! Ведь по сути все равно как называется метка если я могу до нее достучаться.
xRom
посетитель
 
Сообщения: 16
Зарегистрирован: Пн апр 25, 2011 9:17 am

Re: FASM и генерация меток с порядковым номером

Сообщение insolor » Пт май 06, 2011 12:25 am

xrnd писал(а):Зачем-то имя должно начинаться с двух точек. Я до конца не разобрался.

Метка, имя которой начинается с точки, обрабатывается как локальная, и её имя прикрепляется к имени последней глобальной метки (с названием, начинающемся с чего угодно, кроме точки) для создания полного имени этой метки. Так, вы можете использовать короткое имя (начинающееся с точки) где угодно перед следующей глобальной меткой, а в других местах вам придется пользоваться полным именем. Метки, начинающиеся с двух точек - исключения. Они имеют свойства глобальных, но не создают новый префикс для локальных меток. (из FASM 1.64 Руководство Программиста)

Самому стало интересно, решил разобраться. К тому же пытаюсь реализовать макрос .switch
insolor
интересующийся
 
Сообщения: 5
Зарегистрирован: Вт апр 12, 2011 6:10 pm

Re: FASM и генерация меток с порядковым номером

Сообщение xrnd » Пт май 06, 2011 12:37 am

Они имеют свойства глобальных, но не создают новый префикс для локальных меток.


Совсем забыл об этом!
Тогда понятно, зачем используются такие метки - чтобы макросы .while/.endw не мешали локальным меткам, например внутри процедуры.

Так можно собственный язык программирования создать :idea: - в виде набора макросов FASM ;)
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm

Re: FASM и генерация меток с порядковым номером

Сообщение xRom » Пт май 06, 2011 10:39 am

xrnd писал(а):Совсем забыл об этом!
Тогда понятно, зачем используются такие метки - чтобы макросы .while/.endw не мешали локальным меткам, например внутри процедуры.
Так можно собственный язык программирования создать :idea: - в виде набора макросов FASM ;)

Вот чем я и занят. Если интересно могу выкладывать результат тут, если ругаться не будете :oops:
xRom
посетитель
 
Сообщения: 16
Зарегистрирован: Пн апр 25, 2011 9:17 am

Re: FASM и генерация меток с порядковым номером

Сообщение xrnd » Пт май 06, 2011 10:54 am

Конечно, выкладывай. Многим будет интересно посмотреть.
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm


Вернуться в Макросы FASM

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron