Elementele Limbajelor de Asamblare

5
Programare in limbaj de asamblare Elementele limbajelor de asamblare 4-1 CURS NR. 4 ELEMENTELE LIMBAJELOR DE ASAMBLARE - partea I 4.1 Directivele asamblorului Un program scris in limbaj de asamblare contine alaturi de instructiunile propriu-zise si pseudo- instructiuni (directive), care se adreseaza programului asamblor modificandu-I modul de lucru sau permitand specificarea datelor. Directivele sunt utilizate pentru: Sectionarea programelor Definire de constante simbolice (atribuire) Definirea si initializarea datelor Declararea simbolurilor globale (pentru legarea sectiunilor) Asamblare conditionata (sau repetata) la unele asambloare Informatii auxiliare 4.1.1 Definirea segmentelor logice Un modul de asmblare poate contine; un segment sau o pare a asa, parti din mai multe segmente sau mai multe segmente. Dupa asamblare se pot combina fragmente de segmente cu acelasi nume sau segmente intregi, utilizand programul tlink. Directivele complete care specifica segmentele utilizate sunt: Directiva SEGMENT – folosita pentru a marca inceputul unui segment (ex: DSEG,SSEG,CSEG) Directiva ENDS – folosita pentru a marca sfarsitul segmentului Directiva ASSUME – informeaza tasm asupra registrelor de segment prin care vor fi accesate segmentele logice definite anterior prin directiva SEGMENT (adresele de baza ale segmentelor logice) 4.1.2 Definirea constantelor simbolice Variabilele sunt definite ca rezidente la o anumita adresa relativa (OFFSET) in cadrul unui anumit SEGMENT si sunt caracterizate de tipul datelor Asambloarele pentru I8086 utilizeaza 3 tipuri simple de date: BYTE – octet=8 biti WORD - cuvant=16 biti=2 octeti DWORD - cuvant dublu=”pointer”=32 biti = 4 octeti = 2 cuvinte Pentru declararea variabilelor se utilizeaza urmatoarele directive: DB - Define Byte – declarare octeti DW - Define Word - declarare cuvinte DD - Define Double-word - declarare dublu-cuvinte Pentru rezervarea memoriei variabilelor neinitializate si precizarea valorilor multiple ale acestora: Operatorul DUP (DUPlicate) - precizare numar replici Operatorul ? - rezervare zona de memorie pentru variabila neinitializata 4.1.3 Definirea etichetelor Etichetele sunt nume simbolice de adrese; ele nu au un anumit OFFSET in cadrul unui SEGMENT. In general etichetele identifica instructiunile. In acest caz etichetele pot fi referite in alte instructiuni pentru executarea salturilor in program. Daca referirile la o eticheta sunt facute in cadrul segmentului in care ea este definita atunci se spune ca ea are atributul NEAR . Atributele etichetelor se stabilesc la definirea acestora.

description

limbaje de asamblare

Transcript of Elementele Limbajelor de Asamblare

Page 1: Elementele Limbajelor de Asamblare

Programare in limbaj de asamblare

Elementele limbajelor de asamblare 4-1

CURS NR. 4

ELEMENTELE LIMBAJELOR DE ASAMBLARE - partea I 4.1 Directivele asamblorului Un program scris in limbaj de asamblare contine alaturi de instructiunile propriu-zise si pseudo-instructiuni (directive), care se adreseaza programului asamblor modificandu-I modul de lucru sau permitand specificarea datelor. Directivele sunt utilizate pentru:

� Sectionarea programelor � Definire de constante simbolice (atribuire) � Definirea si initializarea datelor � Declararea simbolurilor globale (pentru legarea sectiunilor) � Asamblare conditionata (sau repetata) la unele asambloare � Informatii auxiliare

4.1.1 Definirea segmentelor logice

Un modul de asmblare poate contine; un segment sau o pare a asa, parti din mai multe segmente sau mai multe segmente. Dupa asamblare se pot combina fragmente de segmente cu acelasi nume sau segmente intregi, utilizand programul tlink.

Directivele complete care specifica segmentele utilizate sunt: � Directiva SEGMENT – folosita pentru a marca inceputul unui segment (ex: DSEG,SSEG,CSEG) � Directiva ENDS – folosita pentru a marca sfarsitul segmentului � Directiva ASSUME – informeaza tasm asupra registrelor de segment prin care vor fi accesate

segmentele logice definite anterior prin directiva SEGMENT (adresele de baza ale segmentelor logice)

4.1.2 Definirea constantelor simbolice Variabilele sunt definite ca rezidente la o anumita adresa relativa (OFFSET) in cadrul unui anumit SEGMENT si sunt caracterizate de tipul datelor Asambloarele pentru I8086 utilizeaza 3 tipuri simple de date:

� BYTE – octet=8 biti � WORD - cuvant=16 biti=2 octeti � DWORD - cuvant dublu=”pointer”=32 biti = 4 octeti = 2 cuvinte Pentru declararea variabilelor se utilizeaza urmatoarele directive: � DB - Define Byte – declarare octeti � DW - Define Word - declarare cuvinte � DD - Define Double-word - declarare dublu-cuvinte Pentru rezervarea memoriei variabilelor neinitializate si precizarea valorilor multiple ale acestora: � Operatorul DUP (DUPlicate) - precizare numar replici � Operatorul ? - rezervare zona de memorie pentru variabila neinitializata

4.1.3 Definirea etichetelor Etichetele sunt nume simbolice de adrese; ele nu au un anumit OFFSET in cadrul unui SEGMENT. In general etichetele identifica instructiunile. In acest caz etichetele pot fi referite in alte instructiuni pentru executarea salturilor in program. Daca referirile la o eticheta sunt facute in cadrul segmentului in care ea este definita atunci se spune ca ea are atributul NEAR . Atributele etichetelor se stabilesc la definirea acestora.

Page 2: Elementele Limbajelor de Asamblare

Programare in limbaj de asamblare Pentru declararea etichetelor in segmentul de program (etichete adrese de instructiuni) se utilizeaza operatorul : (ex: START:) Declararea etichetelor utilizate pentru referirea la date din segmentele de date sau stiva (etichete adrese de variabile) se face cu directiva LABEL , eventual precizand si atributul. 4.2 Instructiunile limbajelor de asamblare Codul obiect al unei instructiuni a I8086 este format din 1-6 octeti in functie de tipul instructiunii, la care se mai pot adauga 1-2 octeti ai unor prefixe speciale (pentru modificarea explicita a registrului segment utilizat in calcul EA; pentru repetarea unei instructiuni, etc.) Exemplu: obtinerea codului obiect pentru instructiunile I8086

� Cod oper� D

� W � Mod. � Reg. � R/M Semnificatia

R/M 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1

MOD 0 0 0 1 1 0 1 1

MOV TAB [BX] [DI] , AL 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 Deplasarea (“offset-ului”) pentru TAB

Cod operatie d w mod reg. r/m LSB MSB mod calcul al EA: EA=BX+DI+TAB registru utilizat:AL R/M: contine EA;deplasarea: pe 16 biti tip de transfer: octet (8 biti) destinatie: data de MOD si R/M

Elementele limbajelor de asamblare 4-2

atie – tipul instructiunii si implicit modul in care vor fi alocate semnificatii celorlalte campuri – indicator al destinatiei datelor (D=0 – dest. Data de MOD si R/M; D=1 – dest. Data de REG) – 0/1 indicator al tipului de transfer: octet(8)/cuvant(16) – contine informatii asupra deplasarii si semnificatia campului R/M – identifica registrul utilizat – indica registrul care contine operandul sau specifica modul de calcul al EA;

campurilor din codul operatiei instructiunilor I8086

reg.baza reg.index 0 BX SI 1 BX DI 0 BP SI 1 BP DI 0 - SI 1 - DI 0 BP - 1 BX -

MOD ≠11

r reg.segment 0 0 ES 0 1 CS 1 0 SS 1 1 DS prefixul pt. mod. segmentului

001 r 110

deplasare comentariu zero daca lipseste

octetul urmator al instr. Extins cu semn pe 16 biti instruct. contine un octet aditional cuvantul format din cei 2 octeti ai instructiunii instr. contine 2 octeti aditionali R/M este tratat ca camp indicator de registru deplasarea lipseste caci se face

transfer R-R Exceptie: MOD=00 si R/M=110. Atunci:

- instr. contine 2 octeti aditionali - cei 2 octeti reprezinta deplasarea (“offset-ul”)

REG W=0 W=1 0 0 0 AX AL 0 0 1 CX CL 0 1 0 DX DL 0 1 1 BX BL 1 0 0 SP AH 1 0 1 BP CH 1 1 0 SI DH 1 1 1 DI BH

Page 3: Elementele Limbajelor de Asamblare

Programare in limbaj de asamblare

Elementele limbajelor de asamblare 4-3

4.2.1 Operatori Asupra operanzilor instructiunilor pot fi efectuate operatii si de catre programul asamblor. Acest fel de operatii sunt specificate prin operatori si sunt executate odata cu asamblarea textului sursa. Operatorii cunoscuti de asamblorul TASM sunt de mai multe tipuri: Operatori modificatori de valori:

� Operatori aritmetici (pentru operatiile aritmetice elementare: +,-,*./,MOD); � Operatorul de indexare [] care indica o adunare (a unor adrese)

Operatori generatori de valori:

� SEG - genereaza valoarea adresei de baza a segmentului in care se afla variabila/eticheta careia i se aplica (adresa segment);

� OFFSET - genereaza valoarea adresei relative (“offset-ului”) variabilei/etichetei careaia i se aplica fata de adresa de inceput a segmentului in care este declarata;

� TYPE - genereaza numarul de octeti al unui element al variabilei careia I se aplica (ex: TYPE TABW=2);

� LENGTH - genereaza numarul de elemente pe care le are variabila careia I se aplica (ex: LENGTH TABW=5);

� SIZE - genereaza numarul de octeti alocat unei variabile (ex: TABW=10=0Ah); TYPE x LENGTH = SIZE;

� HIGH,LOW - genereaza (izoleaza) octetul cel mai semnificativ (MSB), respectiv cel mai putin semnificativ (LSB) al unei expresii;

Operatori modificatori de atribute:

� PTR - care modifica - tipul unei variabile/etichete: BYTE,WORD,DWORD - distanta unei etichete: FAR sau NEAR

� : - care modifica segmentul implicit al unei variabile/etichete (utilizat pentru precizarea adresei fizice) intr-un segment explicit (ex: DS:TABW[BP])

4.2.2 Setul instructiunilor I8086 In functie de operatiile pe care le realizeaza, instructiunile I8086 se pot grupa astfel:

� transfer de date; � operatii aritmetice si logice, deplasari si rotatii (ALU); � operatii cu siruri de date (transferuri, ALU); � operatii de transfer a comenzilor; � controlul procesului; Instructiuni de transfer - cu memoria si registrele � MOV - copierea datelor; � XLAT - examinarea datelor; � XCHG - permutarea datelor; � LEA - (calculul si) incarcarea adresei efective a unei variabile; � LDS,LES - incarcarea unui dublu-cuvant din memorie; � LAHF - citirea indicatoarelor de control ale µP (registrul F); � SAHF - modificarea indicatoarelor de control ale µP (registrul F); - cu stiva � PUSH - introducerea (salvarea) datelor in stiva; � POP - extragerea (restabilirea) datelor din stiva; � PUSH - salvarea indicatoarelor; � POP - restabilirea din stiva a indicatoarelor; - cu porturile � IN - citirea unui port; � OUT - scrierea intr-un port;

Page 4: Elementele Limbajelor de Asamblare

Programare in limbaj de asamblare

Elementele limbajelor de asamblare 4-4

Instructiuni pentru operatii de calcul (ALU):

- Aritmetice � ADD - adunare a doi operanzi; � ADC - adunare a 2 operanzi,cu luarea in calcul a flagului CF (transport) anterior pozitionat � INC - incrementare = adunare cu 1; � AAA - corectie zecimala dupa adunare in format “BCD neimpachetat” (1 cifra zecimala/1 octet) � DAA - corectie zecimala dupa adunare in format “BCD impachetat” (2 cifre zecimale/1 octet) � SUB - scadere a 2 operanzi; � SBB - scadere a 2 operanzi cu luarea in calcul a flagului CF (imprumut) anterior pozitionat � DEC - decrementare = scadere cu 1; � AAS - corectie zecimala dupa scadere in format “BCD neimpachetat”; � DAS - corectie zecimala dupa scadere in format “BCD impachetat”; � NEG - negare “aritmetica” (complementul fata de 2 al unui operand cu n biti); � MUL - inmultire a 2 operanzi in conventia dereprezentare fara semn; � IMUL - inmultire a 2 operanzi in conventia de reprezentare cu semn; � AAM - corectie zecimala dupa inmultire in format “BCD neimpachetat”; � DIV - impartire a 2 operanzi in conventia de reprezentare fara semn; � IDIV - impartire a 2 operanzi in conventia de reprezentare cu semn; � AAD - corectie zecimala dupa impartire in format “BCD neimpachetat” � CBW - conversie octet → cuvant (extinderea semnului); � CWD - conversie cuvant → dublu-cuvant (extinderea semnului); - Logice � NOT - negare “logica” 9complementul fata de 1 = complementare bit cu bit); � AND - “si logic” intre 2 operanzi (bit cu bit); � OR - “sau logic” intre 2 operanzi (bit cu bit); � XOR - “sau-exclusiv-logic” intre 2 operanzi (bit cu bit); � TEST - “comparatie logica” intre 2 operanzi = “si logic” fara generarea rez. – poz. doar fleg-urile; - Deplasari � SHL - deplasare “logica” la stanga; � SAL - deplasare “aritmetica” la stanga (echivalenta cu SHL); � SHR - deplasare “logica” la dreapta; � SAR - deplasare “aritmetica” la dreapta (cu pastrarea bitului de semn); - Rotatii � ROL - rotatie la stanga; � ROR - rotatie la dreapta; � RCL - rotatie la stanga prin CF; � RCR - rotatie la dreapta prin CF;

Instructiuni pentru lucrul cu siruri:

- Transferuri � MOVS - transferul valorii curente a unui sir sursa in locatia curenta a unui sir destinatie; � LODS - transferul valorii curente a unui sir sursa in registrul acumulator corespunzator; � STOS - transferul valorii unui registru acumulator in locatia curenta a unui sir destinatie; � Prefixul REP - repetarea de CX ori a instr. de lucru cu siruri (MOVS,LODS,STOS) cu

incrementarea/decrementarea automata cu 1 sau a registrului SI/DI utilizat pentru siruri sursa/destinatie;

- Comparatii � CMP - comparatie intre operanzi = scadere fara generarea rezultatului – pozitioneaza doar flag-urile � CMPS - comparatie intre valorile curente a doua siruri; � SCAS - comparatie intre valoarea curenta a unui sir si continutul registrului acumulator corespunzator; � Prefixele REPZ=REPE si REPNZ=REPNE - repetarea de CX ori a instructiunii de comparatie

pentru siruri (CMPS,SCAS) cu incrementarea/decrementarea automata cu 1 sau a registrului SI/DI utilizat pentru siruri sursa/destinatie, repetare conditionata de egalitatea/inegalitatea cantitatilor comparate (ZF=”1”/”0”);

- Salturi � JMP - salt neconditionat; � JP=JPE - salt conditionat de PF=”1” – paritatea anterioara a fost para;(PE-parity even) � JNP=JPO - salt conditionat de PF=”0” – paritatea anterioara a fost impara; (PO-parity odd) � JO - salt conditionat de OF=”1” – a fost depasire; (O-overflow) � JNO - salt conditionat de OF=”0” – nu a fost depasire;(NO-not overflow)

Page 5: Elementele Limbajelor de Asamblare

Programare in limbaj de asamblare

Elementele limbajelor de asamblare 4-5

� JS - salt confditionat de SF=”1” – rezultatul anterior a fost negativ; (S-signed) � JNS - salt conditionat de SF=”0” – rezultatul anterior a fost pozitiv; � JE=JZ - salt conditionat de ZF=”1” – egalitate la comparatia anterioara; (Z-zero) � JNE=JNZ - salt conditionat de ZF=”0” – inegalitate la comparatia anterioara; � JL=JNGE - salt conditionat de SF≠OF (SF xor OF = “1”) – mai mic la comparatia anterioara a

unor valori “cu semn”; (L-less than; NGE-not greater or equal) � JLE=JNG - salt conditionat de ZF=”1” sau SF≠OF – mai mic sau egal la comparatia anterioara

a unor valori “cu semn”; (LE-less than or equal) � JG=JNGL - salt conditionat de ZF=”0” si SF=OF – mai mare la comparatia anterioara a unor

valori “cu semn”; � JGE=JNL - salt conditionat de SF=OF – mai mare sau egal la comparatia anterioara a unor

valori “cu semn”; � JB=JNAE=JC- salt conditionat de CF=”1” - mai mic la comparatia anterioara a unor valori “fara

semn” sau transport la operatia ALU anterioara; (B-below;NAE-not above or equal) � JBE=JNA - salt conditionat de CF=”1” sau ZF=”1” – mai mic sau egal la comparatia anterioara

a unor valori “fara semn”; (BE-below or equal) � JA=JNBE - salt conditionat de CF=ZF=”0” – mai mare la comparatia anterioara a unor valori

“fara semn”; � JAE=JNB=JNC - salt conditionat de CF=”0” – mai mare sau egal la comparatia anterioara a

unor valori “fara semn” sau nu exista transport la operatia ALU anterioara; (NC-not carry) � JCXZ - salt conditionat de continutul CX=”0”; Apel si revenire din procedura � CALL - apel de procedura; � RET - revenire din procedura; Controlul iteratiilor � LOOP - executie repetata de CX ori a secventei cuprinsa intre eticheta proprie si

instructiunea LOOP; � LOOPZ=LOOPE - executie repetata de CX ori a secventei cuprinsa intre eticheta proprie si

instructiunea LOOP, conditionata de ZF=”1”; � LOOPNZ=LOOPNE - executie repetata de CX ori a secventei cuprinsa intre eticheta proprie si

instructiunea LOOP, conditionata de ZF=”0” Controlul intreruperilor � INT,INTO - apeluri de intreruperi; � IRET - revenire din intrerupere; Operatii cu flag-uri � STC - forteaza CF=”1”; � CLC - forteaza CF=”0”; � CMC - complementare CF; � STD - forteaza DF=”1” – stabilirea parcurgerii sirurilor prin decrementarea adreselor; � CLD - forteaza DF=”0” – stabilirea parcurgerii sirurilor prin incrementarea adreselor; � STI - forteaza IF=”1” – validarea intreruperilor mascabile; � CLI - forteaza IF=”0” – inhibarea intreruperilor mascabile; Sincronizarea externa � HLT - starea “HALT” – iesire prin RESET,NMI sau INTR=IF=”1”; � WAIT - starea “WAIT” – asteptare pana TEST=”1”; � ESC - pentru coprocesor; � LOCK - blocarea accesului altor procesoare la bus; � NOP - instructiune fara operatie;

4.3 Bibliografie

[1] Dan Somnea, Teodor Vladut – Programarea in Assembler, Ed. Tehnica,1992 [2] Eugen Borcoci,Sorin Zoican,Eduard Popovici - Arhitectura microporcesoarelor, Ed. Media

Publishing, Bucuresti, 1995 [3] Stozjanov I. – De la poarta TTL la microprocesor, Ed. Tehnica,1987

[4] Vlad Caprariu, Andrei Enyedi, Marius Muntean - Sistemul de operare DOS – Ghidul programatorului Ed. MicroInformatica, Cluj-Napoca, 1991