MAKRÁ

CATSTR | INSTR | SIZESTR | SUBSTR | IRP | IRPC | REPT | WHILE | GOTO

Špeciálne makro operátory

Pojem makro je vám už určite známi. Makro je možné definovať ako substitúciu (inak povedané makro pod svojím menom zoskupuje príkazy, alebo inštrukcie, ktoré sa majú vykonať). Výhodou je, že napr.: často sa opakujúcu časť programu nemusíte stále opisovať, naopak nevýhodou je, že čím viac sa makro v zdrojovom texte objaví tým väčší bude kód programu.

Syntax:
meno MACRO [parameter1 [,parameter2]...]

;sem treba vložiť inštrukcie,
;ktoré budú tvoriť makro

ENDM

Nasledujúci príklad ukazuje ako vytvoriť, resp. použiť makro. Nech sa páči, vyskúšať.

Príklad:

.MODEL SMALL

 

.STACK 100H

 

.DATA

TEXT1

DB 'TOTO JE TEXT 1',13,10,'$'

TEXT2

DB 'TOTO JE TEXT 2',13,10,"$"

VYPIS_SPRAVU

MACRO RETAZEC

 

LEA DX,RETAZEC

 

MOV AH,09H

 

INT 21H

 

ENDM

PAUSE

MACRO

 

MOV AX,0

 

INT 16H

 

ENDM

CLS

MACRO

 

MOV AX,3

 

INT 10H

 

ENDM

 

.CODE

START:

MOV AX,@DATA

 

MOV DS,AX

 

CLS

 

VYPIS_SPRAVU TEXT1

 

PAUSE

 

VYPIS_SPRAVU TEXT2

 

PAUSE

 

CLS

 

MOV AX,4C00H

 

INT 21H

 

END START

Turbo assembler má už v sebe definovaných niekoľko makier. Sú to nasledujúce makrá (CATSTR, INSTR, SIZESTR, SUBSTR, IRP, IRPC, REPT, WHILE, GOTO). O každom si povieme niekoľko slov. Prvé štyri sa používajú na prácu s reťazcami. Ak máte nižšiu verziu assembleru ako 3.1 treba pred ich použitím uviesť direktívu MASM51. Direktíva povoľuje písanie zdrojového textu v rozšírenom režime. Verzia assembleru 3.1 vyhodnocuje makrá (CATSTR, INSTR, SIZESTR, SUBSTR) aj bez použitia direktívy MASM51. Zostávajúce makrá sa používajú na prácu s cyklami.

 

CATSTR - spojí viac reťazcov do jedného.

Syntax: name CATSTR string [, string]...

Príklad: LETTERS CATSTR <abc>,<def>

Po preklade: LETTERS="abcdef"

 

INSTR - výstupom makra je pozícia prvého výskytu druhého reťazca v prvom reťazci. Ak druhý reťazec nie je v prvom obsiahnutí vráti makro nulu.

Syntax: name INSTR [start, ] string1, string2

Príklad: KOLKO INSTR 1,<PROGRAMUJEME V ASSEMBLERI>,<V>

Po preklade: KOLKO=0EH

 

SIZESTR - výstupom makra je dĺžka reťazca. Prázdny reťazec má dĺžku nula.

Syntax: name SIZESTR string

Príklad: DLZKA SIZESTR <PROGRAMUJEME V ASSEMBLERI>

Po preklade: DLZKA=19H

 

SUBSTR - definuje nový reťazec, ako časť pôvodného reťazca.

Syntax: name SUBSTR string, position [, size]

Príklad: NOVY SUBSTR <ABCDEFGH>,3,2

Po preklade: NOVY="CD"

IRP
- opakuje n-krát po sebe text pričom v ňom zároveň nahradzuje parameter postupne argumentmi 1 až N. Text je ukončený direktívou ENDM rovnako ako makro.

Syntax:
IRP parameter, <argument1, argument2,...>

;TEXT
ENDM

Príklad:
IRP REGISTER,<AX,BX,CX,DX>
PUSH REGISTER
ENDM

Po preklade:
PUSH AX
PUSH BX
PUSH CX
PUSH DX

IRPC - makro opakuje text s nahradzovaním znaku.

Syntax:
IRPC paremeter, string
;TEXT
ENDM

Príklad:
IRPC ZNAK,0123
DB ZNAK
ENDM

Po preklade:
DB 0
DB 1
DB 2
DB 3

REPT - makro kopíruje text toľkokrát, koľkokrát určuje hodnota počet.

Syntax:
REPT počet
;TEXT
ENDM

Príklad:
REPT 3
DEC AX
ENDM

Po preklade:
DEC AX
DEC AX
DEC AX

WHILE - prekladač opakuje inštrukcie makra do tej doby, pokým nebude podmienka 0 (FALSE).

Syntax:
WHILE podmienka
;Telo makra
ENDM

GOTO - makro umožňuje preniesť riadenie na riadok označený návestím. Návestie musí začínať znakom dvojbodka ":", napríklad ":start".

Syntax: GOTO návestie

 

Špeciálne Makro Operátory

Operátor "&" umožňuje pri rozvinutí makra nahradiť symbolické meno skutočným. Syntax: &name

Pri použití operátora "< >" je reťazec chápaný ako konštantný výraz, krorý sa ničím nenahradzuje. Syntax: <text>

Operátor "!" je analogický a operátorom "< >" s tým rozdielom, že platí iba pre jeden znak (character). Syntax: !character

Operátor "%" sa používa vtedy ak chceme, aby sa výraz pred nahradením vyhodnotil. Syntax: %text

Operátor ";;" spôsobí ignorovanie komentára v bloku makra, t.j. pri rozvíjaní makra sa tento text už neopisuje. Syntax: ;;comment