Curs de instruire

O caracteristică distinctivă a FASM este suportul foarte flexibil și puternic pentru macrocomenzi. În acest articol vom lua în considerare doar elementele de bază ale creării de macrocomenzi, deoarece acest subiect este destul de extins și nu va fi posibil să spuneți totul într-un singur articol.







Ce sunt macrocomenzile? Macroanele sunt șabloane pentru generarea de coduri. Odată ce creăm o macrocomandă, o putem folosi în multe locuri în codul programului. Macroanele fac procesul de programare în asamblare mai plăcut și simplu, iar codul programului este mai clar. Macroanele vă permit să extindeți sintaxa de asamblare și chiar să adăugați propriile "comenzi" care nu se află în procesor.

Procesarea macroprelucrării este efectuată de către preprocesorul FASM. Conversia codului sursă în cod executabil FASM funcționează în două etape. Prima etapă este preprocesarea. iar al doilea este de fapt asamblare sau compilare. În prima etapă, toate expresiile numerice sunt evaluate, în loc de constante și nume de etichete, valorile lor reale sunt înlocuite, în loc de macrocomenzi, codul generat este înlocuit. În a doua etapă, toate datele și instrucțiunile de mașină sunt convertite în octeții corespunzători, iar rezultatul este un fișier executabil cu formatul necesar.

Sintaxă pentru crearea unei macrocomenzi

Pentru a crea o macrocomandă, utilizați directiva macro. Această directivă are următoarea sintaxă:

După directivă, este scris numele unei macrocomenzi și poate fi specificată o listă de parametri (operanzi). Parametrii din listă sunt separați prin virgule. În interiorul coastelor curbate, corpul macro este înregistrat. Apropo, pentru macro-uri scurte puteți scrie toate acestea într-o singură linie:

De exemplu, luați în considerare o macrocomandă simplă fără parametri, care este destinat să finalizeze programul:

După ce macro-ul este declarat, este suficient să scrieți exit_app la locul potrivit din program. Acolo, preprocesorul FASM va înlocui automat două comenzi scrise în corpul macrocomenzii. Să creăm o altă macrocomandă utilă, destinată unei astfel de operații frecvent utilizate, ca ieșire a liniei:

Acum adăugăm aceste macrocomenzi la programul "Salut, lumea!" Din partea 6 a cursului de formare:

Ca rezultat, programul principal constă doar din două linii, iar acesta nu mai este ca un asamblator, este un asamblator macro FASM

Extensia sistemului de comandă

Macroanele pot fi utilizate pentru extinderea sistemului de comandă. De exemplu, de multe ori în program trebuie să ștergeți registrele. Să creați o macrocomandă specială în acest scop:

Macros cu număr variabil de parametri

Este, de asemenea, posibil să creați macrocomenzi cu un număr variabil de parametri. În acest caz, numele parametrului este scris în paranteze pătrate. Pentru a genera codul, macro-ul este numit de câte ori este dat parametrii. De exemplu, puteți scrie macro-uri speciale pentru a îmbunătăți comenzile PUSH și POP:

În ciuda faptului că numele macrocomenzii coincide cu numele comenzii, în corpul macrocomenzii acest nume este considerat numele comenzii (în caz contrar ar rezulta o recursiune infinită). Aceste macrocomenzi vă permit să puneți în stivă și să extrageți mai mulți operanzi din stivă, ceea ce simplifică codul programului. Exemplu de utilizare:

Ca rezultat, următorul cod va fi generat de către preprocesor:

S-ar putea să doriți să scrieți propriul set de macrocomenzi și să le utilizați în programele dvs. În acest caz, este convenabil să plasați macrocomenzile într-un fișier separat și să utilizați directiva includeți. Sintaxa directivei include este foarte simplă:







Calea fișierului este specificat în ghilimele simple și poate fi relativă (în legătură cu fișierele de compilare) sau completă (de la o literă de unitate sau directorul rădăcină al sistemului). Dacă fișierul inclus este în același director, atunci specificați numele fișierului. Extensia fișierului poate fi oricare, dar de obicei utilizează "inc" sau "asm".

Dacă scrieți macrocomenzi într-un fișier separat "mymacro.inc", atunci programul "salut, lume!" Va fi și mai scurt:

Ei bine, adaugă,)
reg = arg2 + reg3

reg poate fi ax, bx, dx, cx. Am vrut să dau un exemplu cu condițiile.
Și acest exercițiu poate fi rezolvat,)
utilizare16
org 100h
macro x reg, arg2, arg3
dacă arg2-arg3; Dacă arg2 este mai mică decât arg3
mov reg, arg2;
altfel dacă arg2 - arg3; Dacă arg2 este mai mare decât arg3
mov reg, arg3;
altceva; Dacă nu mai mult și nu mai puțin decât egal
mov reg, arg3;
sfârșit dacă;
>
x cx, 2,5
mov ax, 4C00h
int 21h
Rezultatul mov 5
Adevărat. deci este imposibil, valorile trebuie fixate.
Și aceste modele sunt folosite pentru. creați cod în funcție de condiție.
Compilatorul verifică condițiile și creează codul final de asamblare.

Condițiile sunt verificate o dată în timpul compilării. )

Dacă valorile fixe nu sunt interesante, 2 și 5 pot fi comparate fără o macrocomandă.
Încercați să determinați registrul parametrilor sau variabilele din memorie și să generați codul corect.
De exemplu, dacă operanzii 2 și 3 sunt în memorie, atunci acestea nu pot fi comparate cu comanda CMP, cel puțin una trebuie să fie plasată în registru.

N-am găsit-o. este un argument. o valoare simplă sau o schimbare.
2.3 Argumentele rolului nu se redau. și poate fi un registru. o schimbare în memorie sau o valoare mediocră.
utilizare16
org 100h
macro x arg1, arg2, arg3
dacă arg1 este; dacă 1 parametru este un registru de 16 biți
arg arg1, arg2; în loc de arg1, numele registrului este înlocuit
cmp arg1, arg3
jc @f
împinge arg1
@@:
jnc @f;
împinge arg3
@@:
pop arg1
; altfel dacă; Trebuie să existe un cec. o variabilă sau o valoare directă.
altceva; pe plan este efectuat atunci când cele două condiții prealabile ale cutiilor
împingeți dx
mov dx, arg2
cmp dx, arg3
jc @f
mov [arg1], arg2
@@:
jnc @f;
mov [arg1], arg3
@@:
pop dx
sfârșit dacă
>
x cx, 2,5
x x1.2.5
mov ax, 4C00h
int 21h
x1 dw 1

dacă arg1 în-ax, bx, dx, cx, si, di - dacă 1 parametru este un registru de 16 biți

Deși memoria nu este disponibilă cu valorile memoriei (
Dar cum să verificați. variază acest lucru sau. nu valoare mediocră?

Cel mai probabil, în orice fel.
În cazul unei erori, codul nu este compilat.
Apropo, există registre pe 8 biți

Există o mare diferență între macro și proceduri. Și ele sunt folosite în scopuri diferite.

Codul procedurii este conținut în program într-o singură instanță.
Și macro generează cod la locul fiecărui apel.
De aceea, de exemplu, o bucată lungă de cod repetitiv este mai bine făcută printr-o procedură decât printr-o macrocomandă.
Macrorele oferă o mulțime de flexibilitate, deoarece obțin parametri în etapa de compilare a programului. Procedurile funcționează și obțin parametrii numai în timpul rulării.

Deci este bine să știți ambele lucruri

Atunci de ce nu folosiți procedurile?
mai exact nu așa
Probabil este mai bine să întrebiți, decât obținerea parametrilor la etapa de compilare este mai avantajoasă decât obținerea parametrilor atunci când se execută. Cred că aruncăm încărcătura de jos.
Deci? =)
Deși cred că petrecut aici sau perativka pe un program pe termen lung, cu macro-uri sau mai mare procesor se ocupă tranzițiile în cadrul procedurii, și trebuie să aleagă între consumul de resurse RAM și CPU.
Corect, dacă mă înșel.

Este avantajos faptul că prin obținerea parametrilor la etapa de compilare puteți genera cel mai bun cod, modificați comenzile. Prin proceduri care nu se fac.

De exemplu, macrocomenzile pentru generarea rutinilor proc și endp generează comenzi diferite în funcție de parametri.

>> De exemplu, macro-urile pentru crearea procedurilor proc și endp generează diferite
>> comenzi în funcție de parametri.

cerere mare pentru a face un articol suplimentare despre macro-uri (extensie), astfel încât să vorbească deja familiarizați cu cunoștințele de bază macro-programare ... deoarece macro-uri este principalul instrument al FASMO ... și apoi articolul dumneavoastră va câștiga mai multă atenție și rospostraneniya)))
poate bate chiar și o carte pe care o scrie pe fascia și pe ea burghezul va învăța de pe deal ...

Nu știu despre burghezie, ei vor trebui să traducă pentru ei







Articole similare

Trimiteți-le prietenilor: