AlexAbel (22.11.2009 12:22 - 12:34, просмотров: 12920)
Как реализовать поведение макроса #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?
С уважением. Алексей.