ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
2 июня
173162
AlexAbel (22.11.2009 12:22 - 12:34, просмотров: 12626)
Как реализовать поведение макроса #V() на ASM30? В MPASM для PIC16, PIC18 есть макрос #V() с помощью которого можно взять значение переменной подставленной в скобках, например: a=6 entry#v(a) после компиляции получаем: entry6 Вот описание из даташита "MPASM & MPLINK (33014J).pdf" 7.4 MACRO DEFINITION arg | Substitute the argument text supplied as part of the macro invocation --------------------------------------------------------------------------------------------------- #v(expr) | Return the integer value of expr. Typically used to create unique variable |names with common prefixes or suffixes. Cannot be used in conditional |assembly directives (e.g. ifdef, while). --------------------------------------------------------------------------------------------------- String replacement and expression evaluation may appear within the body of a macro. Arguments may be used anywhere within the body of the macro, except as part of normal expression. The exitm directive provides an alternate method for terminating a macro expansion. During a macro expansion, this directive causes expansion of the current macro to stop and all code between the exitm and the endm directives for this macro to be ignored. If macros are nested, exitm causes code generation to return to the previous level of macro expansion. EXAMPLE 7-1: MACRO CODE GENERATION The following macro: define_table macro local a = 0 while a < 3 entry#v(a) dw 0 a += 1 endw endm When invoked, would generate: entry0 dw 0 entry1 dw 0 entry2 dw 0 entry3 dw 0 Ниже следующий метод не подходит .irpc n,1234 VAR\n: .endr This will generate the following code: VAR1: VAR2: VAR3: VAR4: Директива .irpc в цикле генерит меки сразу для всех возможных вариантов, соответственно адреса у этих меток будут одинаковыми. А если написать так, то получим: i=5 .irpc n,i VAR\n: .endr This will generate the following code: VARi: Мне нужно написать следующий код: SP = 0 call LAB#v(SP) nop nop SP = SP +1 call LAB#v(SP) и т.д. LAB0 nop nop return LAB1 nop nop return Побовал для данной задачи использовать счётчик вызова макросов \@, но он тоже какой-то бестолклвый, выдаёт значения начиная с колличества ранее выполненых макросов. Нет возможности сбросить счётчик \@ числа вызовов макросов. Вот пример из даташита на ASM30: .macro make_buffers num,size BUF\@: .space \size .if (\num - 1) make_buffers (\num - 1),\size .endif .endm .bss make_buffers 4,16 ; create BUF0..BUF3, 16 bytes each если перед вызовом make_buffers не выполнялись другие макросы, то всё будет как написано в примере, а если вызвать к примеру один любой макрос, то все номера сдвинутся на +1. Просто говоря, нужно каким-то образом заставить ASM30 подставлять значения переменной SP или любой другой. Я пробовал сделать так: .macro __AAAA NAME, SP \NAME\SP: .endm __AAAA LAB, 7 ;создаётся метка с именем LAB7 Но если написать так: i = 7 __AAAA LAB, i То компилятор ругается, а нужно сгенерить метку LAB7 - как не знаю. А если написать так .macro __AAAA NAME, SP call \NAME\SP .endm То ругается ещё сильнее. Вопрос - как реализовать поведение макроса #V() на ASM30? С уважением. Алексей.