MAKRA

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

Specialne makro operatory

Pojem makro je vam uz urcite znami. Makro je mozne definovat ako substituciu (inak povedane makro pod svojim menom zoskupuje prikazy, alebo instrukcie, ktore sa maju vykonat). Vyhodou je, ze napr.: casto sa opakujucu cast programu nemusite stale opisovat, naopak nevyhodou je, ze cim viac sa makro v zdrojovom texte objavi tym vacsi bude kod programu.

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

;sem treba vlozit instrukcie,
;ktore budu tvorit makro

ENDM

Nasledujuci priklad ukazuje ako vytvorit, resp. pouzit makro. Nech sa paci, vyskusat.

Priklad:

.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 ma uz v sebe definovanych niekolko makier. Su to nasledujuce makra (CATSTR, INSTR, SIZESTR, SUBSTR, IRP, IRPC, REPT, WHILE, GOTO). O kazdom si povieme niekolko slov. Prve styri sa pouzivaju na pracu s retazcami. Ak mate nizsiu verziu assembleru ako 3.1 treba pred ich pouzitim uviest direktivu MASM51. Direktiva povoluje pisanie zdrojoveho textu v rozsirenom rezime. Verzia assembleru 3.1 vyhodnocuje makra (CATSTR, INSTR, SIZESTR, SUBSTR) aj bez pouzitia direktivy MASM51. Zostavajuce makra sa pouzivaju na pracu s cyklami.

 

CATSTR - spoji viac retazcov do jedneho.

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

Priklad: LETTERS CATSTR <abc>,<def>

Po preklade: LETTERS="abcdef"

 

INSTR - vystupom makra je pozicia prveho vyskytu druheho retazca v prvom retazci. Ak druhy retazec nie je v prvom obsiahnuti vrati makro nulu.

Syntax: name INSTR [start, ] string1, string2

Priklad: KOLKO INSTR 1,<PROGRAMUJEME V ASSEMBLERI>,<V>

Po preklade: KOLKO=0EH

 

SIZESTR - vystupom makra je dlzka retazca. Prazdny retazec ma dlzku nula.

Syntax: name SIZESTR string

Priklad: DLZKA SIZESTR <PROGRAMUJEME V ASSEMBLERI>

Po preklade: DLZKA=19H

 

SUBSTR - definuje novy retazec, ako cast povodneho retazca.

Syntax: name SUBSTR string, position [, size]

Priklad: NOVY SUBSTR <ABCDEFGH>,3,2

Po preklade: NOVY="CD"

IRP
- opakuje n-krat po sebe text pricom v nom zaroven nahradzuje parameter postupne argumentmi 1 az N. Text je ukonceny direktivou ENDM rovnako ako makro.

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

;TEXT
ENDM

Priklad:
IRP REGISTER,<AX,BX,CX,DX>
PUSH REGISTER
ENDM

Po preklade:
PUSH AX
PUSH BX
PUSH CX
PUSH DX

IRPC - makro opakuje text s nahradzovanim znaku.

Syntax:
IRPC paremeter, string
;TEXT
ENDM

Priklad:
IRPC ZNAK,0123
DB ZNAK
ENDM

Po preklade:
DB 0
DB 1
DB 2
DB 3

REPT - makro kopiruje text tolkokrat, kolkokrat urcuje hodnota pocet.

Syntax:
REPT pocet
;TEXT
ENDM

Priklad:
REPT 3
DEC AX
ENDM

Po preklade:
DEC AX
DEC AX
DEC AX

WHILE - prekladac opakuje instrukcie makra do tej doby, pokym nebude podmienka 0 (FALSE).

Syntax:
WHILE podmienka
;Telo makra
ENDM

GOTO - makro umoznuje preniest riadenie na riadok oznaceny navestim. Navestie musi zacinat znakom dvojbodka ":", napriklad ":start".

Syntax: GOTO navestie

 

Specialne Makro Operatory

Operator "&" umoznuje pri rozvinuti makra nahradit symbolicke meno skutocnym. Syntax: &name

Pri pouziti operatora "< >" je retazec chapany ako konstantny vyraz, krory sa nicim nenahradzuje. Syntax: <text>

Operator "!" je analogicky a operatorom "< >" s tym rozdielom, ze plati iba pre jeden znak (character). Syntax: !character

Operator "%" sa pouziva vtedy ak chceme, aby sa vyraz pred nahradenim vyhodnotil. Syntax: %text

Operator ";;" sposobi ignorovanie komentara v bloku makra, t.j. pri rozvijani makra sa tento text uz neopisuje. Syntax: ;;comment