Sunteți pe pagina 1din 18

Universitatea tefan cel Mare Suceava

Facultatea de Inginerie Electric i tiina Calculatoarelor

Proiect Programarea
calculatoarelor i limbaje de
programare 3

Coordonator:
Larionescu Alexandru-Bogdan

Student:

EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor

Matei
Florin

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 CDROM, etc.
Microprocesorul Intel 8086 este o unitate centrala de prelucrare care este formata din 2
componente:
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

EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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);
EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
- 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,
EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
- 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).

EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor

CODUL ASM:
STACKSG SEGMENT STACK 'STACK'
DW 120 DUP(?) ;STIVA
STACKSG 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'

EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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 <ENTER>
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
EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

10

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

11

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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

EA 1321A

12

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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

EA 1321A

13

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

14

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

15

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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
EA 1321A

16

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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

EA 1321A

17

Universitatea tefan cel Mare Suceava


Facultatea de Inginerie Electric i tiina Calculatoarelor
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 1321A

18

S-ar putea să vă placă și