Sunteți pe pagina 1din 17

Centrul de Excelență în Informatică și Tehnologii Informaționale

Ministerul educației,culturii și cercetării al Republicii Moldova

Lucrarea Individuala nr.1-2


La discicplina:Limbajt de asamblare

Grupa:K1641
Realizat de: Doscoci I.
Verificat de: Butnaru M.

Chisinau 2020
Cuprins
I1 : Lucru individual nr.1
1. Fisiere executabile. Introducerea si afisarea unui character………..3
2. Instructiuni de comparare si de salt…………………………………………….6
3. Macrourile…………………………………………………………………………………..8

I2 : Lucru individual nr.2


1. Instructiuni aritmetice………………………………………………………………..10
A…………………………………………………………………………………………………10
B………………………………………………………………………………………………...11
2. Cicluri Proceduri………………………………………………………………………….16

2
Tema: Fisiere executabile. Introducerea si afisarea unui caracter
a)
5. Este definit sirul s1. Sa se scrie un program asembler ,ce introduce de la
tastatura
caracterele a1,a2,a3, sirurile s2,s3 si afiseaza concatenarea elementelor introduse
in modul
urmator:
Introduceti sirul s2:
S2
Introduceti caracterul a1:
A1
Introduceti caracterul a2:
A2
Introduceti caracterul a3:
A3
Introduceti sirul s3:
S3
Rezultatul obtinut:
S1a1bba3a2bbs2bbs3 (b spatiu liber)
.model small
.stack
.data
a1 db ?
a2 db ?
a3 db ?
s2 db 50 dup(' '),'$'
s3 db 50 dup(' '),'$'
m1 db 'introduceti sirul s2:',10,13,'$'
m2 db 10,13,'introduceti caracterul a1:',10,13,'$'
m3 db 10,13,'introduceti caracterul a2:',10,13,'$'
m4 db 10,13,'introduceti caracterul a3:',10,13,'$'
m5 db 10,13,'introduceti sirul s3:',10,13,'$'
m6 db 10,13,'rezultatul este:',10,13,'$'
s1 db 'asd','$'
.code
mov ax,@data
mov ds,ax

3
mov ah,09h
lea dx,m1
int 21h
mov ah,03fh
mov bx,0
lea dx,s2
int 21h
sub al,2
mov ah,0
mov si,ax
mov s2[si],'$'
mov ah,09h
lea dx,m2
int 21h
mov ah,1
int 21h
mov a1,al
mov ah,09h
lea dx,m3
int 21h
mov ah,1
int 21h
mov a2,al
mov ah,09h
lea dx,m4
int 21h
mov ah,1
int 21h
mov a3,al
mov ah,09h
lea dx,m5
int 21h
mov ah,03fh
mov bx,0
lea dx,s3
int 21h
sub al,2
mov ah,0
mov di,ax
mov s3[di],'$'
mov ah,09h
lea dx,m6
int 21h
mov ah,09h
lea dx,s1
int 21h
mov ah,2
mov dl,a1
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,20h
int 21h
mov ah,02h
mov dl,' '
int 21h
4
mov ah,2
mov dl,a3
int 21h
mov ah,2
mov dl,a2
int 21h
mov ah,2
mov dl,a2
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,09h
lea dx,s2
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,09h
lea dx,s3
int 21h
mov ah,4ch
int 21h
end

5
Tema: Instructiuni de comparare si de salt
Sarcini de lucru:
b)
5. Sa se scrie un program , care verifica daca caracterul introdus de la tastatura
este o litera
minuscula,atunci sa se afiseze echivalentul lui majuscul, in caz contrar sa se
afiseze mesajul
,,Eroare. Caracterul introdus nu este o litera minuscula’’.
De exemplu:
Introduceti un caracter : r
R
Sau Introduceti u caracter: 6
Eroare. Caracterul introdus nu este o litera minuscula.

.model small
.stack
.data
m db 10,13,'Introduceti un caracter: ',10,13,'$'
m2 db 10,13,'$'
m1 db 10,13,'Eroare.Caracterul introdus nu este o litera
minuscula',10,13,'$'
s db ?
.code
mov ax,@data ;initializarea registrului ds
mov ds,ax
inceput:

mov ah,9 ;afisarea primului mesaj


lea dx,m
int 21h

mov ah,1 ;introducerea simbolului


int 21h ;in al codul simbolului introdus
mov s,al
cmp al,20h
je en

cmp al,'a' ; Introducerea instructiunii de comparare


care consta in executia unei
jb e3 ; scaderi temporare fara a se modifica vre-un
operant
6
cmp al,'z'
ja e3
mov cl,al
mov ah,9 ;afisarea mesajului al doilea
lea dx,m2
int 21h

mov al,cl
sub al,20h ;operatia de adunare
mov ah,2 ;afisarea la consola a simbolului introdus
mov dl,al
int 21h

jmp inceput ;instructiune de salt. eticheta specifica


adresa de salt
e3:
mov ah,9 ; in cazul indeplinirii conditiei e3 afisam
mesajul m1
lea dx,m1
int 21h

jmp inceput ; adresa de salt

en:
mov ah,4ch ;sfirsitul programului
int 21h
end

7
Tema: Macrourile
Sarcini de lucru:
c)
Modificati un program in care sa utilizati macrodefinitii
.model small
afisare macro n,p
mov ah,n
lea dx,p
int 21h
endm
.stack
.data
a1 db ?
a2 db ?
a3 db ?
s2 db 50 dup(' '),'$'
s3 db 50 dup(' '),'$'
m1 db 'introduceti sirul s2:',10,13,'$'
m2 db 10,13,'introduceti caracterul a1:',10,13,'$'
m3 db 10,13,'introduceti caracterul a2:',10,13,'$'
m4 db 10,13,'introduceti caracterul a3:',10,13,'$'
m5 db 10,13,'introduceti sirul s3:',10,13,'$'
m6 db 10,13,'rezultatul este:',10,13,'$'
s1 db 'asd','$'
.code
mov ax,@data
mov ds,ax
afisare 09h,m1
mov ah,03fh
mov bx,0
lea dx,s2
int 21h
sub al,2
mov ah,0
mov si,ax
mov s2[si],'$'
afisare 09h,m2
mov ah,1
int 21h
mov a1,al
afisare 09h,m3
mov ah,1
int 21h
mov a2,al
afisare 09h,m4
mov ah,1
int 21h
mov a3,al
afisare 09h,m5
8
mov ah,03fh
mov bx,0
lea dx,s3
int 21h
sub al,2
mov ah,0
mov di,ax
mov s3[di],'$'
afisare 09h,m6
mov ah,09h
lea dx,s1
int 21h
mov ah,2
mov dl,a1
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,20h
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,2
mov dl,a3
int 21h
mov ah,2
mov dl,a2
int 21h
mov ah,2
mov dl,a2
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,09h
lea dx,s2
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,' '
int 21h
mov ah,09h
lea dx,s3
int 21h
mov ah,4ch
int 21h
end

9
Tema: Instructiuni aritmetice
Sarcini de lucru:
a) Calcularea valorii unei expresii, terminii careia sunt numere fara semn definite
in
program:
5. (21+7)/14-4*5

model small
.stack
.data
a db 21
b db 7
c db 14
d db 4
e db 5
mess1 db " (21+7)/14-4*5=",'$'
s db 6 dup(" "),'$'
.code
mov ax,@data
mov ds,ax
mov ah,09h ; afisarea mess1
lea dx,mess1
int 21h
;-calc. val. expres------------------
mov al,a ; al=21
add al,b ; al=21+7
mov ah,0
div c ; al=(21+7)/14
mov bx,ax ; bx=(21+7)/14
mov al,d ; al=4
mul e ; al=4*5
sub bx,ax ; bx=(21+7)/14-4*5
mov ax,bx ; ax=(21+7)/14-4*5
;-conveertirea nr. intr-un sir de caract.
push ax ; pastrarea valorii initiale a reg ax
mov si,10 ; nr. se va imparti consecutiv la 10
mov di, 2 ; pozitionare pe ultima pozitie a sirului in care va fi pus
rezultatul
mov dx,0
cmp ax,0
jge m
neg ax
m:
div si
add dl,30h
mov s[di],dl

10
xor dx,dx
dec di
cmp ax,0
jne m
pop ax
cmp ax,0
jge m1
mov s[di], "-"
m1:
mov ah,9
lea dx,s
int 21h
mov ah,4ch
int 21h
end

b) Calcularea valorii unei expresii, termenii careia sunt numere cu semn introduse
de la tastatura:
5. 10*a/(a+b)+10*b/(c+d) a,b,c – db d – dw

.model small
.stack
.data
q db 10
varA dw 0
varB dw 0
varC dw 0
varD dw 0
mult10 dw 1 ;puterile lui 10
ten dw 10
sir db 8 dup (?) ;sirul initial
s db 6 dup (' '),"$"
.code
11
mov ax,@data
mov ds,ax

mov ah, 3fh ;introducerea numarului ca un sir de


caractere
mov bx, 0
lea dx, sir
int 21h ;ax contine numarul caracterelor
;introduse +2(enter)
mov di,ax ;se salveaza ax in di
sub di, 3 ;di-indicele ultimei cifre
cmp di, 0 ;verifica daca a fost introdus un caracter
je bA ;salt la eticheta bA pentru a afisa numarul
introdus
aA:
mov al,sir[di] ;se pune elementul in al
sub al, 30h ;se transforma caracterul in numar (o cifra)
mov ah,0
mul mult10 ;se inmulteste numarul obtinut cu 10^i
dec di ;se deplaseaza indicele cu o pozitie la
stinga
add varA, ax ;varA=c0*10^0+c1*10^1+...
mov ax, ten ;in ax valoarea 10
mul mult10 ;mult10=mult10*10 obtinem 10^i
mov mult10,ax
cmp di,0 ;se verifica daca au fost convertite toate
caracterele
jne aA ;inafara de primul care poate fi semnul
numarului
cmp sir[di],'-' ;se compara primul caracter al sirului cu
semnul '-'
je mA1 ;daca e '-' salt la m1, adica numarul este
negativ
bA:
mov al,sir[di] ;se transforma ultimul element din sir
sub al,30h
mov ah,0
mul mult10
add varA,ax ;in locatia de memorie varA-numarul pozitiv
introdus
jmp intb
mA1: neg varA ;in locatia de memorie varA-numarul negativ
introdus
intb:mov mult10, 1
mov ah, 3fh
mov bx, 0
lea dx, sir
int 21h

mov di, ax
sub di, 3
cmp di,0
je bB

aB:
mov al, sir[di]
sub al,30h
mov ah,0
12
mul mult10
dec di
add varB, ax
mov ax, ten
mul mult10
mov mult10,ax
cmp di, 0

jne aB

cmp sir[di],'-'

je mB1

bB:
mov al, sir[di]
sub al,30h
mov ah, 0
mul mult10
add varB, ax
jmp intc
mB1:
neg varB

intc:
mov mult10, 1

mov ah, 3fh


mov bx, 0
lea dx, sir
int 21h

mov di, ax
sub di, 3
cmp di,0
je bC

aC:
mov al, sir[di]

sub al,30h
mov ah,0
mul mult10
dec di
add varC, ax
mov ax, ten
mul mult10
mov mult10, ax
cmp di, 0

jne aC

cmp sir[di],'-'

je mC1

bC:
mov al, sir[di]
13
sub al,30h
mov ah, 0
mul mult10
add varC,ax
jmp intd
mC1:
neg varC

intd:
mov mult10, 1

mov ah, 3fh


mov bx, 0
lea dx, sir
int 21h

mov di, ax
sub di, 3
cmp di,0
je bD

aD:
mov al, sir[di]
sub al,30h
mov ah,0
mul mult10
dec di
add varD, ax
mov ax, ten
mul mult10
mov mult10, ax
cmp di, 0

jne aD

cmp sir[di],'-'
je mD1

bD:
mov al, sir[di]
sub al,30h
mov ah, 0
mul mult10
add varD, ax
jmp m2
mD1:
neg varD

m2:
;10*a/(a+b)+10*b/(c+d)
mov bx,varA ;bx=a
add bx,varB ;bx=a+b
mov ax,varA ;ax=a
mul q ;10*a
mov dx,0 ;dx=0
div bx ;ax=10*a/(a+b)
mov di,ax ;di=ax

14
mov cx,varC ;cx=c
add cx,varD ;cx=c+d
mov ax,varB ;ax=b
mul q ;10*b
mov dx,0 ;dx=0
div cx ;ax=10*b/(c+d)
add ax,di ;ax+di=10*a/(a+b)+10*b/(c+d)

push ax ;pastrarea valorii initialr a registrului ax


mov si, 10 ;numarul se va imparti consecutiv la 10
mov di,5 ;pozitionarea pe ultima pozitie a sirului in care va
fi pus rezultatul
mov dx,0 ;dx=0 deoarece dx:ax/si
cmp ax,0 ;verificam semnul numarului

jge m ;salt la m daca numarul este pozitiv


neg ax ;daca numarul e negativ se ia valoarea absoluta
m:div si ;dx:ax/10,restul se afla in registrul dl
add dl, 30h ;numarul obtinut se transforma in caracter(o cifra)
mov s[di], dl
xor dx,dx
dec di
cmp ax,0
jne m
pop ax
cmp ax,0
jge m1
mov s[di],"-"
m1: mov ah,9
lea dx, s
int 21h
mov ah,4ch
int 21h
end

15
Tema: Cicluri Proceduri
Sarcini de lucru:
c)

5. 𝑦 = ∑20
𝑖=0 𝑖/2

.model small
.stack
.data
a db 2
s db 6 dup (" "),"$"
.code
mov ax, @data
mov ds, ax
mov bx, 0 ;bx=0
mov dx, 0 ;dx=0
mov cx, 21 ;cx=21
a1:
;0/2+1/2+2/2+3/2+4/2+5/2+6/2+7/2+82+9/2+10/2+11/2+12/2+13/2+14/2+15/2+
16/2+17/2+18/2+19/2+20/2
mov ax, bx ;ax=bx
div a ;
mov ah, 0 ;ah=0
add dx,ax ;dx=ax

inc bx ;bx+1
loop a1 ;daca ciclul nu este finalizat salt la eticheta a1

mov ax, dx ;ax=dx


push ax ;punem in stiva ax
mov si, 10 ;si=10
mov di, 5 ;di=5

mov dx,0 ;dx=o


cmp ax,0 ;comparam ax cu 0
jge m ;>=
neg ax ;negam ax

m:div si ;dx:ax/10,restul impartirii se afla im dl


add dl, 30h ;numarul obtinut se transforma in caracter
mov s[di], dl
xor dx,dx

16
dec di
cmp ax,0
jne m
pop ax
cmp ax, 0
jge sfirsit
mov s[di], "-"
Sfirsit: mov ah, 9
lea dx,s
int 21h

mov ah, 4ch


int 21h
end

Concluzie: In concluzie lucrul in assembler este destul de usor este nevoie doar sa
fii un pic atent (activ) in timpul orelor sa depui un pic de efort si se va primi tot

17

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