Как в фасме получить метки часть имени которых задается числовой константой? Типа a = 1 @1: a = 2 @2: a = 1000 @1000:
Постарайтесь отказаться от использования меток. Ухудшается читаемость программы. Если всё-равно надо, то на масме будет так: Код (Text): delta dd 0 a dd 1000 mov ebp, delta mov eax, a jmp dword ptr [ebp+eax] Или вам паскаль ближе?
На masm`e легко делается Код (Text): MetkaNum=0 Metka CATSTR <metik_>,@CatStr(%MetkaNum) MetkaNum=MetkaNum+1 Metka: jmp metik_0
xRom2 Числовой константой (константой времени ассемблирования) — никак. Символической константой (константой времени препроцессорной обработки), содержащей число — легко: Код (Text): ;Allows calculations with preprocessor ;usage: result equcalc 15/2 mod result struc equcalc expr { rept 1 res:expr \{ restore . . equ res \} } ;jump table jmp label_1 jmp label_2 jmp label_4 ;a = 1 a equ 1 ;declare label_1 match a,a { label_#a: } ;a = a + 1 a equcalc a + 1 ;declare label_2 match a,a { label_#a: } ;a = 2*a a equcalc 2*a ;declare label_4 match a,a { label_#a: } Это будет работать на версиях, начиная с 1.69. На более старых вычисления с символическими константами также возможны, но нужны неслабые извращения. P.S. Опоздал на дофига минут... ну да ладно... бесполезным не будет.
Человек - ты гений! Ты единственный кто на просторах рунета и прочего нета подсказал работающий вариант. Спасибо! А можно еще вопрос? Почему в репте ты используешь "\{" а не просто "{"?
xRom2 Пожалуйста. Но в приведенном коде моих собственных идей не больше нуля. Ну и то, что никто другой не ответил, не означает, что никто другой не мог ответить. Для соответствия скобке, закрывающей макроблок rept. Это чисто эстетическая потребность. А вот закрывающая скобка обязана быть экранированной слешем. В противном случае она бы трактовалась, как закрытие макроса struc equcalc, а не блока rept. Во время раскрытия каждого макроса fasm убирает один слеш перед каждым символом (имеется в виду symbol, а не character). Поэтому после раскрытия struc equcalc скобки "\{" и "\}" станут скобками "{" и "}". После этого макроблок rept будет раскрыт так, как будто никаких экранирующих слешей перед скобками нету. По ссылке, приведенной iZzz32 в шестом посте есть как раз пример "извращений" с вычислениями над символическими константами для версий fasm ранее 1.69. Там довольно активно используются экранирующие слеши, хотя автор и решил не ставить их перед открывающими скобками. P.S. Кстати, не обязательно каждый раз явно писать match. Можно и так: Код (Text): macro lbl namestart*, nameend* { match n1 n2, namestart nameend \{ n1\#n2: \} } ;jump table jmp label_1 jmp label_2 jmp label_4 a equcalc 1 lbl label_,a a equcalc 2 lbl label_,a a equcalc 4 lbl label_,a
l_inc задолбали эти профессионалы фасма ??? - никакого житья от них, еще и учить лезут мой 16- битный дос вариант на масме Код (Text): ;;======[ MACRO ]================================= @Call_far\ MACRO\ Tag:req,\ Method_ID:req ;;---------------------------------------- IFNDEF &Tag&_0 &Tag&_Ordinal\ = 0 ELSE &Tag&_Ordinal\ = &Tag&_Ordinal+1 ENDIF ;;---------------------------------------- @_Tag TEXTEQU\ @CATSTR (Tag,<_>,%(&Tag&_Ordinal)) ;;---------------------------------------- IF @Watch %ECHO @Module %ECHO\ @CATSTR (Tag,<_>,%(&Tag&_Ordinal)) ENDIF ;;---------------------------------------- BYTE 9Ah ;; code(call) WORD Method_ID ;; ofs(Method) @_Tag\ WORD ? ;; seg(Method) ;;---------------------------------------- ENDM