Sunteți pe pagina 1din 17

Universitatea de Stat din Moldova

Facultatea de Matematic i Informatic


Departamentul Informatica Aplicat

Lucru individual
la disciplina Limbaje de asamblare

Conductor tiinific: Butnaru Mariana


Autorul : Jura Mihaela, IA-12

Chiinu - 2016
Laboratorul 3
S se ntroduc un ir cu lungimea de 10 caractere. S se copieze din irul s1 n irul s2 caracterele de pe
poziiile 2,4 i 6. S se afiseze la consol ambele iruri

.model small ;directiva de declarare a modelului


.stack ;initializarea segmentului de stiv
.data ;intializarea segmentului de date
maxlength db 20 ;lungimea maxima a sirului introdus, cu tot cu $
currentlength db ? ;numrul caracterelor introduse fr codul Enter
sir1 db 11 dup(?) ;buffer-ul n care vorfi amplasate datele introduse
m1 db "introduceti un sir:",10,13, '$'
m2 db 10,13, 'raspunsul este:',10,13, '$'

.code
start:
mov ax, @data ;initializarea registrului de segment ds
mov ds, ax

mov ah, 9 ;afisarea mesajului 1


lea dx, m1
int 21h

mov ah,0AH ;nr. Funiei se ncarc in ah


lea dx, maxlength ;n dx se ncarc adresa de nceput
int 21H
mov bl, currentlength ;plasarea in bx numrul caracterelor introduse
mov bh,0
mov sir1[bx], '$' ;plasarea caracterului $ la sfirsitul sirului sir1

mov ah, 9 ;afisarea mesajului 2


lea dx, m2
int 21h

mov ah, 02h ;copierea caracterului 2 in celalalt sir pe pozitia 0


mov dl, sir1[2]
int 21h

mov ah, 02h ;copierea caracterului 4 in celalalt sir pe pozitia 1


mov dl, sir1[4]
int 21h

mov ah, 02h ;copierea caracterului 2 in celalalt sir pe pozitia 2


mov dl, sir1[6]
int 21h

mov ah, 4ch ;apel de ieire


int 21h
end start
Laboratorul 4
S se scrie un program conform variantei din lucrarea nr.3. Introducerea i afiarea vor fi realuzate
folsind funciile 3fh i 40h respectiv. Caracterele vor fi copiate prin intermediul stivei utiliznd instruciunile
push i pop.

.model small ;directiva de declarare a modelului


.stack 100h ;initializarea segmentului de stiv
.data ;initializarea segmentului de date
s db 100 dup(?) ;buffer-ul n care vorfi amplasate datele introduse
sir db 10,13,'$' ;irul folosit pentru trecerea n rnd nou
.code
start:
mov ax,@data ;initializarea registrului de segment ds
mov ds,ax
xor ax,ax

mov ah,3fh ;numrul funciei in registrul ah


lea dx,s ;adresa buffer-ului se pune n registrul dx
mov bx,0 ;n bx-descriptorul fluxului de intrare
mov cx,100 ;numarul caracterelor introduse
int 21h ;apel de ntrerupere

sub al,2 ;scadem din al 2


mov ah,0
mov si,ax

mov ah,40h ;numarul funciei n registrul ah


mov dx, offset s ;adresa buffer-ului n registrul dx
mov bx,1 ;n bx descriptorul fluxului de ieire
mov cx, si ;n cx numrul caracterelor ce trebuie afiate
int 21h ;apel de ntrerupere

mov ah,09h ;new line


lea dx, sir
int 21h

push word ptr s[2] ;trasfer n vrful stivei cifra de pe poziia 2


pop word ptr sir[0] ;copie valoare din vrful stivei n sir pe poziia 0

push word ptr s[4] ;trasfer n vrful stivei cifra de pe poziia 4


pop word ptr sir[1] ;copie valoare din vrful stivei n sir pe poziia 1

push word ptr s[6] ;trasfer n vrful stivei cifra de pe poziia 6


pop word ptr sir[2] ;copie valoare din vrful stivei n sir pe poziia 2

mov ah, 40h ;numarul funciei n registrul ah


mov dx, offset sir ;adresa buffer-ului n registrul dx
mov cx, 3 ; n cx numrul caracterelor ce trebuie afiate
int 21h ;apel de ntrerupere

mov ah,4ch ;funcia de ntrerupere


int 21h
end start
Laboratorul 5
Este definit irul s1. S se scrie un program assembler,ce introduce de la tastatur caracterele a1,a2 irul s2 i
afieaz concatenarea elementelor introduse n modul urmtor:
Introducei irul s2:
S2
Introducei caracterul a1:
A1
Introducei caracterul a2:
A2
Rezulattul obinut:
S1a1bba2bbs2(b spaiu liber)

.model tiny ;directiva de declarare a modelului


.code
org 100h
start:
jmp main
s1 db "Matematica"
s2 db "Introduceti sirul s2:", "$"
s22 db 20 dup (?) ;definirea locatiei de memorie cu valoare neinitializata
s3 db "Introduceti caracterul a1:","$"
s33 db ? ;definirea locatiei de memorie cu valoare neinitializata
s4 db "Introduceti caracterul a2:", "$"
s44 db ? ;definirea locatiei de memorie cu valoare neinitializata
s5 db "Rezultatul obtinut:", "$"
s55 db 20 dup (?),'$'
nl db 10,13, "$"
main:

mov ax, @data ;valoarea registrului ax se incarca in registrul @data


mov ds, ax ;initializarea adressei registrului de segment ds

mov ah,40h ;afiseaza sirul s3


lea dx,s3
mov bx,1
mov cx, 26
int 21h

mov ah, 40h ;new line


lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah, 1 ;introduce de la tastatura caracterul a1


int 21h
mov s33, al

mov ah, 40h ;new line


lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah,40h ;afiseaza sirul s4


lea dx, s4
mov bx,1
mov cx, 26
int 21h
mov ah, 40h ;new line
lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah, 1 ;introduce de la tastatura caracterul a2


int 21h
mov s44, al
sub ax,2
mov si, ax

mov ah, 40h ;new line


lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah,40h ;afiseaza sirul s2


lea dx,s2
mov bx,1
mov cx,21
int 21h

mov ah, 40h ;new line


lea dx, nl
mov bx,1
mov cx, 2
int 21h
mov ah,3fh ;introduce de la tastatura sirul s22
lea dx, s22
mov bx,0
mov cx,50
int 21h

sub ax,2
mov ah, 0 ;scade din lungimea sirului introdus 2 unitati (10,13)
mov si, ax
mov ah, 40h ;new line
lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah,40h ;afiseaza sirul s5


mov bx,1
lea dx,s5
mov cx, 19
int 21h

mov ah, 40h ;new line


lea dx, nl
mov bx,1
mov cx, 2
int 21h

mov ah, 40h ; afiseaza sirul s1


lea dx, s1
mov bx,1
mov cx,10
int 21h

mov ah, 40h ;afiseaza caracterul a1


lea dx, s33
mov bx,1
mov cx,1
int 21h

mov ah,2 ;spatiu


mov dl, 20h
int 21h

mov ah,2 ;spatiu


mov dl, 20h
int 21h

mov ah, 40h ;afiseaza caracterul a2


lea dx, s44
mov bx,1
mov cx,1
int 21h

mov ah,2 ;spatiu


mov dl, 20h
int 21h

mov ah,2 ;spatiu


mov dl, 20h
int 21h

mov ah, 40h ;afiseaza sirul s2


lea dx, s22
mov bx,1
mov cx,11
int 21h

mov ah, 4ch ;apel de intrerupere


int 21h
end start
end
Laboratorul 6
S se scrie un program care verific daca caracterul introdus de la tastatur este o
liter majuscul, atunci s se afieze echivalentul lui minuscul,n caz contrar s se
afiseze mesajul eroare.

.model small ;directiva de declarare a modelului


.stack 100 ;initalizarea segmetului de stiva
.data ;initializarea segmentului de date
s1 db 10,13, "introduceti caracterul:",10,13, '$'
s2 db 10,13, "eroare",10,13, '$'
s3 db 10,13, "$"
var db (?)
.code ;initializarea segmetului de cod
start:

mov ax, @data ;valoarea registrului ax se incarca in registrul


mov ds, ax ;@data
xor ax, ax
M:
mov ah, 9 ;afiseaza s1
lea dx, s1
int 21h

mov ah, 1 ; introducerea caracterului de la tastatura


int 21h
mov var, al ; in var caracterul introdus

mov ah, 9 ;afiseaza s3


lea dx, s3
int 21h

cmp var,' ' ;compara daca var = cu spatiu


je exit ;merge la eticheta exit
cmp var,41H ;compara var cu 41H
jb m2 ;daca e mai mic merge la eticheta m2
cmp var,5AH ;compara var cu 5AH
ja m2 ;daca e mai mare merge la eticheta m2

m1:
add var, 20h
mov ah, 2 ;afiseaza pe ecran
mov dl, var
int 21h
jmp M

m2:
mov ah, 9 ;afiseaza s2
lea dx, s2
int 21h
jmp M

exit:
mov ah,4ch ;funcia de ieire
int 21h
end start

Laboratorul 7
a) Calcularea valorii unei expresii, terminii creia sunt numere fr semn
definite n program:
1.(170-16)/2+12*5
.model small ;directiva de declarare a modelului
.stack 100 ;initalizarea segmentului de stiva
.data ;iniializarea segmentului de date
a db 170
b db 16
c db 2
d db 12
e db 5
.code ;iniializarea segmentului de cod
start:
mov ax, @data ;iniializarea registrului ds
mov ds, ax

mov al, a ; al= 170


sub al, b ; al= 170-16
mov ah, 0
div c ; al=(170-16)/2
mov bl, al ; bl=(170-16)/2
mov al, d ; al=12
mov ah, 0
mul e ; al= 12*5
add bl, al ; bl=(170-16)/2+12*5

mov bh, 0
mov ax, bx
mov bl, 10 ; bl= 10
div bl ; al=13 ah=7
mov bh, ah ; bh=7

mov ah, 0
div bl ; al=1 ah=3
mov bl, ah

mov ah,2 ;afiseaza1


mov dl, al
add dl, 30h
int 21h

mov ah,2 ;afiseaza3


mov dl, bl
add dl, 30h
int 21h

mov ah, 2 ; afiseaza 7


mov dl, bh
add dl, 30h
int 21h

mov ah,4ch ;funcia de ieire


int 21h
end start

b)Calcularea valorii uneiexpresii, termenii creia sunt numere cu semn introduse


de la tastatur.
.model small ;directiva de declarare a modelului
.stack ;initializarea segmntului de stiva
.data ;initializarea segmentului de date
a dw ?
b dw ?
c dw ?
d dw ?
mult10 dw 1 ;puterile lui 10
ten dw 10
sir db 8 dup(?)
s db 6 dup(" "),"$" ;sirul initial
n dw 0 ;locatie de memorie in care va fi pastrat numarul
mesa db "a = ",'$'
mesb db 10,13,"b = ",'$'
mesc db 10,13,"c = ",'$'
mesd db 10,13,"d = ",'$'
.code ;initalizarea segmentului de cod
start:
main:
mov ax, @data ;definirea segmentului de cod
mov ds, ax

mov ah, 9 ;afisarea mesa


lea dx, mesa
int 21h

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


mov bx, 0
lea dx, sir
int 21h ;ax contine numarul caracterelor +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 carcter
je a2 ;salt la eticheta a2

a1:
mov al, sir[di] ;se pune elementul in al
sub al, 30h ;se transforma caracterul in numar
mov ah, 0
mul mult10 ;se inmulteste numarul obtinut cu 10^i
dec di ;se deplaseaza indicele cu o pozitie la stinga
add n, ax
mov ax, ten ; in ax valoarea 10
mul mult10
mov mult10,ax
cmp di, 0 ;se verifica daca au fost convertite toate caracterele
;inafara de primul care poate fi semnul
jne a1

cmp sir[di], '-' ;se compara primul caracter al sirului cu semnul -


je m1 ;daca e -salt la m1
a2:
mov al, sir[di] ;setransforma ultimul element din sir
sub al, 30h
mov ah, 0
mul mult10
add n, ax ;in locatia de memorie n- numarul pozitiv introdus

jmp m2
m1: neg n ;in locatia de memorie n- numarul negativ introdus
m2:
mov ax, n
mov a, ax

mov ah, 9 ;Citirea numarului 2


lea dx, mesb
int 21h

mov n, 0
mov mult10, 1

mov ah, 3fh


mov bx, 0
lea dx, sir
int 21h
mov di, ax
sub di, 3
cmp di, 0
je a5

a4:
mov al, sir[di]

sub al, 30h


mov ah, 0
mul mult10
dec di
add n, ax
mov ax, ten
mul mult10
mov mult10,ax
cmp di, 0

jne a4

cmp sir[di], '-'


je mmm1
a5:
mov al, sir[di]
sub al, 30h
mov ah, 0
mul mult10
add n, ax

jmp mm2
mmm1: neg n
mm2:
mov ax, n
mov b, ax

mov ah, 9 ;Citirea numarului 3


lea dx, mesc
int 21h

mov n, 0
mov mult10, 1

mov ah, 3fh


mov bx, 0
lea dx, sir
int 21h

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

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

jne a6

cmp sir[di], '-'


je mmmb1
a7:
mov al, sir[di]
sub al, 30h
mov ah, 0
mul mult10
add n, ax

jmp mmb2
mmmb1: neg n
mmb2:
mov ax, n
mov c, ax

mov ah, 9 ;Citirea numarului 4


lea dx, mesd
int 21h

mov n, 0
mov mult10, 1

mov ah, 3fh


mov bx, 0
lea dx, sir
int 21h

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

a8:
mov al, sir[di]

sub al, 30h


mov ah, 0
mul mult10
dec di
add n, ax
mov ax, ten
mul mult10
mov mult10,ax
cmp di, 0
jne a8

cmp sir[di], '-'


je mmmd1
a9:
mov al, sir[di]
sub al, 30h
mov ah, 0
mul mult10
add n, ax

jmp mmd2
mmmd1: neg n
mmd2:
mov ax, n
mov d, ax

mov ax, a ;efectuarea calculelor


add ax, b
add ax, c
idiv a
cbw
imul d

push ax ;afisarea numarului


mov si, 10
mov di, 5

mov dx, 0
cmp ax, 0
jge m
neg ax

m:
div si
add dl, 30h
mov s[di], dl
xor dx, dx
dec di
cmp ax, 0

jne m

pop ax

cmp ax, 0
jge mm1
mov s[di],"-"

mm1:
mov ah, 9
lea dx, s
int 21h
mov ah, 4ch ;functia de iesire
int 21h
end main

Laboratorul 8
S se scrie un program ce calculeaz valoarea urmtoarei expresii folosind
proceduri:
15
Y= i * 6
i 1

.model small ;directiva de declarare a modelului


.stack 100 ;initializarea segmentului de stiva
.data ;initializarea segmentului de date
s db 10 dup (' '), "$"
.code ;initializarea segmentului de cod
start:
mov ax, @data ;adresa segmentului in care sunt definite datele
mov ds, ax

;CALCULEAZA SUMA
mov cx, 15 ; numarul iteratiilor (15-1+1)
mov ax, 0 ;acumulator pentru rezultat
mov bx, 1 ;valoarea intiala i=1
m: add ax, bx
inc bx ;incrementarea i
loop m
mov di, 6
mul di ;suma*6

;afisarea numarului
push ax
mov si, 10
mov di, 5

mov dx, 0
cmp ax, 0
jge mm
neg ax

mm:
div si
add dl, 30h
mov s[di], dl
xor dx, dx
dec di
cmp ax, 0

jne mm

pop ax

cmp ax, 0
jge mm1
mov s[di],"-"

mm1:
mov ah, 9
lea dx, s
int 21h

mov ah,4ch ;functia de iesire


int 21h
end start
Laboratorul 10
Calcularea sumei de pe intervalul [-3...7]
.model small
.data ;initializarea segmentului de date
m11 db 5, 11, -2, -1, 4, 14, 3, 6, 15, -8 , 6, -5, 4, 13, 7
m12 db 'Rezultatul este:$'
s db 6 dup (' '),"$"

.code ;initializarea segmentului de cod


start:
mov ax,@data ;adresa segmentului in care sunt definite
mov ds,ax ;datele
mov cx,15 ;numarul iteratiilor in cx
mov si,0 ;indicele elementului initial in si
mov bx,0
s1: cmp m11[si], -3 ;se compara cu -3
jl urm ;daca mai mic salt la urm
cmp m11[si], 7 ;se compara cu 7
jg urm ;daca e mai mare salt la urm
add bl, m11[si]
urm: inc si ;incrimenteaza si
loop s1 ;cicleaza s1

mov bh, 0
mov ax, bx

push ax ;virful stivei=ax


mov si,10
mov di,5
mov dx,0
cmp ax,0 ;se compara ax cu 0
jge m ;daca e => salt la eticheta m
neg ax
m:div si
add dl, 30h
mov s[di],dl
xor dx,dx ;golirea registrului dx
dec di
cmp ax,0 ;se compara ax cu 0
jne m ; daca nu este = salt la m
pop ax ;in ax se copie virful stivei
cmp ax,0
jge m1
mov s[di], "-"

m1:
mov ah,9 ;se afiseaza m12
lea dx,m12
int 21h

mov ah,9 ;se afiseaza s


lea dx,s
int 21h

mov ah, 4ch ;functia de intrerupere


int 21h
end start

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