.pl 72 .pn 3 .fo # .he MACRO-18 C U P R I N S 1. Formatul comenzilor MACRO-18 . . . . . . . . . . . 5 1.1 Sirul de comenzi MACRO-18 . . . . . . . . . . . . . 5 1.2 Controale MACRO-18 . . . . . . . . . . . . . . . . 7 2. Formatul fisierelor sursa . . . . . . . . . . . . . 8 2.1 Instructiuni . . . . . . . . . . . . . . . . . . . 8 2.2 Etichete . . . . . . . . . . . . . . . . . . . . . 8 2.3 Simboli . . . . . . . . . . . . . . . . . . . . . . 9 2.4 Constante numerice . . . . . . . . . . . . . . . . 9 2.5 Siruri . . . . . . . . . . . . . . . . . . . . . . 9 2.6 Evaluarea expresiilor . . . . . . . . . . . . . . . 10 2.6.1 Operatori aritmetici si logici . . . . . . . . . . 10 2.6.2 Moduri . . . . . . . . . . . . . . . . . . . . . . 10 2.6.3 Referinte externe . . . . . . . . . . . . . . . . . 11 2.7 Coduri de operatie ca operanzi . . . . . . . . . . 11 3. Pseudoinstructiuni . . . . . . . . . . . . . . . . 12 3.1 ASEG . . . . . . . . . . . . . . . . . . . . . . . 12 3.2 COMMON . . . . . . . . . . . . . . . . . . . . . . 12 3.3 CSEG . . . . . . . . . . . . . . . . . . . . . . . 12 3.4 DSEG . . . . . . . . . . . . . . . . . . . . . . . 12 3.5 Define Byte . . . . . . . . . . . . . . . . . . . . 12 3.6 Define Storage . . . . . . . . . . . . . . . . . . 13 3.7 Define Character . . . . . . . . . . . . . . . . . 13 3.8 Define Word . . . . . . . . . . . . . . . . . . . . 13 3.9 END . . . . . . . . . . . . . . . . . . . . . . . . 13 3.10 EQU . . . . . . . . . . . . . . . . . . . . . . . . 13 3.11 ENTRY/PUBLIC . . . . . . . . . . . . . . . . . . . 13 3.12 EXT/EXTRN . . . . . . . . . . . . . . . . . . . . . 14 3.13 NAME . . . . . . . . . . . . . . . . . . . . . . . 14 3.14 ORG . . . . . . . . . . . . . . . . . . . . . . . . 14 3.15 PAGE . . . . . . . . . . . . . . . . . . . . . . . 14 3.16 SET . . . . . . . . . . . . . . . . . . . . . . . . 14 3.17 SUBTTL . . . . . . . . . . . . . . . . . . . . . . 14 3.18 TITLE . . . . . . . . . . . . . . . . . . . . . . . 15 3.19 .COMMENT . . . . . . . . . . . . . . . . . . . . . 15 3.20 .PRINTX . . . . . . . . . . . . . . . . . . . . . . 15 3.21 .RADIX . . . . . . . . . . . . . . . . . . . . . . 15 3.22 .REQUEST . . . . . . . . . . . . . . . . . . . . . 16 3.23 .Z80 . . . . . . . . . . . . . . . . . . . . . . . 16 3.24 .8080 . . . . . . . . . . . . . . . . . . . . . . . 16 3.25 Pseudoinstructiuni conditionale . . . . . . . . . . 16 3.26 Pseudoinstructiuni pentru controlul listingului . . 17 3.27 Pseudoinstructiuni de realocare . . . . . . . . . . 18 3.28 Realocarea inainte de incarcare . . . . . . . . . . 19 .pa 4. Macroinstructiuni . . . . . . . . . . . . . . . . . 20 4.1 REPT - ENDM . . . . . . . . . . . . . . . . . . . . 20 4.2 IRP - ENDM . . . . . . . . . . . . . . . . . . . . 21 4.3 IRPC - ENDM . . . . . . . . . . . . . . . . . . . . 21 4.4 MACRO . . . . . . . . . . . . . . . . . . . . . . . 21 4.5 ENDM . . . . . . . . . . . . . . . . . . . . . . . 23 4.6 EXITM . . . . . . . . . . . . . . . . . . . . . . . 23 4.7 LOCAL . . . . . . . . . . . . . . . . . . . . . . . 23 4.8 Operatori macro speciali . . . . . . . . . . . . . 24 5. Mesaje de eroare MACRO-18 . . . . . . . . . . . . . 26 6. Formatul listingului . . . . . . . . . . . . . . . 28 7. Facilitatea de referinte incrucisate . . . . . . . 30 .pa 1. FORMATUL COMENZILOR MACRO-18 1.1 SIRUL DE COMENZI MACRO-18 Macroasamblorul M18 (MACRO-18) este un program de sistem care realizeaza functia de asamblare a programelor sursa scrise in limbaj de asamblare 8080 sau Z80 si de generare de fisiere cod obiect compatibile cu fisierele obiect produse de compilatoarele FORTRAN-18 si COBOL-18. Macroasamblorul M18 poate functiona in doua moduri: - asamblarea unui singur program; - asamblarea unui lot de programe scrise in limbaj de asamblare. Pentru a incarca asamblorul si a asambla un singur program in limbaj de asamblare este necesar sa se introduca la consola comanda M18 (sau d:M18 - d: reprezinta specificatia optionala de drive, o litera de la A la P urmata de doua puncte- in cazul in care macroasamblorul se gaseste pe alt drive decit cel implicit), urmata de spatii (unul sau mai multe) si de un sir de comanda care se termina cu caracterul "carriage return" . In cazul unei comenzi incorecte asamblorul tipareste la consola un mesaj de eroare si trece in modul de asamblare al unui lot de programe, asteptind noi comenzi de la operator. In cazul in care comanda este corecta, se realizeaza asam blarea programului si se face trecerea automata in sistemul de operare CP/M. Pentru a asambla un lot de programe, este necesar sa se introduca la consola comanda d:M18 urmata de caracterul . Asamblorul va afisa la consola "*" indicind ca este gata sa primeasca comenzi. Pentru asamblarea fiecarui program se introduce un sir de comenzi terminat cu . La sfirsitul asamblarii fiecarui pro gram se afiseaza din nou la consola "*" si se asteapta o noua comanda. La sfirsitul lotului de programe se introduce comanda de terminare a lotului, compusa din caracterele CONTROL/C (ETX) si . Executia asamblorului se termina si se face tranzitia in sistemul de operare. Daca ati folosit DSEG sau CSEG asamblorul produce fisiere "cod obiect realocabile". Pentru a putea incarca si executa aceste programe este necesar sa folositi programul LINK-18. (Vezi Manual de utilizare LINK-18). Formatul comenzii M18 este urmatorul: filespec obiect,filespec listing=filespec sursa controale unde: -filespec este o abreviere pentru specificatia de fisier formata din numele dispozitivului, numele fisierului si tipul sau -numele permise pentru dispozitive sint: A: B: C: D: pentru unitatile de disc TTY: pentru consola sistem LST: pentru imprimanta disp. prog. obiect - dispozitivul pe care se scrie programul obiect. disp. listing - dispozitivul pe care se scrie listingul programului. disp. sursa - dispozitivul de pe care M18 citeste programul sursa. Daca se omite unul din numele de dispozitive, implicit se considera a fi unitatea selectata in mod curent. -nume fisier reprezinta numele si extensia fisierului (sursa, listing, obiect). Extensia fisierului poate fi omisa. Extensia considerata implicit (daca este omisa) este: MAC pentru fisierul sursa in limbaj de asamblare; REL pentru fisierul cod obiect realocabil; LST pentru fisierul listing; CRF pentru fisierul referinte incrucisate. Atit fisierul cod obiect cit si fisierul listing pot fi omise din linia de comanda. Daca nu se doreste obtinerea fisierului listing sau a fisie rului obiect, se introduce numai o virgula in stinga caracteru lui =. Daca numele fisierului obiect sau al fisierului listing este omis, numele implicit este numele fisierului sursa. Exemple: *=SOURCE.MAC Se asambleaza programul din fisierul SOURCE.MAC si se plaseaza codul obiect in SOURCE.REL. *,LST:=TEST Se asambleaza programul TEST.MAC si se listeaza la imprimanta (LST:). Nu se produce cod obiect. *OBJECT,TTY:=TEST Se asambleaza programul TEST.MAC, se genereaza cod obiect in OBJECT.REL si listingul la consola. .pa 1.2 CONTROALE MACRO-18 In sirul de comanda M18 se pot introduce si unul sau mai multe controale. Fiecare control se compune dintr-o litera prece data de caracterul /. Control Efect ------- ----- O Se tiparesc toate adresele in octal H Se tiparesc toate adresele in hexa (parametrul este implicit) R Forteaza generarea codului obiect L Forteaza generarea listingului C Forteaza generarea referintelor incrucisate Z Asamblare pentru mnemonice Z80 I Asamblare pentru mnemonice 8080 (parametrul este implicit) Exemple: *=TEST/L Se asambleaza TEST.MAC cu fisierul obiect TEST.REL si fisierul listing TEST.LST. *LAST,LAST/C=MOD1 Se asambleaza MOD1.MAC cu fisierul obiect LAST.REL si fisierul referinte incrucisate LAST.CRF care se va utiliza cu programul CREF-18. .pa 2. FORMATUL FISIERELOR SURSA In general M18 accepta un fisier sursa care este aproape identic cu cel al macroasamblorului ASM80. Liniile sursa pot avea maxim 132 caractere in lungime. M18 pastreaza literele mici numai in sirurile intre apos troafe si comentarii. Toti simbolii, codurile de operatie si pseudoinstructiunile introduse cu litere mici vor fi convertite la litere mari. 2.1 INSTRUCTIUNI Fisierul sursa consta din instructiuni de forma : > <; comentariu> unde < > marcheaza un cimp optional. In afara de liniile de control care incep cu caracterul $ in prima pozitie celelalte linii de control pot incepe din orice pozitie. 2.2 ETICHETE Daca eticheta este prezenta, este prima entitate dintr-o linie sursa si este imediat urmata de caracterul ":". Daca eticheta este urmata de 2 caractere "::" atunci simbo lul respectiv este declarat automat PUBLIC. FOO:: RET este echivalenta cu PUBLIC FOO FOO: RET Urmatoarea entitate dupa eticheta este un operator. Un operator poate fi un cod de operatie (8080 sau Z80), pseudoinstructiune, apeluri de macroinstructiuni sau expresii. Ordinea de evaluare este urmatoarea: 1. Apeluri de macroinstructiuni 2. Cod de operatie/pseudoinstructiune 3. Expresie Inainte de a semnala o expresie ca o eroare, asamblorul o trateaza ca si cum ar fi o instructiune DB. Argumentele care urmeaza dupa operator variaza in functie de tipul operatorului. Un comentariu incepe cu caracterul ; si se termina cu carac terul "carriage return" . Comentarii extinse se pot introduce cu pseudoinstructiunea .COMMENT. .cp 5 2.3 SIMBOLI Simbolii pot fi de orice lungime, dar sint semnificative numai primele 6 caractere. Intr-un simbol sint permise urmatoa rele caractere A-Z 0-9 $ . ? @. La citirea unui simbol literele mici sint convertite in litere mari. Daca referinta unui simbol este urmata de caracterele ##, acest simbol este declarat EXTERNAL. CALL FOO## este echivalent cu : EXTRN FOO CALL FOO 2.4 CONSTANTE NUMERICE Implicit baza de numeratie pentru constantele numerice este baza zecimala. Aceasta baza poate fi modificata cu pseudoinstruc tiunea .RADIX. Pentru baza 16 daca prima cifra este A-F atunci cifra trebuie precedata de un zero. Numerele sint evaluate totdeauna in baza implicita in afara urmatoarelor notatii speciale: nnnnB Numar binar nnnnD Numar zecimal nnnnO sau nnnnQ Numar octal nnnnH sau X'nnnn' Numar hexazecimal Daca un numar depaseste dimensiunea a 2 octeti depasirea este ignorata si rezultatul trunchiat la 16 biti. O constanta tip caracter este un sir de 1 sau 2 caractere ASCII delimitate de apostroafe. Aceasta constanta poate fi folo sita in expresii : DB 'A'+1 unde 'A' este o constanta de tip caracter. O constanta tip caracter compusa din doua caractere ASCII are ca valoare - valoarea primului in octetul cel mai semnifica tiv si valoarea celui de-al doilea in octetul cel mai putin semnificativ. De exemplu valoarea constantei 'AB' este 41H*256+42H. 2.5 SIRURI Un sir este compus din unul sau mai multe caractere ASCII delimitate de apostroafe. Ca delimitator pentru un sir de caractere ASCII poate fi folosit atit caracterul apostrof ' cit si caracterul ". Pentru a putea folosi si delimitatorul in sirul de caractere aceste carac tere trebuiesc dublate ori de cite ori se doreste folosirea lor. DB "ABC""DE""FG" memoreaza sirul ABC"DE"FG Daca nu exista nici un caracter intre apostroafe sirul de caractere este vid. .fo # 2.6 EVALUAREA EXPRESIILOR 2.6.1 Operatori aritmetici si logici Operatorii permisi in expresii sint: NUL LOW,HIGH * , / , MOD , SHR , SHL - unar + , - EQ , NE , LT , LE , GT , GE NOT AND OR , XOR Operatorii sint listati in ordinea precedentei. Pentru a schimba aceasta precedenta pot fi folosite in expresii parantezele (). In timpul evaluarii unei expresii, cind se intilneste un operator care are precedenta mai mica sau egala cu ultimul operator intilnit, se efectueaza toate operatiile pina la noul operator. Acest lucru inseamna ca subexpresiile care fac apel la operatori cu precedenta mai mare sint calculate primele. Toti operatorii cu exceptia + , - , * , / trebuiesc separati de operanzii lor prin cel putin un spatiu. 2.6.2 Moduri Toti simbolii utilizati ca operatori in subexpresii sint in unul din urmatoarele moduri: -absolut -relativ in segmentul de date -relativ in segmentul de cod -common Numarul modurilor COMMON dintr-un program este determinat de numarul blocurilor COMMON care au fost definite in program cu pseudoinstructiunea COMMON. In operatiile diferite de + si - modul ambilor operanzi trebuie sa fie absolut. Daca operatia este de adunare se aplica urmatoarele reguli: 1. Cel putin unul din operanzi trebuie sa fie absolut 2. Absolut+= Daca operatia este de scadere se aplica urmatoarele reguli: 1. -Absolut = 2. -=Absolut unde sint obligatoriu de acelasi tip. .cp 6 2.6.3 Referinte externe O valoare de tip EXTERNAL trebuie sa fie obligatoriu asam blata intr-un cimp de doi octeti. Pentru a utiliza simboli externi in expresii se aplica urmatoarele reguli: 1. Referintele externe sint legale numai in operatii de adunare sau scadere. 2. Daca se utilizeaza intr-o expresie un simbol extern atunci rezultatul expresiei este de tip extern. 3. Intr-o operatie de adunare oricare din operanzi poate fi un simbol extern (dar numai unul). 4. intr-o operatie de scadere numai primul operand poate fi extern. 2.7 CODURI DE OPERATIE CA OPERANZI Codurile de instructiuni sint valide numai ca operanzi de un singur octet. De notat: numai primul octet este un operand valid. Exemplu: MVI A,(JMP) ADI (CPI) MVI B,(RNZ) CPI (INX H) ACI (LXI B) MVI C,MOV A,B Daca in operand se include mai mult de un octet atunci acest lucru este semnalat ca o eroare. MVI A,(CPI 5) ADI (LXI B,LABEL) sint semnalate ca erori. Codurile de operatie utilizate ca operanzi de un octet nu au nevoie de introducerea in paranteze .pa 3. PSEUDOINSTRUCTIUNI 3.1 ASEG ASEG precizeaza asamblorului sa utilizeze contorul de loca tii pentru un segment de program absolut. Contorul de locatii pentru directiva ASEG are o valoare initiala 0. Pentru a modifica aceasta valoare se poate folosi ORG. 3.2 COMMON COMMON precizeza asamblorului sa utilizeze contorul de loca tii pentru blocul COMMON specificat. COMMON // Adresa contorului de locatii este totdeauna inceputul zonei comune astfel incit se pastreaza compatibilitatea cu instructiu nea COMMON din FORTRAN. Daca este omis sau contine numai caractere spatiu atunci este considerat blocul COMMON BLANK. 3.3 CSEG CSEG precizeaza asamblorului sa asambleze instructiunile si datele care urmeaza in mod realocabil utilizind contorul de locatii pentru segmentul realocabil de cod. Contorul de locatii pentru directiva CSEG are o valoare initiala 0. Pentru a modifica aceasta valoare se poate folosi ORG. 3.4 DSEG DSEG precizeaza asamblorului sa asambleze instructiunile si datele care urmeaza in mod realocabil utilizind contorul de locatii pentru segmentul de date. Contorul de locatii pentru segmentul realocabil de date are o valoare initiala 0. Pentru a modifica aceasta valoare se poate folosi ORG. 3.5 Define Byte DB [,...] DB [,...] [,] indica cimpuri optionale DB este identic cu folosirea in asamblorul ASM80. .CP 7 3.6 Define Storage DS  DS este identic cu folosirea in asamblorul ASM80. 3.7 Define Character DC  DC memoreaza caracterele din in adrese succesive de memorie incepind cu adresa curenta a contorului de locatii. Caracterele sint memorate in ordinea aparitiei lor in sir, fiecare caracter fiind memorat intr-un octet cu bitul cel mai semnificativ pus pe 0. Ultimul caracter din sir este memorat cu bitul cel mai semnificativ pozitionat pe 1. Un sir vid este semnalat ca eroare. 3.8 Define Word DW [,...] DW este identic cu folosirea in asamblorul ASM80. 3.9 END END [] END este identic cu folosirea in asamblorul ASM80. 3.10 EQU  EQU  EQU este identic cu folosirea in asamblorul ASM80. 3.11 ENTRY/PUBLIC ENTRY [,...] sau PUBLIC [,...] ENTRY sau PUBLIC declara fiecare nume din lista, ca fiind un simbol intern disponibil pentru utilizarea lui, in alte module de program care se asambleaza sau se compileaza separat dar care vor fi legate impreuna. Toate numele din lista trebuiesc definite in programul cu rent (altfel se semnaleaza eroarea U). Se semnaleaza eroarea M daca numele este un nume declarat extern sau un nume de bloc COMMON. .CP 10 3.12 EXT/EXTRN EXT [,.....] EXT sau EXTRN declara numele din lista ca fiind referinte externe (adica declarate PUBLIC in alte programe). Poate rezulta o eroare M daca unul din numele din lista este definit si in program. Referinta la un nume care este urmat imediat de doua carac tere ## declara implicit acel nume ca o referinta externa. 3.13 NAME NAME (' nume modul ') NAME defineste un nume pentru un modul. Pentru numele de modul sint semnificative numai primele sase caractere. Numele modulului mai poate fi definit cu TITLE. In absenta lui NAME sau TITLE numele modulului va fi numele fisierului sursa. 3.14 ORG ORG  ORG este identic cu folosirea in ASM80. 3.15 PAGE PAGE [] PAGE determina listarea programului asamblat de la o pagina noua. Daca este inclusa si atunci valoarea acestei expresii devine dimensiunea noii pagini (linii/pagina). Valoarea trebuie sa fie cuprinsa intre 10 si 255. Dimensiunea implicita a paginii este de 50 linii/pagina. La fiecare sfirsit de pagina asamblorul introduce un carac ter "form feed" . 3.16 SET  SET  SET este identic cu folosirea in ASM80. 3.17 SUBTTL SUBTTL  SUBTTL specifica listarea unui subtitlu in fiecare antet de pagina noua. este trunchiat daca este mai mare de 60 de caractere. Se pot introduce oricite SUBTTL in program. .cp 6 3.18 TITLE TITLE  TITLE specifica asamblorului listarea unui titlu pe prima linie a antetului fiecarei pagini. Intr-un program se poate specifica un singur TITLE (altfel se semnaleaza o eroare Q). Daca nu se specifica nici o pseudoinstructiune NAME atunci primele 6 caractere din vor fi folosite pentru numele de modul. Daca nu se specifica nici NAME nici TITLE atunci numele modulului se creaza din numele fisierului sursa. 3.19 .COMMENT .COMMENT < text > Primul caracter diferit de spatiu intilnit dupa .COMMENT este considerat drept delimitator. Urmeaza care cuprinde un bloc de comentarii care continua pina la prima aparitie a delimitatorului. De exemplu, utilizind un asterisc ca delimitator, formatul blocului de comentarii va fi: .COMMENT * Linii care contin orice cantitate de text ca bloc de comentarii. . . . * ; reintoarcerea la modul normal 3.20 .PRINTX .PRINTX  Primul caracter diferit de spatiu intilnit dupa .PRINTX este considerat drept delimitator. Textul care urmeaza este listat la terminal in timpul asam blarii pina la o alta aparitie a delimitatorului. PRINTX este folosit pentru a afisa progresul procesului de asamblare pentru programe foarte lungi sau pentru a afisa valo rile unor controale conditionale de asamblare. PRINTX va lista textul in fiecare din cei doi pasi ai proce sului de asamblare. Daca se doreste listarea numai in unul din pasi atunci se pot utiliza fie IF1, fie IF2. 3.21 .RADIX .RADIX  Baza implicita pentru toate constantele este baza zecimala. RADIX permite schimbarea bazei implicite intr-o noua baza (in intervalul 2-16). Exemplu: LXI H,0FFH .RADIX 16 LXI H,0FF cele doua instructiuni LXI sint identice. Expresia din .RADIX este totdeauna un numar zecimal. 3.22 .REQUEST .REQUEST [,...] REQUEST genereaza o cerere de cautare (pentru LINK-18) pentru ca acesta sa caute in fisierele din lista variabile glo bale nedefinite inainte de a cauta in biblioteca FORTRAN. Numele de fisiere din lista trebuie sa fie sub forma unor simboluri legale pentru asamblor. Numele nu trebuie sa includa extensii de fisiere sau speci ficarea unor unitati de disc. LINK-18 va completa extensiile in mod implicit si va presu pune ca unitate de discuri unitatea selectata in mod curent. 3.23 .Z80 .Z80 permite asamblorului sa accepte coduri de operatie Z80. 3.24 .8080 .8080 permite asamblorului sa accepte coduri de operatie 8080. 3.25 PSEUDOINSTRUCTIUNI CONDITIONALE Pseudoinstructiunile conditionale sint: IF/IFT Adevarat daca este diferita de 0 ("TRUE"). IFE/IFF Adevarat daca este 0 ("FALSE"). IF1 Adevarat pentru pasul 1 al asamblorului. IF2 Adevarat pentru pasul 2 al asamblorului. IFDEF Adevarat daca este definit sau a fost declarat EXTERNAL. IFNDEF Adevarat daca este nedefinit sau nu a fost declarat EXTERNAL. IFB Adevarat daca argumentul este spatiu (nul). IFNB Adevarat daca este diferit de spatiu. IFB si IFNB sint utilizate pentru a testa un parametru formal intr-o macroinstructiune. Argumentul in mod obligatoriu se introduce intre <>. Toate pseudoinstructiunile conditionale au urmatorul format: IFxx [argument] . . . [ELSE . . . ] ENDIF Pseudoinstructiunile conditionale pot fi inlantuite pe ori cite nivele. Orice argument dintr-o operatie conditionala trebuie sa fie cunoscut in pasul 1 pentru a preintimpina aparitia erorii V la evaluari incorecte. Pentru IF, IFF, IFT si IFE expresiile trebuie sa contina numai valori care au fost definite in prealabil si expresiile trebuie sa fie absolute. Daca un simbol este definit dupa IFDEF sau IFNDEF, pasul 1 al procesului de asamblare considera simbolul ca fiind nedefinit, dar va fi definit in pasul 2. ELSE Fiecare pseudoinstructiune conditionala poate fi optional folosita cu pseudoinstructiunea ELSE care permite generarea codu lui in mod alternativ cind este satisfacuta conditia opusa. Este permis numai un singur ELSE pentru un IF dat si un ELSE este totdeauna asociat cu cel mai recent IF deschis. O pseudoinstructiune conditionala cu mai mult decit un ELSE sau un ELSE fara o pseudoinstructiune conditionala va cauza aparitia unei erori C. ENDIF Fiecare IF trebuie asociat cu un ENDIF care sa-l termine. Un ENDIF fara un IF corespunzator cauzeaza o eroare C. 3.26 PSEUDOINSTRUCTIUNI PENTRU CONTROLUL LISTINGULUI Scrierea in fisierul listing poate fi controlata de doua pseudoinstructiuni : .LIST si .XLIST .cp 2 Daca nu se genereaza fisier listing aceste pseudoinstructi uni nu au nici un efect. .LIST este implicit. Cind se intilneste .XLIST se suprima listarea programului sursa si obiect pina cind se intilneste in program .LIST. Iesirea referintelor incrucisate este controlata de .CREF si .XCREF. Daca facilitatea de referinte incrucisate nu a fost apelata .CREF si .XCREF nu au nici un efect. Parametru implicit este .CREF. Cind se intilneste .XCREF nu se mai genereaza informatia de referinte incrucisate pina la urmatoarea aparitie a unui .CREF. Listarea expandarilor pentru MACRO/REPT/IRP/IRPC este con trolata de trei pseudoinstructiuni: .LALL .SALL .XALL unde: .LALL listeaza textul complet al tuturor macroexpandarilor .SALL listeaza numai codul obiect produs de o macroexpan dare fara ca sa listeze textul sau. .XALL este similar lui .SALL cu exceptia listarii numai a liniilor sursa care genereaza codul obiect. Acest parametru este implicit. 3.27 PSEUDOINSTRUCTIUNI DE REALOCARE Posibilitatea de a crea module realocabile este una din cele mai importante facilitati ale asamblorului M18. Modulele realocabile ofera avantajul unei mai usoare codifi cari a programului, unei mai rapide testari, depanari si modifi cari. Suplimentar este posibil sa se specifice segmente de cod asamblat care vor fi incarcate in memoria RAM mai tirziu (segmen tul relativ de date) sau in memoria ROM/RAM (segmentul realocabil de cod). Pseudoinstructiunile care selecteaza zonele realocabile sint CSEG si DSEG. Pseudoinstructiunea ASEG este folosita pentru a genera cod absolut (nerealocabil). Pseudoinstructiunea COMMON creaza o zona de date comuna pentru fiecare bloc COMMON definit in program. Modul implicit pentru asamblor este relativ de cod. Aceasta inseamna ca asamblarea incepe cu un CSEG executat in mod automat si cu contorul de locatii in modul cod relativ pozi tionat la zero. Toate instructiunile urmatoare vor fi asamblate in segmentul relativ de cod pina cind se va executa o pseudoinstructiune DSEG, ASEG sau COMMON. Pseudoinstructiunile ASEG, DSEG, CSEG nu au niciodata ope ranzi. Pentru a modifica valoarea curenta a contorului de locatii se foloseste pseudoinstructiunea ORG. ORG  unde este noua valoare a contorului de locatii al modului curent. Toate numele utilizate in trebuie sa fie definite in pasul 1 si valoarea expresiei trebuie sa fie sau absoluta sau in modul curent al contorului de locatie. Programul LINK-18 combina aceste segmente si creaza in memo rie fiecare modul realocabil. Adresa de inceput a segmentelor realocabile nu este fixata pina cind programul este incarcat si aceste adrese asignate de LINK-18. 3.28 REALOCAREA INAINTE DE INCARCARE Pseudoinstructiunile .PHASE si .DEPHASE permit codului obiect sa fie incarcat intr-o zona de memorie si executat obliga toriu intr-o zona de memorie diferita. Exemplu: 0000' .PHASE 100H 0100 CD 01 06 FOO: CALL BAZ 0103 C3 00 07' JMP ZOO 0106 C9 BAZ: RET .DEPHASE 0007' C3 00 05 ZOO: JMP 5 Toate etichetele din blocul .PHASE sint definite ca valori absolute de la inceputul zonei .PHASE dar codul obiect totusi este incarcat in zona de memorie curenta. Codul obiect din acest bloc poate fi mutat mai tirziu prin program la adresa 100H si executat. .pa 4. MACROINSTRUCTIUNI Facilitatile de macroinstructiuni ale asamblorului M18 includ trei pseudoinstructiuni de repetitie: - repetare simpla REPT; - repetare nedefinita IRP; - repetare nedefinita caracter IRPC; si o pseudoinstructiune de definire macroinstructiune (MACRO). Fiecare din aceste patru operatii se termina cu pseudo instructiunea ENDM. 4.1 REPT-ENDM REPT  . . . ENDM Blocul de instructiuni cuprins intre REPT si ENDM este repetat de catre asamblor de atitea ori cit indica . este evaluata ca un intreg fara semn reprezentat pe 16 biti. Nu este permisa aparitia in expresie a unor simboli externi sau nedefiniti. Exemplu: X SET 0 REPT 10 X SET X+1 DB X ENDM genereaza octetii 1,2,3,4,5,6,7,8,9,10. 4.2 IRP-ENDM IRP , . . . ENDM Lista de argumente trebuie sa fie inchisa intre paranteze ascutite < , >. Numarul de argumente din determina numarul de ori de care se repeta blocul de instructiuni. Fiecare repetitie substituie urmatorul sir din lista de argumente fiecarei aparitii a parametrului formal in bloc. Daca lista de argumente este vida (adica <> ) blocul este prelucrat o singura data cu fiecare aparitie a parametrului formal inlocuita cu sirul vid. .cp 2 Exemplu: IRP X,<1,2,3,4,5,6,7,8,9,10> DB X ENDM 4.3 IRPC-ENDM IRPC ,sir (sau ) . . . ENDM IRPC este similar cu IRP cu diferenta ca lista de argumente este inlocuita cu un sir de text iar parantezele ascutite <,> sint optionale. Instructiunile din bloc sint repetate o data pentru fiecare caracter din sir. Fiecare repetare substituie fiecare aparitie a parametrului formal in bloc cu urmatorul caracter din sir. Exemplu: IRPC X,01234567890 DB X+1 ENDM genereaza acelasi cod ca exemplele precedente. 4.4 MACRO Adesea este convenabil ca asamblorul sa fie capabil sa genereze o secventa data de instructiuni, in diferite locuri in program, chiar daca de fiecare data de cite ori se utilizeaza secventa este nevoie de anumiti parametri. Aceasta facilitate este realizata de MACRO.  MACRO  . . . ENDM trebuie sa fie un simbol legal si numele lui va fi utilizat pentru a apela macroinstructiunea. Parametri formali din lista sint parametri care vor fi modificati (inlocuiti) de fiecare data cind este apelata macro instructiunea. Instructiunile dinainte de ENDM compun corpul macroinstruc tiunii. In timpul asamblarii, macroinstructiunea este expandata de fiecare data cind este apelata, spre deosebire de REPT/IRP/IRPC unde expandarea se producea chiar la intilnirea pseudoinstructiu nii. Forma generala a unui apel de macroinstructiune este :   unde este numele folosit in macrodefinitie iar parametri din lista de parametri reali, vor inlocui parametri din lista de parametri formali, intr-o corespondenta unu la unu. Numarul sirurilor din lista de parametri formali sau reali este limitat numai de lungimea liniei. Numarul de parametri utilizati la apelul macroinstructiunii poate fi diferit de numarul parametrilor din lista de parametri formali folosita la definitia macroinstructiunii. Daca sint mai multi parametri reali decit formali, cei in plus sint ignorati. Daca sint mai putini, parametri formali in plus sint substituiti cu sirul vid. Codul asamblat va contine codul macroexpandarii dupa fiecare apel de macroinstructiune. Conventii 1. Parametrul formal trebuie sa fie un nume de simbol legal. 2. Lista de parametri formali contine parametri formali separati prin virgule. 3. Lista de argumente contine argumente separate prin virgula. Lista de argumente trebuie delimitata de paranteze ascu tite <,>. Doua paranteze ascutite (<>) fara nici un caracter intre ele, sau doua virgule consecutive introduc in lista un argument vid. Altfel un argument este fie un caracter fie un sir de caractere terminate prin virgula sau >. Argumentul poate fi si un sir inchis intre apostroafe si este generat ca atare. In afara de inchiderea intre paranteze sau apostroafe caracterele spatiu sint ignorate. 4. Lista de parametri reali contine parametri separati prin virgule fara a mai fi nevoie de un alt separator. Nota Un parametru din MACRO/REPT/IRP/IRPC este totdeauna recunoscut ca un parametru formal. Vor fi modificate la expandare in instructiunile ce compun macroinstructiunea chiar si numele de regis tre (A, B, ...) daca acestea sint folosite in lista de parametri formali. Exemplu: FOO MACRO X Y SET 0 REPT X Y SET Y+1 DB Y ENDM ENDM Aceasta macroinstructiune genereaza acelasi cod ca si in cele trei exemple precedente pentru apelul FOO 10 Un alt exemplu care genereaza acelasi cod ilustreaza folosi rea <,> cind argumentul este de fapt o lista de argumente FOO MACRO X IRP Y, DB Y ENDM ENDM cind apelul este: FOO <1,2,3,4,5,6,7,8,9,10> expandarea macro-ului arata astfel: IRP Y,<1,2,3,4,5,6,7,8,9,10> DB Y ENDM 4.5 ENDM Aceasta pseudoinstructiune este folosita pentru a termina REPT, IRP, IRPC si MACRO. 4.6 EXITM Pseudoinstructiunea EXITM este utilizata pentru a termina REPT, IRP, IRPC sau un apel macro. Cind se executa EXITM, expandarea este terminata imediat, restul expandarii sau al repetarii nu mai este generat. Daca blocul care contine EXITM este continut intr-un alt bloc mai mare, expandarea continua cu blocul mai mare. 4.7 LOCAL LOCAL  Pseudoinstructiunea LOCAL este permisa numai intr-o macrode finitie. Cind se executa LOCAL asamblorul creaza un simbol unic, pentru fiecare argument din lista si substituie acel simbol pentru fiecare aparitie a lui in macroexpandare. Acest simbol unic este folosit uzual pentru a defini o eticheta in interiorul unei macroinstructiuni, ceea ce elimina etichetele multiplu definite in expandari de macroinstructiuni succesive. Daca se utilizeaza, LOCAL trebuie sa fie prima linie dintr-o macrodefinitie. 4.8 OPERATORI MACRO SPECIALI & Este folosit pentru concatenarea textelor sau simboluri lor. Un parametru care se gaseste intr-un sir cuprins intre apostroafe nu va fi substituit in expandare daca este precedat de &. Exemplu: ERREGEN MACRO X ERROR&X: PUSH B MVI B,'&X' JMP ERROR ENDM In acest exemplu apelul ERRGEN A va genera codul : ERRORA: PUSH B MVI B,'A' JMP ERROR ;; Intr-un bloc de operatii un comentariu precedat de ;; nu este salvat ca parte a expandarii. ! Este utilizat pentru a introduce urmatorul caracter dintr-un argument ca un literal ( !; este echivalent cu <;> ). NUL Este un operator care intoarce valoarea logica adevarata daca argumentul sau (un parametru) este vid. Restul unei linii dupa NUL este considerat a fi argumentul lui NUL conditional. IF NUL argument Este fals, daca in timpul expandarii primul caracter al argumentului este diferit de ";" sau este "carriage return". Este recomandabil ca testarea parametrilor nuli sa se faca cu conditionalele IFB sau IFNB. .pa Exemplu de asamblare MACRO-18 1.4 PAGE 1 ;CSL3(P1,P2) ;SHIFT P1 LEFT CIRCULARLY 3 BITS ;RETURN RESULT IN P2 ENTRY CSL3 ;GET VALUE OF FIRST PARAMETER CSL3: 0000' 7E MOV A,M 0001' 23 INX H 0002' 66 MOV H,M 0003' 6F MOV L,A ;SHIFT COUNT 0004' 06 03 MVI B,3 0006' AF LOOP: XRA A ;SHIFT LEFT 0007' 29 DAD H ;ROTATE IN CY BIT 0008' 17 RAL 0009' 85 ADD L 000A' 6F MOV L,A ;DECREMENT COUNT 000B' 05 DCR B ;ONE MORE TIME 000C' C2 0006' JNZ LOOP 000F' EB XCHG ;SAVE RESULT IN SECOND PARAMETER 0010' 73 MOV M,E 0011' 23 INX H 0012' 72 MOV M,D 0013' C9 RET END MACRO-18 1.4 PAGE S Macros: Symbols: CSL3 0000I' LOOP 0006' No Fatal error(s) .pa  5. MESAJE DE EROARE MACRO-18 Erori de sintaxa Erorile de sintaxa sint indicate de MACRO-18 printr-un sin gur caracter care codifica tipul erorii. Acest caracter de eroare apare in prima pozitie a fisierului listing. Chiar daca fisierul listing nu se genereaza pe un dispozi tiv, liniile eronate sint afisate. A Eroare de argument. Argumentul unei pseudoinstructiuni nu este in formatul corect sau este in afara ordinului de marime. (.PAGE 1,.RADIX 1, .PUBLIC 1,STAX H,MOV M,M , INX C sint exemple de astfel de erori). C Eroare conditionala. ELSE fara un IF corespunzator, ENDIF fara un IF corespunzator, de doua ori ELSE intr-un singur IF. D Eroare simbol dublu definit. Referinta la un simbol care este multiplu definit. E Eroare External. Utilizarea unei referinte externe intr-un context ilegal. (FOO SET NAME## MVI A,2-NAME##) M Eroare simbol multiplu definit. N Eroare intr-un numar. O Eroare de sintaxa cod de operatie. ENDM, LOCAL in afara unui bloc; SET, EQU, MACRO fara un nume; Sintaxa eronata intr-un cod de operatie. Sintaxa eronata intr-o expresie (operatori consecutivi, neinchiderea corecta a paranteze lor sau a apostroafelor). P Eroare de faza. Q Sintaxa ambigua. R Eroare de realocare. Utilizarea ilegala a realocarii intr-o expresie (de ex: absolut-relativ). U Simbol nedefinit. V Eroare de evaluare. Mesaje de eroare 'No end statement encountered on input file' Programul nu se termina cu instructiunea END sau instructiunea END nu este prelucrata deoarece se gaseste intr-un bloc conditional fals. Blocul IRP/IRPC/REPT nu are sfirsit. 'Unterminated conditional' Cel putin un conditional este neterminat la intilnirea sfirsitului de fisier. 'Unterminated REPT/IRP/IRPC/MACRO' Cel putin un bloc este neterminat la intilnirea sfirsi tului de fisier. [xx] [No] Fatal error(s) [,xx warnings] Numarul erorilor fatale si al avertismentelor. Pentru compatibilitatea cu asamblorul ASM80, MACRO-18 accep ta si controalele $EJECT si $TITLE ('text'). Operanzii PAGE si INPAGE din ASM80 genereaza erori Q cind sint folositi cu CSEG si DSEG din MACRO-18. Aceste erori sint de fapt numai avertismente; asamblorul ignora operanzii. .pa 6. FORMATUL LISTINGULUI Pe fiecare pagina de listing, primele doua linii au forma : [ TITLE text ] MAC18 1.4 PAGE x[-y] [ SUBTTL text ] unde: 1. text TITLE este textul definit de pseudoinstructiunea TITLE (daca a existat o astfel de pseudoinstructiune in program). 2. x este numarul principal al paginii, care este crescut numai cind in fisierul sursa se intilneste caracterul "form feed". Cind se tipareste tabela de simboli x='S'. 3. y este numarul de pagina secundar, care se incrementeaza la fiecare intilnire in fisierul sursa a pseudoinstructiunii .PAGE sau ori de cite ori s-a completat dimensiunea curenta a paginii. 4. text SUBTTL este textul definit de pseudoinstructiunea SUBTTL (daca a existat o astfel de pseudoinstructiune in program). Apoi se tipareste in listing o linie de spatii. Liniile programului care urmeaza au forma : [crf#] [eroare] loc#m xx xxxx ... linie sursa unde: [crf#] Daca se creaza si informatia de referinte incrucisate, prima entitate din linie este un numar de referinta incrucisata urmat de un caracter TAB. [eroare] Daca linia contine o eroare atunci in acest cimp apare codul erorii urmat de caracterul spatiu. Daca nu se gene reaza cimpul [crf#] atunci codul erorii se gaseste in prima coloana a listingului. loc#m Valoare contor de locatii pe 4 digiti hexa sau 6 digiti octali (in functie de ce controale au fost introduse la lansarea MACRO-18, /H sau /O). m este un indicator care semnaleaza modul in care se gaseste contorul de locatii. m poate fi: ' mod cod relativ " mod date relativ ! mod common relativ mod absolut * referinta externa Apoi se tiparesc trei caractere spatiu urmate de codul asamblat. Restul liniei contine imaginea liniei sursa asa cum a fost ea introdusa. Listingul tabelei de simboli In listingul tabelei de simboli se gasesc listati: - Toate numele de macroinstructiuni din program listate in ordine alfabetica - Toti simbolii din program listati in ordine alfabetica. Dupa fiecare simbol se tipareste caracterul TAB urmat de valoarea simbolului. Daca simbolul respectiv este PUBLIC se tipareste imediat dupa valoarea simbolului caracterul I Urmatorul caracter poate fi : U Pentru simbol nedefinit C Pentru nume de bloc COMMON (valoarea blocului comun este dimensiunea sa in octeti) * Pentru simboli externi Valori absolute ' Valoare cod relativa " Valoare date relativa ! Valoare COMMON relativa .pa 7. FACILITATEA DE REFERINTE INCRUCISATE Facilitatea de referinte incrucisate este oferita de progra mul CREF-18. Pentru a genera un listing de referinte incrucisate, asamblorul trebuie sa genereze un fisier listing pe disc de un format special care sa includa si caractere de control (vezi CREF, .XCREF si /C). /C este controlul de referinte incrucisate pentru MACRO-18. Daca /C este intilnit in sirul de comanda MACRO-18 asamblo rul deschide fisierul cu extensia .CRF in locul fisierului cu extensia .LST. Exemple: *=TEST/C Se asambleaza fisierul TEST.MAC si se creaza fisierul obiect TEST.REL si fisierul referinte incrucisate TEST.CRF. *T,U=TEST/C Se asambleaza fisierul TEST.MAC si se creaza fisierul obiect T.REL si fisierul referinte incrucisate U.CRF. Cind operatia de asamblare s-a sfirsit, este necesar sa se apeleze programul CREF18. Sirul de comanda pentru acest program este: * fisier listing = fisier sursa Extensia implicita pentru fisierul sursa este .CRF. *=TEST Examineaza fisierul TEST.CRF si genereaza fisierul listing cu referinte incrucisate in fisierul TEST.LST. *T=TEST Examineaza fisierul TEST.CRF si genereaza fisierul cu referinte incrucisate in fisierul T.LST. Listingul cu referinte incrucisate difera de un listing obisnuit prin : 1. Fiecare linie sursa este numerotata cu un numar de referinta incrucisata. 2. La sfirsitul fisierului listing , se scriu numele variabi lelor in ordine alfabetica urmate de numerele de linie unde variabilele sint definite sau referite. Liniile in care simbolii sint definiti sint marcate cu caracterul '#'.