Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:asm_macro

Macro

Assembler v LnxSpectrum od verze 1.3.1 nově obsahuje podporu pro makra. Díky makru si můžete vytvořit vlastní sekvenci často používaných instrukci, a schovat jí pod svůj vlastní název. Makro může být definováno sice kdekoliv, ale vždy musí být definice dokončena před jeho použitím. Nejlépe je definovat makra na začátku main.asm souboru, nebo ještě lépe vytvořit nový samostatný ASM soubor pojmenovaný macro.asm, v něm makro definovat a potom ho na začátku main.asm připojit pomocí include „macro.asm“.

Základní použití makra

Makro definujeme instrukci kompileru v kódu #macro název. Definování musíme ukončit pomocí instrukce #endm.

Jako příklad vytvoříme jednoduché makro pro kopírování krátkého bloku dat:

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:

#macro Copy
		ld	de,16384
		ld	bc,32
		ldir
#endm

; tady začne náš hlavní program, kde zavoláme i naše makro:

		org	50000

		ld	hl,0
		Copy
		ret

v debugeru potom vidíme, že kompiler vytvořil tuto posloupnost kódu od adresy 50000:

		ld	hl,0
		ld	de,16384
		ld	bc,32
		ldir
		ret

Makro s parametrem

V definici makra můžeme použít parametry. Parametrem makru říkáme, že některá hodnota se může měnit v závislosti na použití. Takové makro nadefinujeme pomocí #macro název parametr1, parametr2. Parametrů může být více. Název parametru musí obsahovat nejméně 5 znaků. Jako příklad vytvoříme makro s parametrem pro kopírování krátkého bloku dat:

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:
#macro Copy Zdroj
		ld	hl,Zdroj
		ld	de,16384
		ld	bc,6912
		ldir
#endm

; tady začne náš hlavní program, použijeme i naše makro:

		org	50000

		Copy	32768
		Copy	8000
		ret

V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000:

		ld	hl,32768
		ld	de,16384
		ld	bc,6912
		ldir
		ld	hl,8000
		ld	de,16384
		ld	bc,6912
		ldir
		ret

Rozšířené použítí makra

Parametr může být použitý i pro definice vlastní instrukce:

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:
#macro Matem Instr
		Instr	hl,de	
#endm

; tady začne náš hlavní program, použijeme i naše makro:

		org	50000

		Matem 	adc
		Matem 	sbc
		ret

V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000:

		adc	hl,de
		sbc	hl,de
		ret

Ještě jeden příklad pro definice vlastní instrukce:

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:
#macro CByte Param1, Param2
		ld	Param1,Param2	
#endm

; tady začne náš hlavní program, použijeme i naše makro:

		org	50000

		CByte 	a,b
		CByte 	c,d
		ret

V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000:

		ld	a,b
		ld	c,d
		ret

V makru se můžou používat návěstí stejným způsobem jako kdekoliv jinde v kódu. Není ale možné používat návěstí definované uvnitř v makru kdekoliv jinde (například z main.asm). Všechny návěstí definované uvnitř makra jsou totiž při každém použití makra unikátní.

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:
#macro Wait Kolik
		ld	b,Kolik
Smycka:		nop
		djnz	Smycka	
#endm

; tady začne náš hlavní program, použijeme i naše makro:

		org	50000

		Wait	100
		Wait	200
		ret

V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000:

		ld	b,100 
M1_Smycka:	nop 
		djnz	M1_Smycka 
		ld	b,200 
M2_Smycka:	nop 
		djnz	M2_Smycka 
		ret

Návěstí definované mimo makro použít uvnitř makra můžeme.

; LnxSpectrum ASM editor (www.ilnx.cz)

; nadefinujeme si makro:
#macro Copy
		ld	hl,0
		ld	de,Video
		ld	bc,6912
		ldir
#endm

; tady začne náš hlavní program, použijeme i naše makro:

		org	50000

Video		equ	16384

		Copy
		ret

V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000:

		ld	hl,0 
		ld	de,16384 
		ld	bc,6912 
		ldir 
		ret 

Názvy unikátních návěstí se běžně v seznamu návěstí nezobrazují. Pokud je chceme zobrazit, nastavíme v zobrazení návěstí zdrojový modul na Macro. Ačkoliv tyto názvy se dají volat odkudkoliv z kódu, nedoporučujeme je využívat. Kompiler tyto názvy generuje dynamicky, a v průběhu psaní vlastního kódu je může změnit.

lnxspectrum/asm_macro.txt · Poslední úprava: 2018/07/31 10:05 (upraveno mimo DokuWiki)