Это: macro lab n {label lab_#n} La=1 Lb equ 2 lab La lab Lb создает метки lab_La и lab_Lb, а требуется lab_1 и lab_2. Прошу подсказать.
Пасибо за ответ, но 1 и 2 (числа вставляемые в имена меток) требуются динамические - т.е. в зависимости он некоторых условий масрос вычисляет число и формирует метку с включением его в имя, а fix - статика.
В форуме нашел такой пример: http://www.wasm.ru/forum/viewtopic.php?id=33793 где использовано такое: ... n=n+1 ... virtual at esp .loc#n: ... Однако под facm 1.68 этот пример не работает. Так как же?
Может автор уже забыл про эту ветку, но я всё же напишу, вот макросы, которые позволяют манипулировать с названиями как с числами, только объявлять надо через "=". Код (Text): macro pre_mul result,x,y { match xx yy,x y { result equ xx rept xx { match w,result { rept yy j:w { result equ j \\\\} \\\} \\} \} } macro pre_div result,remainder,x,y { match xx yy,x y { remainder equ 0 result equ 0 rept xx { pre_inc remainder,remainder match t,remainder { match =t,yy { pre_inc result,result remainder equ 0 \\\\} \\\} \\} \} } macro pre_add result,x,y { match xx yy,x y { rept yy j:xx { result equ j \\} \} pre_inc result,result } macro pre_sub result,x,y { match xx yy,x y { result equ xx rept yy { pre_dec result,result \\} \} } macro pre_inc result,x { match xx,x { rept 2 j:xx { result equ j \\} \} } macro pre_dec result,x { match xx,x { rept xx j:0 { result equ j \\} \} } Думаю, что должно помочь. Где вы думаете я нашёл это??? Правильный ответ - на флатассемблер.нэт. Макросов там .... P.S.: Макродвижок у фасма конечно не ахти. Я пытался написать макро, который бы объявлял строки, а потом резервировал для них место в нужном месте *(. Да и ещё чтобы находил дубликаты и использовал одну метку на несколько строк. До сих пор пишу.... =О
любители дос кодинга на масме эту проблему решают так - Код (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 использовать так Код (Text): @Watch=1 @Call_far\ wrap_bem,@AL_Case_Up_ID @Call_far\ wrap_bem,@AL_Case_Up_ID где @AL_Case_Up_ID смещение 16 бит процедуры установки верхнего регистра для символа в результате будут созданы две метки по адресам которых надо будет записать сегмент процедуры установки верхнего регистра для символа имена меток wrap_bem_0 и wrap_bem_1
Есть прием использования вложенной директивы match, я всегда им пользуюсь. Так как параметры макроинструкций не заменяются их значениями, то здесь следует вспомнить директиву match, у которой параметры, если это символьные константы(определенные с помощью equ или define) как раз заменяются, мы ее просто вкладываем в макрос. И это после препроцессинга Код (Text): macro lab n { match value ,n \{ label lab_\#value \} } La=1 Lb equ 2 lab La lab Lb превращается в это Код (Text): ;macro lab n ;{ ; match value,n ; \{ ; label lab_ \# value ; \} ;} La=1 ;Lb equ 2 ;lab La ;match value,La ;{ ; label lab_#value ;} label lab_La ;lab Lb ;match value,2 ;{ ; label lab_#value ;} label lab_2 Видно, что с "=" это не работает, т.к. "=" обрабатывается на стадии ассемблирования.