Sunteți pe pagina 1din 6

Colocviu AMP

Cerinta:
Sa se scrie un program, in limbaj de asamblare I8086, cu urmatoarele functii:

- citeste de la tastatura un numar de maxim 2 cifre in baza 10
- calculeaza divizorii acestui numar
- afiseaza pe ecran divizorii numarului

Se vor genera mesaje informative si mesaje de eroare.
Exemplu:
La intrare 85
La iesire 1,5,17,85
Descriere Program :
Programul realizat afiseaza divizorii unui numar de maxim 2 cifre, in baza 10, citit de la tastatura.
Programul cere utilizatorului sa introduca pe rand, cifra zecilor si cifra unitatilor. Daca numarul introdus
de utilizator este de doar o cifra, acesta va introduce 0 pentru cifra zecilor si cifra dorita pentru cifra
unitatilor. In cazul introducerii unui caracter, programul va afisa un mesaj de eroare si ii va cere
utilizatorului sa introduca o cifra, ci nu un caracter. Odata introduse cele 2 cifre, programul va construi
numarul respectiv inmultind cifra zecilor cu 10 si adunand la aceasta inmultire cifra unitatilor, numarul
final fiind salvat in registrul CH.
Odata construit numarul, programul va calcula divizorii acestuia. S-a initializat impartitorul in registrul
CL, apoi s-a intrat intr-o eticheta de looping. Impartitorul se va incrementa treptat, de fiecare data cand
valoarea restului in urma impartirii este 0. Catul se va pune in AL iar Restul in AH. de fiecare data cand
restul este 0, programul va sari la afisaj, in caz contrar, se reia eticheta de looping.
Programul genereaza mesaj de eroare de fiecare data cand se introduce un alt caracter < 0 si > 9. De
asemenea, odata ce divizorii unui numar sunt afisati, programul intreaba utilizatorul daca doreste
afisarea divizorilor unui alt numar. Pentru activarea unei noi secvente, utilizatorul trebuie sa apese de la
tastatura tasta "Y" sau "y", ambele variante fiind acceptate in urma unei etichete de test. In caz contrar,
in urma introducerii unui alt caracter, programul isi va termina executia.
Lista a structurilor de date folosite
- Siruri de cuvinte pentru generarea mesajelor de comunicare cu utilizatorul (MSGX, MSGA, MSGW,
MSGD, MSGE, MSG3, MSGF)
- etichete pentru afisarea/calcularea unor instructiuni ( cifzeci - citire cifra zecilor, cifunit - citire cifra
unitatilor, eroare1 - afisare eroare in cazul introducerii unui caracter gresit, eroare2 - afisare eroare in
cazul introducerii unui caracter gresit, looping - eticheta in care se calculeaza divizorii numarului
introdus de utilizator, again - eticheta de interfata cu utilizatorul pentru confirmarea unei noi rulari a

programului, afisare - eticheta afisare divizor, cifra2 - afiseaza a doua cifra a divizorului in cazul unui
divizor format din 2 cifre, exit - functia de iesire din program )
- instructiuni de transfer (MOV)
- instructiuni aritmetice ( MUL - inmultirea a 2 operatori, ADD - adunarea a 2 operatori, DIV - impartirea
a 2 operatori ), instructiune aritmetica de incrementare a unui operand ( INC )
- instructiuni de salt conditionat - JE (rezultat 0 la operatia anterioara), JNL ( in caz de mai mare la
comparatia anterioara) .
- instructiuni de test ( CMP - compara 2 valori )
- instructiuni de conversie a unui caracter din ascii in decimal ( SUB )
- registre de memorie in care s-au retinut diverite variabile ( CH, DL, BL, CL)

Listingul Codului :
;Matea Nicu Cristian 25/04/2013
;423D
; Colocviu AMP

data segment
MSGX DB 13,10,"Matea Nicu Cristian 423D COLOCVIU AMP 25/04/2013","$"
MSGA DB 13,10,"Introduceti CIFRA ZECILOR : ","$"
MSGW DB 13,10,"Introduceti CIFRA UNITATILOR : ","$"
MSGD DB 13,10,"Divizorul este : ","$"
MSGE DB 13,10,"!!! Eroare !!! Nu s-a introdus un numar intre 0 si 9 ","$"
MSG3 DB 13,10, "Doriti sa incercati si cu alt numar? ", "$"
MSGF DB 13,10,"--- SFARSIT PROGRAM --- ","$"

CAT db ? ; double byte unknow `?`
REST db ?
divizor db ?

data ends
assume cs:cod, ds:data
;INTRODUCERE IN PROGRAM
cod segment
start: ;eticheta de inceput a programului


mov ax,data
mov ds,ax
LEA DX, MSGX ;preia adresa efectiva
MOV AH, 09h ;afiseaza MSGX
INT 21h

; ---------- citirea numarului de 2 cifre ----------------
;citire cifra zecilor

cifzeci:

LEA DX, MSGA ;preia adresa efectiva
MOV AH, 09h ;afiseaza MSGA - "Introduceti cifra zecilor"
INT 21h

MOV AH, 1 ; citeste numarul cu ecou - il salveaza in AL
INT 21H

CMP AL, 3AH ;caracter <= '9' ?
JNL eroare1 ;salt la eticheta in caz de mai mare sau egal la comparatia anterioara

SUB AL, 30h ;CONVERSIE ASCII - DECIMAL

MOV AH, 0H
MOV DL, 0AH ; PUNE IN REGISTRUL DL VALOAREA 10
MUL DL ; INMULTESTE REGISTRUL AL(prima valoare introdusa) CU 10

MOV CH,AL ; SALVEAZA VALOARE IN CH

cifunit:

LEA DX, MSGW ;preia adresa efectiva
MOV AH, 09h ;afiseaza MSGW -"Introduceti cifra unitatilor"
INT 21h

MOV AH, 01 ; citeste numarul cu ecou - il salveaza in AL
INT 21H

CMP AL, 3AH ;caracter <= '9' ?
JNL eroare2 ;salt la eticheta in caz de mai mare sau egal la comparatia anterioara

SUB AL, 30h ;CONVERSIE VAL2 CITITA DIN ASCII IN DECIMAL


ADD CH,AL ;adauga valoarea 2 peste valoarea 1
MOV AL,CH ;valoarea finala hexa in AL

;==============================================================================

MOV BL, AL ; bl=al bl ia valoarea citita
MOV CL, 0000H ;---> initial impartitorul CL=0

;------------------------------------------------------------------------------

looping:

INC CL ;incrementam CL cu o valoare cl++
;urmeaza
MOV AH,0 ; pregatim AH =0
MOV AL, BL
DIV CL ; punem catul in AL si restul in AH

CMP AH, 0H
JE afisare ; daca REST=0 sari la afisare

CMP CL, BL ; compara impartitorul cu numarul de impartit, daca nu e 0 sari iar
JNE looping ; reia eticheta de looping in caz de inegalitate la comparatia anterioara



; afisare incheiere program ;

LEA DX, MSGF ;preia adresa efectiva - load effective address
MOV AH, 09h ;afiseaza MSGF
INT 21h

exit:

mov ah, 04Ch ; functie DOS - exit program
mov al, 0
int 21h ; apeleaza DOS, sfarsit de program

eroare1:

LEA DX, MSGE ;preia adresa efectiva - load effective address

MOV AH, 09h
INT 21h ;afiseaza MSGE - "Eroare, se cere introducerea unui numar intre 0 si 9"
JMP cifzeci ;sari la eticheta cifzeci

eroare2:

LEA DX, MSGE ;preia adresa efectiva - load effective address
MOV AH, 09h
INT 21h ;afiseaza MSGE - "Eroare, se cere introducerea unui numar intre 0 si 9"
JMP cifunit ;sari la eticheta cifunit

again:

LEA DX, MSG3 ; muta MSG3 in registrul de afisaj
MOV AH, 09H ; activeaza functia sirului de afisat
INT 21H ; afiseaza "Doriti sa incercati si cu un alt numar?"
MOV AH, 01H ; Functia de introducere caracter de la tastatura
INT 21H ; introduce caracterul pe care il copiaza in AL
CMP AL, 59h ; compara input-ul introdus in cod ascii cu "Y"
JE cifzeci ; daca input-ul e egal cu Y sari la cifzeci
JL exit ; daca input-ul nu e Y, sari la exit
CMP AL, 79h ; compara input-ul ascii cu 'y'
JE cifzeci ; daca inputul e egal cu "y" sari la cifzeci
JNE exit ; daca input-ul nu e y, sari la exit

afisare:

LEA DX, MSGD ; muta MSGD in registrul de afisaj
MOV AH, 09H
INT 21H ; afiseaza " Divizorul este: "

MOV AL, CL ; muta cat-ul in AL
MOV AH, 0H
MOV CH, 0AH
DIV CH ; imparte catul la 10
ADD AH, 30H ; conversie din ASCII a restului
ADD AL, 30H ; conversie din ASCII a cat-ului

MOV DL, AL
MOV DH, AH
CMP DL, 30H
JE cifra2 ; sari la cifra 2

MOV AH, 02H
INT 21H ; afiseaza prima cifra a divizorului

cifra2:

MOV DL, DH
MOV AH, 2H
INT 21H ; afiseaza a doua cifra a divizorului

CMP CL,BL ;---> compara impartitorul cu numarul de impartit,daca nu e 0 sari iar
JNE looping ; sari la eticheta de looping

JMP again ; sari la eticheta again(din nou)- se reia o secventa de introducere cifre si calcul
divizor


cod ends
end start

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