P rogramování v asembleru - TASM
-
Upload
aladdin-francis -
Category
Documents
-
view
36 -
download
1
description
Transcript of P rogramování v asembleru - TASM
MASM
Dodáván s VC „zdarma“ Jeden z nejstarších Intelský zápis instrukcí Téměř úplná podpora pro spolupráci s VPJ Nejednoznačné paměťové výrazy Minimální typová kontrola „Špatná“ interpretace segmentů uvnitř skupin
segmentů Pouze MS Windows
NASM
GNU licence - úplně zdarma Více OS Intelský zápis instrukcí Slabá podpora pro spolupráci s VPJ Jednoznačné paměťové výrazy Striktní typová kontrola Slabší makroprocesor
TASM
Dodáván s produkty Borland „zdarma“ Intelský zápis instrukcí Úplná podpora pro spolupráci s VPJ (včetně
objektů) Jednoznačné paměťové výrazy Striktní typová kontrola Pouze MS Windows
GoASM
Volně dostupný, náhrada za NASM Intelský zápis instrukcí Podpora Intel 64 Jednoznačné paměťové výrazy Striktní typová kontrola Pouze MS Windows
Yasm
Volně dostupný, náhrada za NASM Intelský zápis instrukcí i GAS zápis Podpora Intel 64 Jednoznačné paměťové výrazy Striktní typová kontrola Pro MS Windows i Unixy
Asembler při překladu
.ASM ASM .OBJ LIB .LIB
.C
.ASM
CC
ASM
.OBJ
.OBJ LINK .EXE
.LIB
.C
.ASM
CC
ASM
.OBJ
.OBJ
LINK .EXE
.C/inline ASM CC
Zdrojový soubor .ASM I.
Řádkově orientovaný (Někdy i sloupcově orientované)
Návěští Relativní adresy v segmentech
Case-insensitivity Některá návěští sensitivní
Komentáře Do konce řádku pomocí ; (Někdy i blokové komentáře)
Zdrojový soubor .ASM II.
Instrukce Generují kód
Direktivy Řídí překlad Generují proměnné
Makroprocesor Podmíněný překlad Jednoduchá makra - konstanty Složitá makra s parametry
Výrazy Operandy instrukcí i direktiv
Segmenty v asembleru Logické části programu, které patří z různých
modulů dohromady a z nichž každá má nějaké jiné vlastnosti
Příklad:.code
0 MOV AL,CL
2 ADD AL,DL
4
.idata
0 S1 DB "bubak"
5
.udata
0 V1 DD ?
4
.code
4 MOV EAX,[V1]
9
Spojování segmentů
CODE.A
IDATA.A
UDATA.A
Modul A
CODE.B
IDATA.B
UDATA.B
Modul B
CODE.A
IDATA.A
UDATA.A
CODE.B
IDATA.B
UDATA.B
558
216
203
115
472
250
0
558
4096
4312
8192
8395100
4412
LINK
Číselné konstanty
Vždy začínají číslicí 0-9 Znakové konstanty: 'a' Různé číselné soustavy určené příponou
Pokud chybí, použije se default určený direktivou RADIX, jinak 10
Přípony B, O/Q, D, H
Příklady:MOV AL,0C8H
AND EAX,10010010B
CMP AL,FEH
Řetězcové konstanty
Pouze v inicializacích Řetězce znaků uzavřené mezi apostrofy
nebo uvozovky Příklady:DB ’bubak’
DB ”vetsi bubak”
DB ’jeste vetsi’’bubak’
DB ’spatny bubak”
Adresové typy Jednoduché adresové typy
UNKNOWNBYTE, WORD, DWORDPWORD, FWORDQWORD, TBYTESHORT, NEAR, FARPROC, CODEPTR, DATAPTR
Složité adresové typy Struktury a unie Ukazatele
[dist] PTR [addrtype]
Operátory – obecně
Vyskytují se v: Přímé operandy instrukcí
MOV EAX,10+1 Přímé operandy direktiv
IF MOJEKONST EQ 2 Inicializace
V1 DD 20*3 Adresové výrazy
MOV EAX,[pole+EBX+10] Kromě adresových výrazů to jsou konstantní výrazy
MOV EAX,EBX+1
Operátory – aritmetické
Sčítání, odčítání U adresových výrazů mohou + a – určovat adresový mód
+, - (binární, unární) Násobení, dělení
*, /, MOD Priorita
(, ) Příklady:
MOV EAX,10+1
MOV EAX,[EBX+10] – adresový výraz
Operátory – logické
Binární logické operaceAND, OR, XOR
Unární logické operaceNOT
PosunySHL, SHR
Příklady:AND EAX,NOT ((1 SHL 16)-1)
Operátory – relační
EQual ==EQ
Not Equal !=NE
Greater Than >GT
Greater or Equal >=GE
Less Than <LT
Less or Equal <=LE
Příklady:IF MOJEKONST EQ 2
IF MOJEKONST = 2
IF MOJEKONST GE 2
IF MOJEKONST >= 2
Operátory – adresové
Změna segmentu:
Posunutí a segmentSEGOFFSET
Příklady:MOV EAX,[ES:EBX+5]MOV AX,SEG MUJ_LABELMOV EDX,OFFSET MUJ_LABEL
;=LEA EDX,[MUJ_LABEL]
Jiné operátory I. Reference položek struktur a unií
. Maska na bitové pole, položku bitového pole, výčtový
typMASK <jméno>
Nastavení adresového typutyp [PTR] výraztyp LOW výraz, typ HIGH výraz
Příklady:MOV AL,[BYTE EDX]MOV EAX,[(BOD EBX).X1]MOV AX,[BYTE LOW WORD HIGH V4B]
; 3.byte ze 4
Jiné operátory II.
Aktuální pozice v segmentu$
Hodnoty definice proměnných?, DUP
Velikosti a počtyLENGTH, SIZE
Příklady:ARR DW 10 DUP(4 DUP(?),0) ; LENGTH=10
; SIZE=50
Jiné operátory III.
Druh výrazuSYMTYPE
Příklady:IF (SYMTYPE &p1 AND 6) EQ 0 ; [EBX]
0 Ukazatel na kód 4 Obsahuje registr
1 Ukazatel na data 5 Symbol je definován
2 Konstanta
3 Přímý adresový mód 7 Obsahuje externí sym.
Priorita operátorů – Ideal TASM
1. [], (), MASK, OFFSET, SEG, SIZE, LENGTH2. HIGH, LOW (ve výrazu)3. +, - (unární)4. *, /, MOD, SHL, SHR5. +, - (binární)6. EQ, NE, LT, LE, GT, GE7. NOT8. AND9. OR, XOR10. SYMTYPE11. : (změna segmentu)12. . (položka struktury)13. HIGH, LOW (v adrese), PTR, SMALL, LARGE, přetypování
Předdefinované symboly Jejich hodnota nastavena překladačem podle stavu
překladu, stavu prostředí nebo použitých direktiv Stav prostředí
??time, ??date, @FileName, ??filename Stav překladu
??version, @Cpu Podle modelu
@Model, @32Bit@CodeSize, @DataSize, @Interface
Zjednodušené segmentové direktivy@code, @data, @curseg, @stack
Výčtový typ
Deklarace:ENUM jméno [enum_var [,enum_var …]]
var_name [=value] Chování
Lze použít jako typ proměnné Ukládá na nejmenší počet bitů, kam se vejde Vytvořené hodnoty jsou redefinovatelné číselné hodnoty s
globální viditelností
Příklad:ENUM bool FALSE,TRUE
Typ bitového záznamu
Deklarace:RECORD jméno [rec_field [,rec_field
…]]
field_name : width_expr [=value] Chování
Délka typu je součet délek Podpora výčtového typu
Příklad:RECORD dmareq chsel:2,rqbit:1,_res:5
Strukturované typy Deklarace:
STRUC <jméno><položky struktury>
ENDS [<jméno>]UNION <jméno>
<položky unie>ENDS [<jméno>]
Rozdíly od některých VPJ Explicitní zarovnání (ALIGN n) Typová informace u ukazatelů Možnost anonymního vnořování Jména položek struktury viditelná pouze "uvnitř" struktury
Strukturované typy – příklad
Příklad:STRUC S1
a DB ?ALIGN 4
b DD 5ENDS S1
mov eax,[(S1 ebx).b]; mov eax,[ebx+4]
Direktivy
Jazykové konstrukce, které typicky neslouží k emisi kódu nebo dat, ale řídí překlad
Repertoár a syntaxe direktiv představuje největší rozdíl mezi jednotlivými překladači
V TASMu je zápis direktiv velmi podobný zápisu instrukcí
Direktivy – základní Mód překladu
IDEALMASM
Volba cílového procesoruP8086, P186P286, P286P, P286NP386, P386P, P386NP486, P586, P686P8087, P287, P387, P487
Konec zdrojového kóduEND <startovní_adresa>
Nastavení číselného základuRADIX <n> ; 2, 8, 10, 16
Deklarační direktivy Tyto direktivy slouží k emisi kódu/dat[<jméno>] DB <výraz> ; byte[<jméno>] DW <výraz> ; word (2 byty)[<jméno>] DD <výraz> ; dword (4 byty)[<jméno>] DF <výraz> ; fword (6 bytů)[<jméno>] DP <výraz> ; pword (6 bytů)[<jméno>] DQ <výraz> ; qword (8 bytů)[<jméno>] DT <výraz> ; tbyte (10 bytů) Příklady:i DD ?pole DB 128 DUP(?)cstr DB 'bubak',0int_pole DD 10 DUP (5)
Deklarační direktivy - pokročilé
Příklad 1:mov eax,COSIDB 0EAh ; far jump 16:32 immDD OFFSET far_labelDW far_selector
Příklad 2:mov al,VALDB 0D4h ; D4,0A=AAMDB 7
Deklarační direktivy – jiné
Proměnné jiných typů Struktury, výčtové typy Inicializace
Příklady:st1 S1 ?
st2 S1 <'a',10>
st3 S1 <b=10,a='a'>
Direktivy – zarovnání
Zarovnání výstupu v logickém segmentuALIGN <n> ; 2, 4, 8, …ORG <n>
Příklady:ORG 100h; začátek .COM
V8 DB ?ALIGN 4
V32 DD ?
Direktivy – výstup
Výstup v době překladuDISPLAY "<text>"
%OUT <text> Příklady:
DISPLAY "tady je to rozbitý"
Direktivy mezimodulové komunikace I.
Zveřejnění symbolu pro jiné modulyPUBLIC [<jazyk>]<symbol>
Vložení symbolu z jiného moduluEXTRN
[<jazyk>]<symbol>:<typ> Zveřejnění nebo vložení symbolu
GLOBAL [<jazyk>]<symbol>:<typ> Rozdíly od VPJ (zvláště C):
Symboly jsou implicitně lokální v modulu Modul nesmí obsahovat EXTRN a definici symbolu Dovážený symbol může mít neznámý typ
Direktivy mezimodulové komunikace II.
Příklady:PUBLIC nejaky_symbolPUBLIC PASCAL symbol_mlaskalu
EXTRN nevim_co_to_je:UNKNOWNEXTRN C a_tohle_znam:WORDEXTRN C funkce:PROC
GLOBAL C nekde_definovano:PROCGLOBAL PROLOG libove_jmeno:PTR
QWORD
Segmentové direktivy I. Definice obecného logického segmentu
SEGMENT <jméno> [<atributy>]
ENDS [<jméno>] Vícenásobné použití logického segmentu v jednom
modulu: Při překladu se spojí do jednoho logického segmentu Pořadí spojování odpovídá pořadí ve zdrojovém textu Při spojování v rámci jednoho modulu se neuplatní
zarovnání logického segmentu Při vícenásobném použití logického segmentu se už
nemusí specifikovat jiné atributy pouze jméno; pokud jsou uvedeny atributy, tak se musí shodovat s první definicí
Segmentové direktivy II. Logické segmenty lze vnořovat Atributy segmentu:
Kombinování Jak linker spojí segmenty z různých modulů se stejnými jmény
Třída Řetězec pro pojmenování skupiny segmentů, linker je pak dá
dohromady Zarovnání
Zarovnání začátku segmentu Velikost
Defaultní velikost operandů/adresace Přístup
Nastavení přístupových práv pro segment
Segmentové direktivy III. Kombinační atribut
PRIVATE, PUBLICCOMMON, VIRTUALAT adresa
Atribut zarovnáníBYTE, WORD, DWORDPARA, PAGE, MEMPAGE
Atribut velikostiUSE16, USE32
Příklady:SEGMENT _TEXT PUBLIC DWORD USE32 'CODE'SEGMENT _DATA PUBLIC DWORD USE32 'DATA'SEGMENT vmem AT 0A000h
Segmentové direktivy IV.
Skupiny Spojují několik logických segmentů do jednoho segmentu
GROUP <jméno> <jméno_ls> {,<jméno_ls>}
Deklarace obsahu segmentových registrů Direktiva ASSUME nic nemění, pouze deklaruje
ASSUME <segreg>:<výraz>
ASSUME NOTHING
Segmentové direktivy V. Příklady:
GROUP DGROUP _DATA,_BSS
MOV AX,DGROUPMOV DS,AXASSUME DS:DGROUP
MOV AX,_BSSMOV DS,AX
MOV EAX,[prom]
Modely I.
Direktiva modelu Určuje implicitní jazyk
Volací konvence Generovaný prolog a epilog procedur Mandlování jmen na rozhraní modulu
Definuje chování, jména a atributy logických segmentů definovaných zjednodušenými segmentovými direktivami
MODEL [<mod_mod>] <mem_mod> [<jméno_cs>] [,[<mod_jaz>] <jazyk>] [,<mod_mod>]
Modely II. Paměťové modely
TINYSMALL, MEDIUM, COMPACT, LARGE, HUGEFLAT
Modifikátory modeluUSE16, USE32NT, OS_NT
JazykyPASCAL, C, CPP, BASIC, FORTRAN, PROLOGSYSCALL, STDCALLNOLANGUAGE
Modely III.
Modifikátory jazykaNORMAL, WINDOWS
Model FLAT Všechny vzdálenosti blízké (near) CS=_text, DS=SS=flat
Příklady:P386MODEL FLAT PROLOG, NTP386
Zjednodušené segmentové direktivy
Použivají předdefinované atributy podle paměťového modelu
CODESEG
DATASEG, UDATASEG
CONST, STACK
FARDATA, UFARDATA Nemají „ukončovací“ závorku, platnost končí při
Použití jiné segmentové direktivy (i nejednoduché) Konci zdrojového textu
Nelze je vnořovat
Procedury I. Deklarace:PROC <jméno> [[<mod_jaz>] <jazyk>]
[<dist>][ARG <arg> {,<arg>} [=argsize]][LOCAL <arg> {,<arg>} [=locsize]][USES <item> {,<item>}]
…RETENDP [<jméno>]
Argument:<jméno> [[počet1]] [:<typ> [:<počet2>]]
Procedury II.
Pomocné direktivy uvnitř procedur:LOCALS [<prefix>]
NOLOCALS Poznámky
Položky v USES jsou buď registry nebo paměť <argsize> a <locsize> jsou součty velikostí <počet2> v argumentu udává násobnost <počet1> v argumentu udává násobnost všeho Viditelnost lokálních jmen lze omezit použitím prefixu z
direktivy LOCALS, na počátku @@
Procedury III.
Příklad 1:PROC soucet
ARG @@a:DWORD,@@b:DWORD=@@rsize
mov eax,[@@a]
add eax,[@@b]
ret @@rsize
ENDP
Procedury IV. Příklad 2:PROC p1ARG @@a:DWORD,@@b:DWORDLOCAL @@p:DWORDUSES esi,edi
mov eax,[@@a]mov [@@p],0…retENDP p1
Procedury V.
Situace na zásobníku pro příklad 2:
Po volánípřed prologem
@@b
@@a
RA0
+4
+8
←ESP
ESPoffs.
EBPoffs.
Po volánípo prologu
@@b
@@a
RA
0
+4
+8
←ESP
ESPoffs.
EBPoffs.
Staré EBP
@@p
+12
+16
0
+4
+8
+12
-4
←EBP
Rozhraní VPJ – ASM
Paměťový model Rozložení paměti Pojmenování a atributy segmentů
Volací konvence Mandlování veřejných jmen Mechanismus volání funkcí a procedur Způsob předávání parametrů Způsob předávání návratové hodnoty funkcí Požadavky na uchování stavu registrů
Mandlování veřejných jmen Původně „names mangling/decorating“
mangle mandlovat rozsekat, roztrhat, rozbít, rozdrtit, těžce poškodit, potlouci, pohmožditi přen. pokazit, znetvořit, k nepoznání změnit, překroutit, zkomolit
Příklady:long f1(int i, const char *m, struct s *p)
_f1 MSVC IA-32 C __cdecl@f1@12 MSVC IA-32 C __fastcall_f1@12 MSVC IA-32 C __stdcall?f1@@YAJHPBDPAUs@@@Z MSVC IA-32 C++_f1 GCC IA-32 C__Z2f1iPKcP1s GCC IA-32 C++f1 MSVC IA-64 C?f1@@YAJHPEBDPEAUs@@@Z MSVC IA-64 C++
Volací konvence MSVC IA-32 I. Obecné pravdy:
Jména jsou case-sensitivní Parametry na zásobníku jsou zarovnány na 32-bitů Je třeba uchovat ESP, EBP, EBX, ESI, EDI, DF,
segmentové registry Návratová hodnota (pokud je) je v AL, AX, EAX, EDX:EAX
nebo na ST(0) koprocesoru Velké návratové hodnoty se „vrací“ předáním „tajného“ 0.
parametru volané funkci odkazujícího na vytvořené místo na zásobníku volající funkce
Po ukončení funkce musí být vyčištěn zásobník koprocesoru kromě případu vracení numerické hodnoty, kdy zůstane jen ST(0)
Volací konvence MSVC IA-32 II. „Standardní zásobníková“ volací konvence (__cdecl):
Parametry ukládány na zásobník zprava doleva Parametry odstraňuje volající funkce (lze ...) Jméno je tvořeno _jméno
Konvence volání WinAPI (__stdcall): Parametry ukládány na zásobník zprava doleva Parametry odstraňuje funkce volaná (nelze ...) Jméno je tvořeno _jméno@n (n=počet bytů parametrů)
Rychlé volání (__fastcall): Parametry ukládány na zásobník zprava doleva, první dva 32-
bitové nebo menší v ECX, EDX Parametry odstraňuje funkce volaná (nelze ...) Jméno je tvořeno @jméno@n (n=počet bytů parametrů)
Volací konvence MSVC Intel 64 První 4 parametry předávány registry, zbytek na zásobníku
Pouze pokud je velikost 1, 2, 4, 8, jinak předání referencí RCX, RDX, R8, R9 nebo XMM0L-XMM3L, pokud je parametr
typu float/double x87 se nepoužívá
Může být použit, ale může být během volání jiné funkce zničen Ke zničení jsou registry RAX, R10, R11, XMM4, XMM, ostatní
musí být zachovány Na zásobníku vždy vyhrazeno místo pro 4 parametry, i když je
funkce volaná nemá Návratová hodnota v RAX nebo XMM0 podle typu
Inline asembler – MSVC I.
Zápis: Norma ISO/IEC 9899:1999 má klíčové slovo asm,
MSVC.NET 2003 má zatím jen __asm __asm <instrukce> [;] __asm { {<instrukce>} } [;] Podle normy asm { <řetězec> } ;
Inline asembler – MSVC II.
Použití: Používá MASM zápis výrazů Nelze použít deklarační direktivy Dx ani struktury Místo DB lze použít pseudoinstrukci _emit Lze používat viditelná jména a návěští, konstanty včetně
enumů, jména typů včetně definovaných pomocí typedef Není třeba uchovávat obsah registrů EAX, EBX, ECX, EDX,
ESI, EDI, ale překladač je sám uloží v případě potřeby Lze skákat z inline bloku do C/C++ i obráceně, pozor na
použití jmen knihovních funkcí jako návěští Překladač neoptimalizuje přes inline bloky
Inline asembler – MSVC III.
Vlastní volací konvence: Lze donutit překladač, aby negeneroval prolog a epilog
funkce Deklarace funkce:
__declspec(naked) <deklarátor_funkce> Nelze použít return, alloca a setjmp Nelze inicializovat lokální proměnné před prologem Překladač definuje symbol __LOCAL_SIZE, který udává
velikost lokálních proměnných; lze ho použít pouze jako přímý operand
Inline asembler – MSVC IV. Příklad:__declspec(naked) int f(long p){ int i;
__asm { /* prolog */push ebpmov ebp,espsub esp,__LOCAL_SIZE
}/* Kód funkce */
__asm { /* epilog */mov esp, ebppop ebpret
}}
Inline asembler – GCC I.
Zápis: asm [volatile] ( <řetězec>
: <výstup> {,<výstup>} : <vstup> {,<vstup>} [ :<změna> {,<změna>} ] ) ;
Vstupní omezení: [<vnitřní_jméno>] "x" (<vnější_jméno>)
Výstupní omezení: [<vnitřní_jméno>] "=[&]x" (<vnější_jméno>)
Inline asembler – GCC II. Omezení:
m paměť r obecný registr i přímá hodnota (konstanta) g cokoliv z předchozího q a,b,c,d (u 8-bitů nižší části) Q a,b,c,d vyšší části u 8-bitů A EDX:EAX t ST(0) a,b,c,d a,b,c,d S,D si,di x xmm SSE registr y MMX registr
Inline asembler – GCC III.
Vlastnosti: GCC optimalizuje i přes asm bloky, volatile říká, že kód
má vedlejší efekty a překladač to nebude optimalizovat GCC předpokládá, že jako výstup může použít i vstupy.
Pokud tomu tak není, je třeba použít &. V řetězci se používá %<vnitřní_jméno>. Pokud není
definováno <vnitřní_jméno>, čísluje se od 0, tj. %n.
Inline asembler – GCC IV. Příklad:static __inline__
uSINT32 MTSyncIlck32_inc(volatile uSINT32 *var){uSINT32 prev;
asm volatile("\t""movl $1,%%eax\n\t""lock xadd %%eax,(%1)\n":"=&a"(prev):"r"(var):"memory"
);
return(prev);}
Makroprocesor
Každý asembler obsahuje makroprocesor: Podmíněný překlad Vkládání souborů Definice symbolických konstant Cykly, opakování Řetězcové manipulace Víceřádková parametrizovaná makra
Direktivy podmíněného překladu – I.
Obecný tvar podmínky:IFxxx
<blok>
{ ELSEIFxxx
<blok> }
[ ELSE
<blok> ]
ENDIF
Direktivy podmíněného překladu – II. Varianty:
Vyhodnocení číselného výrazu:IF <výraz>IFE <výraz>
Porovnání řetězců:IFIDN <s1>,<s2>IFIDNI <s1>,<s2>IFDIF <s1>,<s2>IFDIFI <s1>,<s2>IFB <s>IFNB <s>
Definovanost symbolu:IFDEF <symbol>IFNDEF <symbol>
Direktivy podmíněného překladu – III. Příklad 1:
IFNB regnamemov regname,1000
ELSEmov eax,1000
ENDIF Příklad 2:
IFDIFI <regname>,<eax>push eaxmov eax,regname
ENDIF
Jiné direktivy makroprocesoru
Hlášení chyb:ERR <text>
ERRIFxxx [<parametry>,]<text> Vložení souboru:
INCLUDE <text> Příklady:
ERR tak tudy ne
ERRIFB <regname>, prázdný registr
Symbolické konstanty a řetězcové operace – I.
Definice „textového“ symbolu:<jméno> EQU <text>
Definice „proměnné“:<jméno> = <výraz>
Řetězcové operace:<tsymbol> CATSTR <s>{,<sx>}
<tsymbol> SUBSTR <s>,<pos>[,<sz>]
<nsymbol> INSTR [<pos>,]<s1>,<s2>
<nsymbol> SIZESTR <s>
Symbolické konstanty a řetězcové operace – II. Příklady:ABC EQU <abc> ;ABC=“abc”ABC2 EQU ABC ;ABC2=“abc”ABC EQU <def> ;ABC=“def” (redef)ABC3 CATSTR
ABC2,<,>,ABC,<,>,ABC2 ;ABC3=“abc,def,abc”ABCLEN SIZESTR ABC ;ABCLEN=3ABC3LEN SIZESTR ABC3 ;ABC3LEN=11COMMA1 INSTR ABC3,<,> ;COMMA1=4COMMA2 INSTR COMMA1+1,ABC3,<,> ;COMMA2=8ABC4 SUBSTR ABC3,5 ;ABC4=“def,abc”ABC5 SUBSTR ABC3,5,3 ;ABC5=“def”ABC6 EQU 3+2+1 ;ABC6=6 (num)ABC7 EQU %3+2+1 ;ABC7=“6” (text)ABC8 EQU %COMMA1 ;ABC8=“4”ABCLEN = ABCLEN+1 ;ABCLEN=4
Víceřádková makra – I. Deklarace:
MACRO <jméno> <formální_parametry> <tělo makra>
ENDM Zrušení:
PURGE <jméno> {,<jméno>} Parametry:
Seznam formálních parametrů oddělených čárkami Při použití v těle makra je třeba použít aspoň jeden
oddělovač formálního parametru & Použití:<jméno_makra> <param> {,<param>}
Víceřádková makra – II.
Předávání parametrů: Souvislá skupina znaků, která neobsahuje
mezery, čárky nebo středníky Skupina znaků uzavřená mezi < a >, která může
obsahovat mezery, čárky a středníky Jeden libovolný znak s předchozím ! Vypočtený výraz jako text podle defaultního
základu pomocí operátoru %
Víceřádková makra – III.
Komentáře v makrech:;; komentář v těle makra
Lokální symboly:LOCAL <symbol> {,<symbol>}
Skoky v makrech:EXITM
GOTO <tag_symbol>
:<tag_symbol> ;; cíl skoku
Víceřádková makra – IV. Příklady:
MACRO Testik prmLOCAL @@ctgIFB <&prm&>
EXITMENDIFIFIDNI <&prm&>,<ecx>
GOTO do_cycleENDIFmov ecx,&prm&
:do_cycle@@ctg:
...dec ecxjnz @@ctg
ENDM
Cykly a opakování – I.
Cykly:WHILE <výraz>
Opakování:REPT <výraz>IRP <fparm>,<arg1>{,<argx>}IRPC <fparm>,<text>
Příklady:REPT 4
shl eax,1ENDM