10-Jan-05 14:26 Leha Bishletov wrote to Alexey Boyko:
LB>>> Подскажите, как в GNU AS, в теле макроса создать локальную метку? LB>>> Про метки 1 2 3 ... я знаю, но хотелось бы метку с нормальным LB>>> именем и уникальную. AB>> Попробуй что-то вроде some_label\@: AB>> '\@' - вроде как должно замениться счетчиком макросов.
LB> Не работает ...
.macro foo cnt, lev ldi \cnt, \lev b\@ : dec \cnt brne b\@ .endm
foo R16, 10 ; --------------- foo R17, 15
.end
as из avr-gcc
C:\WinAVR-20040720\bin>avr-as.exe --version GNU assembler 2.15 + coff-avr-patch (20030831) Copyright 2002 Free Software Foundation, Inc.
7 8 foo R16, 10 8 0000 0AE0 > ldi R16,10 8 > b0: 8 >
8 0002 0A95 > dec R16 8 0004 F1F7 > brne b0 9 ; --------------- 10 foo R17, 15 10 0006 1FE0 > ldi R17,15 10 > b1: 10 >
10 0008 1A95 > dec R17 10 000a F1F7 > brne b1 11
LB> А я стартап не трогал, пока. Но мне надо достаточно быстро LB> (10мкс/канал) обрабатывать результаты измерения АЦП по 4-ем каналам. LB> Алгоритм обработки одинаковый, но номера каналов, управляемых выходов, LB> флагов и т.п. разные. Вот и получается, что проще написать макрос и LB> использовать его с разными параметрами.
.macro foo channel, cnt, lev ldi \cnt, \lev delay_\channel : dec \cnt brne delay_\channel .endm
foo 0, R16, 10 ; --------------- foo 1, R17, 15
.end
Те же, там же:
8 foo 0, R16, 10 8 0000 0AE0 > ldi R16,10 8 > delay_0: 8 >
8 0002 0A95 > dec R16 8 0004 F1F7 > brne delay_0 9 ; --------------- 10 foo 1, R17, 15 10 0006 1FE0 > ldi R17,15 10 > delay_1: 10 >
10 0008 1A95 > dec R17 10 000a F1F7 > brne delay_1
Т.е. номер канала "уникализирует" метки, начало имени которых несёт смысловую нагрузку по алгоритму.
wbr,