Macrocomenzi în asamblare

Macrocomenzi în asamblare

Când programați o problemă destul de gravă, există secțiuni repetitive de cod. Ele pot fi mici, și pot împrumuta și o mulțime de spațiu. În acest din urmă caz, aceste fragmente vor împiedica în mod semnificativ programul de citire text, pentru a reduce vizibilitatea complică de depanare și de a servi ca o sursă inepuizabilă de eroare. În limbaj de asamblare există mai multe instrumente care rezolva problema duplicarea secțiunilor de cod. Printre acestea se numără:







  • asamblor macro;
  • Proceduri mecanismului;
  • mecanism de întrerupere.

Un macro este un șir care conține un nume simbolic - numele macro. destinate a fi substituit cu unul sau mai multe alte rânduri. Numele macro poate fi însoțit cu opțiuni. Pentru a scrie macro-uri trebuie să specificați primul șablon descriere, numite macro-uri.

Sintaxa macro este următoarea:

SpisokFormalnyhArgumentov macro ImyaMakrokomandy
TeloMakroopredeleniya
endm

Macro este procesată de către traducător urmează. Pentru a utiliza macrocomanda descris în locul potrivit în program, acesta trebuie să fie activat cu ajutorul unui macro care indică următoarea sintaxă:

Rezultatul aplicării construcției sintactic în programul sursă este șirurile sale de înlocuire a structurii TeloMakroopredeleniya. Dar aceasta nu este o simplă înlocuire. De obicei, macro conține o listă de argumente - SpisokFakticheskihArgumentov. care este macro-uri ajustate. Se pune în corpul macro, care va fi înlocuit cu argumentul real al macro desemnat de către așa-numitele argumente formale. Astfel, ca urmare a programului de macro argumente formale macro-urile sunt înlocuite cu argumente reale corespunzătoare; acest lucru este contextul contabil. Acest proces se numește macrogenerations substituție. iar rezultatul acestui proces este extinderea macro.

Macrocomenzi în asamblare similară cu #define directivă în limbajul C.

Există trei destinații de plasare macro:

  • la începutul codului sursă al programului, până la de cod și de date pentru a nu afecta lizibilitatea programului. Această opțiune ar trebui să fie utilizată în cazurile în care macro-uri definite sunt relevante doar într-unul din program;
  • într-un fișier separat. Această opțiune este adecvată atunci când se lucrează pe mai multe programe, un domeniu de interes. Pentru a face aceste macro-uri disponibile într-un anumit program, este necesar ca la începutul codului sursă al programului pentru a înregistra o directivă includ nume de fișier. de exemplu:

586
. model de plat, stdcall
includ show.inc; aici este introdus în show.inc fișier text

  • în bibliotecile macro. macro-uri universale, care sunt utilizate în aproape toate aplicațiile este recomandabil să se scrie așa-numitele biblioteci macro. Asigurați macro-uri relevante din această bibliotecă, puteți utiliza, de asemenea, includ directiva. Dezavantajul acestei și metodele anterioare în care codul sursă include totul macro-uri. Pentru a remedia această situație, puteți utiliza o directivă de purjare. ca un separate prin virgulă operanzi enumerate macro nume, care nu ar trebui să fie incluse în textul programului. De exemplu:

    includ iomac.inc
    purge outstr, exitV acest caz, textul sursă al programului înainte de difuzare MASM includ în loc șir iomac.inc introduce un șir de fișier iomac.inc. Dar textul introdus va fi diferit de original, astfel încât acesta va fi nici outstr macro și de ieșire.

  • Fiecare argument real este un șir de caractere, pentru a forma care se aplică următoarele reguli:







    • Șirul poate consta din:
      - a secvenței simbol, fără spații, puncte, virgule, punct și virgulă;
      - din orice secvență de caractere închise în paranteze unghiulare: <.>. Această secvență poate fi indicată ca golurile sau perioadele, virgule, semicoloane.
    • Pentru a indica faptul că unele caractere într-un șir de caractere care reprezintă parametrul real este de fapt un simbol, și nu altceva, de exemplu, unele dintre separatorului sau consola de limitare, utilizat operatorul de construcții. Acest operator este plasat direct în fața caracterului descris mai sus, iar efectul său este echivalentă cu încheierea unui caracter în paranteze.
    • Dacă doriți calcule la o expresie constantă șir, la începutul expresiei care aveți nevoie pentru a pune semnul%.

    Valoarea ConstExpression este calculată și substituit într-un format tabelar, în conformitate cu radix curent.

    În timpul generării de asamblare macro translatorul de expansiune caută macro secvențelor de caractere de text corp potrivite secvențe de caractere cu cele ale căror parametrii formali. La detectarea unei astfel de coincidență parametru formal al unui organism macro este înlocuit cu parametrul real corespunzător al macro. Acest proces se numește argumentele de substituție. În general, lista de argumente formale conțin nu numai transferul de elemente formale, separate prin virgulă, dar, de asemenea, unele informații suplimentare. Argumentul oficial Sintaxa completă este următoarea:

    în cazul în care poate fi de tip:

    • REQ - necesită sarcină explicită obligatorie a argumentului real la apelarea macro;
    • =<ЛюбаяСтрока> - în cazul în care argumentul atunci când apelarea macro nu este specificat, în locurile corespunzătoare în expansiune macro va insera valoarea implicită corespunzătoare valorii LyubayaStroka. Simbolurile care apar în LyubayaStroka. Trebuie să fie închise în paranteze unghiulare.

    Dar nu întotdeauna, de asamblare poate recunoaște în corpul unui argument macro formală. Acesta poate fi, de exemplu, apar atunci când face parte dintr-un identificator. În acest caz, secvența de caractere argument formal este separat de restul contextului printr-un simbol special . Aceasta tehnica este adesea folosit pentru a defini identificatori modificabili și codurile de operare. De exemplu,

    686p
    . model de plat, stdcall
    t macro def_table: REQ. len: =<1>
    tabl_t dt len ​​DUP (5)
    endm
    .date
    def_table d, 10
    def_table b
    .cod
    proc principal
    mov al. [Tabl_b]
    mov ah. [Tabl_b + 1]
    mov EBX. [Tabl_d]
    putrezi
    endp principal
    scop principal

    După difuzarea liniilor segmentul de date de text program care conține, va

    def_table d, 10; tabl_d dd 10 DUP (5)
    b def_table; tabl_b db 1 DUP (5)

    Rețineți că linia de program

    pus în număr de ah diferit de 5 deoarece memoria este alocat numai pentru tabl_b sub 1 element de matrice 1 octet cu o valoare de 5.

    simbol Acesta poate fi, de asemenea, utilizat pentru recunoașterea formală un argument într-un șir de caractere în ghilimele „“.

    În cazul în care organismul macro conține o etichetă sau un nume în directiva rezervă și datele de inițializare, iar programul macrocomanda este numit de mai multe ori, procesul de macrogenerations o situație în care identitatea programului se va fi determinat în mai multe rânduri că, desigur, vor fi recunoscute de compilator ca o eroare. Pentru a ieși din această situație, utilizați directiva locală. care are următoarea sintaxă:

    Această directivă trebuie să fie stabilită imediat după macro antet. Rezultatul acestei directive vor fi generate în fiecare caz macroexpansion nume unice pentru toate datele de identificare enumerate în CpisokIdentifikatorov. Aceste nume unice sunt de forma. xxxx, unde xxxx - numărul hexazecimal. Pentru primul identificator în prima instanță macroexpansion xxxx = 0000 la al doilea - .. Xxxx = 0001, etc. Controlul plasarea și utilizarea corespunzătoare a acestor nume unice presupune traducător.

    De exemplu, ia în considerare utilizarea unui program de afișare nume macro în caseta de dialog.

    686P
    .MODEL PLAT, stdcall
    PrintName Nume macro
    Str1 locale, str2, METKA
    JMP METKA
    Str1 DB "Programul", 0
    Str2 DB „Numele meu este: Nume“, 0
    METKA:
    PUSH 0
    PUSH str1 OFFSET
    PUSH str2 OFFSET
    PUSH 0
    APEL MessageBoxA @ 16
    endm
    init macro
    MessageBoxA @ 16: EXTERN NEAR
    endm
    init
    .COD
    START:
    PrintName <Лена>
    PrintName <Таня>
    RET
    END START

    Macrocomenzi în asamblare

    Când utilizați un cod de program macro devine mai ușor de citit.

    Functional similar cu procedura macro. asemănării lor este că ei amândoi odată ce este suficient pentru a descrie, și apoi le numim în mod repetat, într-un mod special. Diferențele macro-uri și proceduri, în funcție de instalarea țintă poate fi considerată ca fiind avantaje și dezavantaje atât:

    • spre deosebire de procedura, textul care este neschimbat, în macrogenerations macro poate varia în conformitate cu setul de parametri real. În acest caz, corecția poate fi supus atât operanzi de comenzi și comenzile ei înșiși. Procedurile în acest sens sunt mai puțin flexibile;
    • de fiecare dată când apelați macro ca textul introdus în programul de expansiune macro. Când se apelează procedura de microprocesor efectuează controlul transmisiei de la începutul procedurii situat într-o zonă de memorie într-un singur exemplar. Codul în acest caz, o mai compact, cu toate că viteza este oarecum redusă datorită necesității tranzițiilor.