Problema con una macro rebelde?
Hola, tengo un problemilla con una macro; La llamo una vez y funciona bien y seguidamente la vuelvo a llamar y me dá un error:
**Error** prac5.asm(216) CADNOMBRE(9) Symbol already defined elsewhere: BUCLE1
**Error** prac5.asm(216) CADNOMBRE(22) Symbol already defined elsewhere: BUCLE2
bucle1 y 2 son dos etiquetas de la macro. Alguien sabe que puede pasar? Muchas gracias de antemano. Felices fiestas
**Error** prac5.asm(216) CADNOMBRE(9) Symbol already defined elsewhere: BUCLE1
**Error** prac5.asm(216) CADNOMBRE(22) Symbol already defined elsewhere: BUCLE2
bucle1 y 2 son dos etiquetas de la macro. Alguien sabe que puede pasar? Muchas gracias de antemano. Felices fiestas
Las macros copian el codigo in-line, es decir el precompilador lo que hace es copiar el codigo de la macro literalmente, luego si tienes etiquetas las copia exactamente con el mismo nombre y por tanto las duplica, a continuacion el compilador se las encuentra duplicadas.
Mejor usa procedimientos y si necesitas velocidad si tu compilador lo soporta puedes emplear la clausula inline para que incruste el codigo correspondiente en lugar de hacer una llamada que siempre es mas lento ten en cuenta que el uso de procedimiento inline engordara el ejecutable.
Saludos.
David
---
CEINTEC Cursos de Informatica http://www.ceintec.com
Mejor usa procedimientos y si necesitas velocidad si tu compilador lo soporta puedes emplear la clausula inline para que incruste el codigo correspondiente en lugar de hacer una llamada que siempre es mas lento ten en cuenta que el uso de procedimiento inline engordara el ejecutable.
Saludos.
David
---
CEINTEC Cursos de Informatica http://www.ceintec.com
Define esas dos etiquetas dentro de la macro como locales. Eso te permitirá no una, sino cuantas veces quieras. La directiva para ello es LOCAL XXX_1, XXX_2, ETC, ETC. siendo xxx cada una de las etiquetas. De todas formas, si incluyes la macro dos veces en el programa te ocupará sitio y bytes duplicados generando un EXE o un COM más grande e innecesario. Lo mejor es que metas la macro en un rutina y la llamas con un call zzz siendo zzz el procedimiento donde esté la macro. Ejemplo:
procedimiento proc near
mov ax,4
call rutina_macro
ret
endp
rutina_macro:
macro_1
ret
macro_1 macro
local bucle_1,bucle_2
mov cx,3
bucle_1:
push cx
mov cx,5
bucle_2:
loop bucle_2
pop cx
loop bucle_1
endm
Espero que te sirva.
[email protected]
Analista Programador en Ensamblador
procedimiento proc near
mov ax,4
call rutina_macro
ret
endp
rutina_macro:
macro_1
ret
macro_1 macro
local bucle_1,bucle_2
mov cx,3
bucle_1:
push cx
mov cx,5
bucle_2:
loop bucle_2
pop cx
loop bucle_1
endm
Espero que te sirva.
[email protected]
Analista Programador en Ensamblador
