programare asm

23
Universitatea „Ștefan cel Mare” Suceava Facultatea de Inginerie Electrică și Știința Calculatoarelor Proiect Programarea calculatoarelor și limbaje de programare 3 Coordonator: Larionescu EA 1321A

Upload: constantin-florin

Post on 17-Dec-2015

243 views

Category:

Documents


1 download

DESCRIPTION

Assembly language programing. This is a simple calculator made in asm.

TRANSCRIPT

Universitatea tefan cel Mare SuceavaFacultatea de Inginerie Electric i tiina Calculatoarelor

Universitatea tefan cel Mare SuceavaFacultatea de Inginerie Electric i tiina Calculatoarelor

Proiect Programarea calculatoarelor i limbaje de programare 3

Coordonator:Larionescu

Student:

Intel 8086

Microprocesorul este o unitate centrala de prelucrare (UCP) realizata intr-un singur circuit integrat. Un sistem digital de prelucrare realizat cu ajutorul unui microprocesor este numit microcalculator. Microcalculatorul are trei functii principale: prelucrarea informatiilor in UCP, stocarea informatiilor in memorie si transferul informatiilor in interior si cu mediul exterior.Prin intermediul unor interfete, numite porturi de intrare/iesire (IO), microcalculatorul transfera informatii cu elementele mediului exterior, numite echipamentele periferice. Echipamenteperiferice sunt: tastatura, monitor, imprimanta, disc hard, discheta, cititor de CD-ROM, etc.

Microprocesorul Intel 8086 este o unitate centrala de prelucrare care este formata din 2componente:

1. Unitatea de executie (UE) decodifica instructiunile numerice, da comenzi interne pentru efectuarea calculelor si comenzi externe catre cea de-a doua unitate. UE contine 8 locatii de memorie interna numite registre de uz general. Registrele ofera o capacitate de memorare mica dar si un acces (citire sau scriere) foarte rapid.Pentru a stoca o cantitate mai mare de date (codurile numerice ale instructiunilor si variabilele programelor) este necesara conectarea microprocesorului cu o memorie de capacitate mare, numita memorie principala (MP). Desigur ca accesul la MP este mult mai lent.2. Unitatea de interfata cu bus-urile (UI) calculeaza adresele MP si IO, transfera datele intre UE si MP sau intre UE si I/O, si transfera catre UE codurile numerice ale instructiunilor citite din MP.Pentru a identifica in mod unic fiecare dintre locatiile MP si IO, este necesara asocierea unor referinte numerice numite adrese. De aceea UI este responsabila cu generarea adreselor catre MP. Microprocesorul Intel 8086 lucreaza cu date de 16 biti, numite cuvinte de date. Transferurile intre UE si UI sau intre microprocesor si MP sau IO se fac in general sub forma de cuvinte de date de 16 biti. De aceea bus-ul intern prin care comunica UE si UI al microprocesorului Intel 8086 este de 16 biti.Pentru compatibilitate cu microprocesoarele care lucrau cu date de 8 biti, si Intel 8086 poate transfera valori sub forma unor octeti (date de 8 biti). De aceea locatiile MP si ale IO sunt octeti.Microprocesorul Intel 8086 poate lucra cu maximum 1 M octeti de MP, adica poate genera cel mult 1 M de adrese distincte. Deoarece 1M = 216 , inseamna ca adresele la microprocesorul Intel 8086 sunt reprezentabile cu 20 de biti.

Structura microprocesorului Intel 8086 este de tip "pipe-line" (prezinta paralelism temporal) permitand efectuarea in acelasi timp a doua operatii diferite de catre cele doua unitati diferite ale sale - UE decodifica instructiunile si efectueaza calculele, in timp ce UI calculeaza adresele si efectueaza transferurile.Astfel, cele doua unitati ce compun UCP efectueaza autonom secvente de operatii proprii, transferindu-si in acelasi timp informatii. Secventele de operatii efectuate de cele doua unitati ale microprocesorului pentru a executa instructiunile sunt numite cicluri de instructiune, pentru UE si cicluri masina de bus, pentru UI.

Microprocesorul Intel 8086 efectueaza prelucrari sub comanda unui program numit si program de aplicatie. Programul este o secventa de instructiuni aflata in memoria principala. Desi limbajele de nivel inalt sunt preferate in general datorita posibilitatilor de structurare a programelor, in cazul sistemelor dedicate realizate cu microprocesor, este util si uneori necesar ca o parte sau uneori intregul program sa fie scris in limbaj de asamblare.Principalul avantaj al programelor scrise in limbaj de asamblare este viteza maxima de executie. Acesta deriva din faptul ca in limbaj de asamblare operatiile limbajului (instructiunile) sunt cele ale microprocesorului.O alta caracteristica a limbajului de asamblare este faptul ca referintele simbolice (etichete,variabile) sunt cele ale unor elemente din memorie (corespund unor adrese). Procesul prin care se ajunge de la punerea unei probleme pe care trebuie sa o rezolve microprocesorul la crearea unui program care sa indeplineasca corect cerintele acelei probleme se numeste dezvoltare a acelui program.

Etapele dezvoltarii unui program pentru microprocesorul Intel 8086 sunt:

1. Conceperea programului in limbaj de asamblare.2. Editarea programului cu ajutorul unui editor de texte, obtinandu-se textul sursa.3. Asamblarea textului sursa, obtinandu-se codul obiect.4. Corectarea eventualelor erori de asamblare, reluandu-se etapa 2 daca este cazul.5. Editarea de legaturi a codului obiect, obtinandu-se codul executabil.6. Corectarea eventualelor erori de editare de legaturi, reluandu-se etapa 2 daca este cazul.7. Lansarea in executie a programului, comparandu-se efectul cu cel dorit.8. Corectarea eventualelor erori conceptie, reluandu-se etapa 1 daca este cazul.

Asamblorul este un sistem software (SW) care asista programatorul in elaborarea programelor in cod masina. Programul asamblor converteste reprezentarile simbolice ale instructiunilor in configuratii binare obtinind echivalentele in cod masina ale instructiunilor.Asamblorul este de fapt un compilator simplificat pentru programe sursa scrise in limbaj de asamblare. Asamblarea se face de obicei in doi pasi:

- la prima parcurgere a textului se culeg toate referintele simbolice (denumirile) si se introduc intr-un tabel de simboluri;- la a doua parcurgere a textului sursa se face traducerea folosind informatiile din tabel. Informatiile simbolice intalnite de asamblor in textul sursa al unei sectiuni pot fi:- elemente absolute (coduri de operatii, constante, nume simbolice ale instructiunilor din sectiunile absolute);- informatii relocabile, a caror valoare depinde de pozitia lor relativa in sectiune si care poate sa difere de la o executie la alta, in functie de adresa de incarcare a sectiunii in memorie; valoarea unui element relocabil este data de pozitia definitiei sale in textul sursa, fata de inceputul sectiunii;- referinte externe (simboluri globale) - nume simbolice definite intr-o sectiune si referite in late sectiuni si a caror valoare se stabileste numei in momentul legarii sectiunilor intr-un program unic.Rezultatul asamblarii este un text in forma binara (cod obiect) in care se pastreaza in forma initiala numai referintele externe. In plus se furnizeaza informatii indicind locul referintelor relocabile pentru ca in momentul incarcarii valorile lor sa devina referinte absolute.Combinarea sectiunilor se face de catre un program editor de legaturi prin rezolvarea referintelor externe (adica inlocuirea numelor cu adrese din memorie) si adaugarea eventual a rutinelor din bibliotecile standard (care sint pastrate tot intr-o forma relocabila).Programul rezultat este deja pus intr-o forma interna, direct executabila, el trebuind eventual numai relocatat de catre un program locator. Locatorul este apelat in momentul punerii in executie a programului creat.

Executia poate fi obtinuta fie ca o comanda data sistemului de operare din linia de comanda, fie prin lansarea in executie dintr-un mediu specializat. Un astfel de mediu specializat este depanatorul simbolic, care permite executia instructiune cu instructiune cu urmarirea resurselor (registre, flag-uri, memorie, adrese, stiva, etc.).

Depanatorul simbolic Turbo Debugger

Depanatorul simbolic Turbo Debugger (TD) este o componenta a mediilor de dezvoltare Pascal si C in variantele Turbo sau Borland actuale. El permite vizualizarea resurselor unui PC (Personal Computer), care este un sistem echipat cu microprocesor, in general din familia Intel 80x86.Resursele sunt interne (registrele microprocesorului) sau externe (valorile unor locatii de memorie principala). Ele pot fi urmarite in timpul executiei unui program in cod masina sau in limbaj de nivel inalt (Pascal, C), instructiune cu instructiune sau dupa executia unei secvente de instructiuni.Pe ecran resursele apar in 5 subferestre, dupa cum urmeaza:- subfereastra codului programului (continutul memoriei principale asociate segmentului de cod), astfel:- in stanga adresele, in forma segment : offset,- in mijloc codul masina numeric,- in dreapta codul simbolic (instructiunile in limbaj masina),- subfereastra registrilor microprocesorului,- subfereastra flag-urilor,-subfereastra memoriei principale (continutul memoriei principale asociate segmentului specificat), astfel:- in stanga adresele, in forma segment : offset,- in mijloc codurile numerice,- in dreapta codurile ASCII asociate,- subfereastra stivei (continutul memoriei principale asociate segmentului de stiva).

Simplu calculator in ASM

Proiectul reprezinta un calculator cu functiile de baza: adunare, scadere, inmultire si impartire (mod si/sau div). La rularea programului se deschide o fereastra DOS in care este afista meniul Calculatorului. Acesta cuprinde urmatoarele optiuni:

Calculator Input (ecuatia scrisa de la tastatura) Rezultat Instructiuni de utilizare Info Exit

Programul este folosit folosind doar tastatura, in primul meniu se folosesc tastele: C,I si X pentru a executa operatiile adiacente acestor taste. Daca se acceseaza optiunea Calculator, programul v-a afisa un nou meniu in care sunt introduse datele (ecuatia/ecuatiile) si este afisat rezultatul.Ecuatiile sunt introduse impreuna cu caracterele ce reprezinta functia dorita, si anume: +, -, *, /, %. Programul mentine afisata ecuatia pana ce este apasata tasta Enter sau Backspace, aceasta din urma stergand toata ecuatia nu doar un caracter. La apasarea tastei Enter, programul va calcula ecuatia prin intermediul unor bucle de calcul si va afisa rezultatul. Programul poate calcula doar numere intregi, de aceea daca in urma calculului nu se obtine un numar intreg, se va afisa doar partea intreaga a rezultatului. Calculatorul primeste de la tastatura doar caractere, de aceea caracterele sunt transformate in numere prin intermediul buclei ASCII_NUM iar pentru a se afisa rezultatul acesta este transformat in caractere prin intermediul buclei CONV_ASCII. Pentru a avea in fata forma ecuatiei introduse am folosit bucla CON_EC care afiseaza pe ecran fiecare caracter (numar sau operatie) dar care sunt recunoscute de program (orice alt caracter introdus, care nu este recunoscut va duce la stergerea sirului de caractere).

CODUL ASM:

STACKSG SEGMENT STACK 'STACK' DW 120 DUP(?) ;STIVASTACKSG ENDS

DATASG SEGMENT 'DATA'

CR EQU 0DH LF EQU 0AH TEX DB 60 DUP('#') ;STOCHEAZA DATELE INTRODUSE DE LA TASTATUR. ASSCII_NUM DB 30 DUP(?) ;REZULTAT SUB FORMA ASCII STDTEX DW 20 DUP(0) ;FORMA STANDARD A DATELOR INTRODUSE RESULT DW 10 DUP(0) ;REZULTAT MENIU DB 30 DUP(' ') , 0C9H , 14 DUP(0CDH) , 0BBH , CR , LF ;MENIUL DB 30 DUP(' ') , 0BAH , 'C) CALCULATOR ' , 0BAH , CR , LF DB 30 DUP(' ') , 0BAH , 'I) INFO ' , 0BAH , CR , LF DB 30 DUP(' ') , 0BAH , 'X) EXIT ' , 0BAH , CR , LF DB 30 DUP(' ') , 0C8H , 14 DUP(0CDH) , 0BCH , CR , LF , '$' INFO DB 20 DUP(' ') , 0C9H , 42 DUP(0CDH) , 0BBH , CR , LF DB 20 DUP(' ') , 0BAH , ' PROIECT PCLP3 ' , 0BAH , CR , LF DB 20 DUP(' ') , 0BAH , 'NUME : CALCULATOR IN ASM ' , 0BAH , CR , LF DB 20 DUP(' ') , 0BAH , 'AUTOR : MATEI FLORIN ' , 0BAH , CR , LF DB 20 DUP(' ') , 0BAH , ' : EA 1321A, FIESC SUCEAVA ' , 0BAH , CR , LF DB 20 DUP(' ') , 0C8H , 42 DUP(0CDH) , 0BCH , CR , LF , '$' CALCFORM DB 'INPUT : ' , CR , LF ;FORMA CALCULATOR DB 'REZULTAT: ' , CR , LF DB ' ' , CR , LF DB ' * APASATI < ENTER > PENTRU A CALCULA ECUATIA' , CR , LF DB ' * APASATI < M > PENTRU A TRECE LA MENIU ' , CR , LF , '$'

DATASG ENDS

CODESG SEGMENT 'CODE' ASSUME SS: STACKSG , DS: DATASG , CS: CODESG MAIN PROC FAR MOV AX , DATASG MOV DS , AX MENIU_LOOP : CALL CLRSCR ;CLEAR SCREEN MOV AH , 02H MOV BH , 0 MOV DH , 9 MOV DL , 0 INT 10H MOV AH , 09H LEA DX , MENIU INT 21H MOV AH , 7H INT 21H CMP AL , 'c' ;DACA TASTA ESTE C, SE RULEAZA BUCLA CALCULATOR JE CALC_LOOP_JMPR CMP AL , 'C' JE CALC_LOOP_JMPR CMP AL , 'i' ;DACA TASTA ESTE I, SE AFISEAZA SUBMENIUL INFO JE INFO_LOOP_JMPR CMP AL , 'I' JE INFO_LOOP_JMPR CMP AL , 'x' ;DACA TASTA ESTE X, SE INCHIDE PROGRAMUL JE EXIT_JMPR CMP AL , 'X' JE EXIT_JMPR JMP MENIU_LOOP CALC_LOOP_JMPR : JMP CALC_LOOP INFO_LOOP_JMPR : JMP INFO_LOOP EXIT_JMPR : JMP EXIT CALC_LOOP : CALL CLRSCR ;STERGE ECRAN CALL SETCUR ;SETEZ CURSORUL PE ZERO MOV AH , 09H ;AFISARE FORMA CALCULATOR LEA DX , CALCFORM INT 21H MOV AH , 02H ;MUT CURSORUL DUPA INPUTp MOV BH , 0 MOV DH , 0 MOV DL , 9 INT 10H LEA SI , TEX ;SALVEZ ADRESA LUI TEX IN SI GET_INPUT : MOV AH , 01H ;CITESC DE LA TASTATURA INT 21H CMP AL , 0DH ;COMPAR CU MOV BYTE PTR [SI] , '#' JE RUN_STATEMENT CMP AL , 4DH JE MENIU_LOOP CMP AL , 6DH JE MENIU_LOOP NUMBER_SIGN : CMP AL , '0' JL CHECK_SIGN CMP AL , '9' JG CHECK_SIGN JMP PUT_CHAR CHECK_SIGN : CMP AL , '+' JE PUT_CHAR CMP AL , '-' JE PUT_CHAR CMP AL , '*' JE PUT_CHAR CMP AL , '/' JE PUT_CHAR CMP AL , '%' JE PUT_CHAR JMP CALC_LOOP PUT_CHAR : MOV [SI] , AL INC SI JMP GET_INPUT RUN_STATEMENT : CALL CON_EC CALL CALCULEAZA CALL CONV_ASSCII MOV AH , 02H MOV BH , 0 MOV DH , 1 MOV DL , 9 INT 10H MOV AH , 09H LEA DX , ASSCII_NUM INT 21H MOV AH , 7H INT 21H JMP CALC_LOOP INFO_LOOP : CALL CLRSCR MOV AH , 02H MOV BH , 0 MOV DH , 6 MOV DL , 0 INT 10H MOV AH , 09H LEA DX , INFO INT 21H MOV AH , 7H INT 21H JMP MENIU_LOOP EXIT : MOV AX , 4C00H INT 21H MAIN ENDP CALCULEAZA PROC NEAR LEA SI , STDTEX LEA DI , RESULT MOV CX , '#' PUSH CX NEXT_TWO_WORD : MOV AH , [SI] INC SI MOV AL , [SI] INC SI MOV BH , [SI] INC SI MOV BL , [SI] INC SI MOV [DI] , AH INC DI MOV [DI] , AL INC DI POP CX PUSH CX CMP CL , '#' JNE NOT_EMPTY CMP BL , '#' JE FINISHED PUSH BX JMP NEXT_TWO_WORD NOT_EMPTY : CMP BL , '#' JE FINISHED NEXT_SIGN : POP CX PUSH CX CMP CL , '#' JE END_SIGN MOV AL , CL MOV AH , BL CALL CMP_SIGN CMP AL , AH JGE RUN_STACK JMP END_SIGN RUN_STACK : DEC DI MOV AL , [DI] DEC DI MOV AH , [DI] DEC DI MOV DL , [DI] DEC DI MOV DH , [DI] POP CX CMP CL , '+' JE PLUS_SIGN CMP CL , '-' JE MINE_SIGN CMP CL , '*' JE MUL_SIGN CMP CL , '/' JE DIV_SIGN CMP CL , '%' JE MOD_SIGN PLUS_SIGN : ADD DX , AX JMP PUT_RESULT MINE_SIGN : SUB DX , AX JMP PUT_RESULT MUL_SIGN : IMUL DX MOV DX , AX JMP PUT_RESULT DIV_SIGN : XCHG AX , DX MOV BP , DX MOV DX , 0 IDIV BP MOV DX , AX JMP PUT_RESULT MOD_SIGN : XCHG AX , DX MOV BP , DX MOV DX , 0 IDIV BP JMP PUT_RESULT PUT_RESULT : MOV [DI] , DH INC DI MOV [DI] , DL INC DI JMP NEXT_SIGN END_SIGN : PUSH BX JMP NEXT_TWO_WORD FINISHED : RUN_STACK2 : DEC DI MOV AL , [DI] DEC DI MOV AH , [DI] DEC DI MOV DL , [DI] DEC DI MOV DH , [DI] POP CX CMP CL , '#' JE EXIT_CLACULATE CMP CL , '+' JE PLUS_SIGN2 CMP CL , '-' JE MINE_SIGN2 CMP CL , '*' JE MUL_SIGN2 CMP CL , '/' JE DIV_SIGN2 CMP CL , '%' JE MOD_SIGN2 PLUS_SIGN2 : ADD DX , AX JMP PUT_RESULT2 MINE_SIGN2 : SUB DX , AX JMP PUT_RESULT2 MUL_SIGN2 : MUL DX MOV DX , AX JMP PUT_RESULT2 DIV_SIGN2 : XCHG AX , DX MOV BP , DX MOV DX , 0 DIV BP MOV DX , AX JMP PUT_RESULT2 MOD_SIGN2 : XCHG AX , DX MOV BP , DX MOV DX , 0 IDIV BP JMP PUT_RESULT2 PUT_RESULT2 :MOV [DI] , DH INC DI MOV [DI] , DL INC DI JMP RUN_STACK2 EXIT_CLACULATE : RET CALCULEAZA ENDP CMP_SIGN PROC NEAR CMP AL , '+' JE PLUS_SIGN_AL CMP AL , '-' JE MINE_SIGN_AL CMP AL , '*' JE MUL_SIGN_AL CMP AL , '/' JE DIV_SIGN_AL CMP AL , '%' JE MOD_SIGN_AL PLUS_SIGN_AL : MOV AL , 0 JMP NEXT_STEP MINE_SIGN_AL : MOV AL , 0 JMP NEXT_STEP MUL_SIGN_AL : MOV AL , 1 JMP NEXT_STEP DIV_SIGN_AL : MOV AL , 1 JMP NEXT_STEP MOD_SIGN_AL : MOV AL , 1 JMP NEXT_STEP NEXT_STEP : CMP AH , '+' JE PLUS_SIGN_AH CMP AH , '-' JE MINE_SIGN_AH CMP AH , '*' JE MUL_SIGN_AH CMP AH , '/' JE DIV_SIGN_AH CMP AH , '%' JE MOD_SIGN_AH PLUS_SIGN_AH : MOV AH , 0 JMP EXIT_PROC MINE_SIGN_AH : MOV AH , 0 JMP EXIT_PROC MUL_SIGN_AH : MOV AH , 1 JMP EXIT_PROC DIV_SIGN_AH : MOV AH , 1 JMP EXIT_PROC MOD_SIGN_AH : MOV AH , 1 JMP EXIT_PROC EXIT_PROC : RET CMP_SIGN ENDP CON_EC PROC NEAR LEA SI , TEX LEA DI , STDTEX NEXT_CHR : MOV BL , [SI] CMP BL , '+' JE PUTCHAR CMP BL , '-' JE PUTCHAR CMP BL , '/' JE PUTCHAR CMP BL , '*' JE PUTCHAR CMP BL , '%' JE PUTCHAR MOV CX , 10 MOV BX , 0 MOV BP , 0 CONVERT_NEXT : MOV BL , [SI] SUB BL , 30H MOV BH , 0 MOV AX , BP MUL CX MOV BP , AX ADD BP , BX INC SI CMP BYTE PTR[SI] , '0' JL PUTNUM CMP BYTE PTR[SI] , '9' JG PUTNUM JMP CONVERT_NEXT PUTNUM : MOV BX , BP MOV [DI] , BH INC DI MOV [DI] , BL INC DI JMP NEXT PUTCHAR : MOV BH , 0 MOV [DI] , BH INC DI MOV [DI] , BL INC DI INC SI JMP NEXT NEXT : CMP BYTE PTR[SI] , '#' JNE NEXT_CHR MOV BYTE PTR [DI] , 0 INC DI MOV BYTE PTR [DI] , '#' RET CON_EC ENDP CONV_ASSCII PROC NEAR MOV AH , BYTE PTR RESULT MOV AL , BYTE PTR RESULT + 1 TEST AX , 8000H MOV DI , 0 JZ AX_POSITIVE NEG AX MOV DI , 1 AX_POSITIVE : MOV CX , 10 LEA SI , ASSCII_NUM ADD SI , 29 MOV BP , 0 ASSCII_LOOP : MOV DX , 0 DIV CX OR DL , 30H MOV [SI] , DL DEC SI INC BP CMP AX , 0 JA ASSCII_LOOP CMP DI , 0 JZ REST MOV DL , '-' MOV [SI] , DL DEC SI INC BP REST : LEA DI , ASSCII_NUM ORDER_ASSCII : INC SI MOV AL , BYTE PTR [SI] MOV BYTE PTR [DI] , AL INC DI DEC BP CMP BP , 0 JA ORDER_ASSCII MOV CL , '$' MOV BYTE PTR [DI] , CL RET CONV_ASSCII ENDP SETCUR PROC NEAR MOV AH , 02H MOV BH , 0 MOV DH , 0 MOV DL , 0 INT 10H RET SETCUR ENDP CLRSCR PROC NEAR MOV AX , 0600H MOV BH , 61H MOV CX , 0 MOV DX , 184FH INT 10H RET CLRSCR ENDP

CODESG ENDS END MAIN

EA 1321AEA 1321A4