Asamblare Probleme
Asamblare Probleme
(2 la puterea n)
2 ^n ={ 1 , n=0
{ 2 *2 ^( n-1) , n>0
.model small
.stack
sablon struc
_bp dw ?
_cs_ip dw ?
_n dw ?
sablon ends
.data
n dw 7
rez dd ?
.code
putere proc near
push bp ;salvare bp
mov bp, sp ;initializare cu varful stivei
pushf ;salvare indicatori
push bx
mov bx, word ptr [bp]._n ; preluc. param.
cmp bx, 0 ;conditia de oprire
jne rec
mov ax, 1 ;0!=1
mov dx, 0
jmp stop
rec:dec bx ;termenul urmator
push bx ;transferul parametrului
call near ptr putere ; rez in DX:AX
add sp, 2
mul word ptr [bp]._2
stop:pop bx ;refacerea registrului bx
popf ;refacere indicatori
pop bp
retn
putere endp
afis proc near
push ax ;salvarea registrelor
push bx
push cx
push dx
mov dx, word ptr rez+2 ;preluare din rez
mov ax, word ptr rez
mov cx, 0 ;initializarea contorului
mov bx, 10
next:div bx
push dx
mov dx, 0
inc cx
cmp ax, 0
jne next
print:pop dx ;preluare din stiva
add dl, 30h ;conversie la codul ASCII
mov ah, 02h
int 21h ;afisare
loop print
pop dx ;refacerea registrelor
pop cx
pop bx
pop ax
retn
afis endp
start:
mov ax, @data
mov ds, ax
mov ax, n
push ax ;transferul parametrului prin stiva
call near ptr putere ;DX:AX<--rezultatul
add sp, 2
mov word ptr rez+2, dx
mov word ptr rez, ax
call near ptr afis ;afisarea rezultatului
mov ah, 4ch ;revenire DOS
int 21h
end start
Problema 3/ Laborator 9
(cel de-al n-lea nr Fibonacci)
fibo(n)= { 0, n=0
{ 1, n=1
{ fibo(n-1)+fibo(n-2),n>1
.model small
.stack
sablon struc
_bp dw ?
_ip dw ?
_n dw ?
sablon ends
.data
n dw 7
rez dd ?
.code
fibo proc near
push bp
mov bp,sp
pushf
push bx
mov bx,word ptr [bp]._n
cmp bx,0
jne n1
mov ax,0
jmp stop
n1: cmp bx,1
jne rec
mov ax,1
jmp stop
rec: dec bx
push bx
call near ptr fibo
add sp,2
push ax
dec bx
push bx
call near ptr fibo
add sp,2
pop bx
add ax,bx
stop: pop bx
popf
pop bp
retn
fibo endp
afis proc near
push ax ;salvarea registrelor
push bx
push cx
push dx
mov dx, word ptr rez+2
mov ax, word ptr rez
mov cx, 0
mov bx, 10
next:div bx
push dx
mov dx, 0
inc cx
cmp ax, 0
jne next
print:pop dx
add dl, 30h
mov ah, 02h
int 21h
loop print
pop dx
pop cx
pop bx
pop ax
retn
afis endp
start:
mov ax, @data
mov ds,ax
mov ax,n
push ax
call near ptr fibo
add sp,2
mov word ptr rez,ax
mov word ptr rez+2,0
call near ptr afis
mov ah,4ch
int 21h
end start
Problema 4/ Laborator 9
(combinari de n luate cate k)
Cnk = { 1, n=k
{ 1, k=0
k1
k
{ Cn 1 + Cn 1 ,in rest
.model small
.stack
sablon struc
_bp dw ?
_ip dw ?
_n dw ?
_k dw ?
sablon ends
.data
n dw 3
k dw 2
rez dw ?
.code
comb proc near
push bp
mov bp,sp
pushf
push bx
push dx
push cx
mov bx, word ptr [bp]._n
mov dx, word ptr [bp]._k
cmp bx,dx
jne k0
mov ax,1
jmp stop
k0:cmp dx,0
jne rec
mov ax,1
jmp stop
rec:dec bx
push dx
push bx
call near ptr comb
add sp,4
mov cx,ax
dec dx
push dx
push bx
call near ptr comb
add sp,4
add ax,cx
stop: pop cx
pop dx
pop bx
popf
pop bp
retn
comb endp
Problema 1/ Laborator 10
(suma cifrelor unui numar)
sumac(n)= { 0, n=0
{ n%10+sumac(n/10). n>0
MODULUL ASAMBLARE
.model small
public _sumac
.stack
sablon struc
_bp dw ?
_ip dw ?
_n dw ?
sablon ends
.code
_sumac proc near
push bp
mov bp,sp
pushf
push dx
push bx
mov ax, word ptr[bp]._n
cmp ax,0
jne rec
mov ax,0
jmp stop
rec: mov dx,0
mov bx,10
div bx
push ax
call near ptr _sumac
add sp,2
add ax,dx
stop: pop bx
pop dx
popf
pop bp
retn
_sumac endp
end
MODULUL C
#include <stdio.h>
#include<canio.h>
extern int sumac(int a)
void main (){
int n,sum;
printf(n=);
scanf(%d,&n);
sum=sumac(n);
printf(sumac=%d,sum);
getch();
}
Problema 2/Laborator 10
(cel mai mare divizor comun)
cmmdc(a,b)= { a, b=0
{ cmmdc(b,a%b), b>0
MODULUL ASAMBLARE
.model small
public _cmmdc
.stack
sablon struc
_bp dw ?
_ip dw ?
_a dw ?
_b dw ?
sablon ends
.code
_cmmdc proc near
push bp
mov bp,sp
push dx
push bx
push cx
mov bx,[bp]._a
mov dx,[bp]._b
cmp dx,0
jne rec
mov ax,bx
jmp stop
rec: mov cx,dx
mov ax,dx
mov dx,0
div cx
push dx
mov dx,[bp]._b
push cx
call near ptr _cmmdc
add sp,4
stop: pop cx
pop bx
pop dx
pop bp
retn
_cmmdc endp
end
MODULUL C
#include <stdio.h>
#include <conio.h>
extern int cmmdc(int,int);
void main(){
int a,b,rez;
printf("a=");scanf("%d",&a);
printf("b=");scanf("%d",&b);
rez=cmmdc(a,b);
printf("cmmdc=%d",rez);
getch();
}
stop: popf
pop bx
pop di
pop si
pop bp
retn
_cauta endp
Problema 3/ Laborator 10
(cautarea binara)
Cauta(s,d,val)= { 0, s>d
{ 1, a[m]=val, unde m=(s+d)/2
{ cauta(s,m-1,val), a[m]>val
{ cauta(m+1,d,val), a[m]<val
MODULUL ASAMBLARE
.model small
public _cauta
.stack
sablon struc
_bp dw ?
_cs_ip dw ?
_s dw ?
_d dw ?
_val dw ?
_tab dw ?
sablon ends
.code
_cauta proc near
push bp
mov bp,sp
push si
push di
push bx
pushf
mov si, word ptr [bp]._s
mov di, word ptr [bp]._d
cmp si,di
jle gasit
mov ax,0
jmp stop
gasit: add si,di
shr si,1
mov bx,word ptr [bp]._tab
mov bx,bx[si]
cmp bx, word ptr [bp]._val
jne rec1
mov ax,1
jmp stop
rec1: cmp bx, word ptr [bp]._val
jl rec2
push word ptr [bp]._tab
push word ptr [bp]._val
sub si,2
push si
push word ptr [bp]._s
call near ptr _cauta
add sp,8
jmp stop
rec2: push word ptr [bp]._tab
push word ptr [bp]._val
push word ptr [bp]._d
add si,2
push si
call near ptr _cauta
add sp,8
end
MODULUL C
# include <stdio.h>
# include <conio.h>
extern int cauta (int s, int d, int val, int tab[]);
int main(){
int tab[10]={3,6,7,10,11,20,214};
int val, c;
printf ("Introduceti valoarea cautata=");
scanf("%d",&val);
c=cauta(0,12,val,tab);
printf("%d",c);
getch();
}
Problema 4/ Laborator 10
.model small
.stack
.data
sablon struc
_bp dw ?
_ip dw ?
_x db ?
sablon ends
v db 'ana are mere'
vlen dw $-v
.code
nr_aparitii proc
push bp
mov bp, sp
push cx
mov cx, vlen
mov ax, 0
push bx
mov bl, [bp]._x
push si
mov si, 0
count:cmp bl, v[si]
jne continue
inc ax
continue:
inc si
loop count
final_nra: pop si
pop bx
pop cx
pop bp
retn
nr_aparitii endp
start:
mov ax, @data
mov ds, ax
push 'a'
call nr_aparitii
add sp, 2
mov ah, 4ch
int 21h
end start
Problema 8/ Laborator 10
(polinomul Cebisev de speta I)
T n(x ) = { 1, n=0
{ x, n=1;
{ 2*
T n2 ( x ) - T n1 ( x )
MODULUL ASAMBLARE
.modell small
public _Cebisev
.stack
sablon struc
_bp dw ?
_ip dw ?
_n dw ?
_x dw ?
sablon ends
.code
_Cebisev proc near
push bp
mov bp,sp
push bx
push dx
pushf
push cx
mov bx,word ptr[bp]._x
mov dx,word ptr[bp]._n
cmp dx,0
jne n1
mov ax,1
jmp stop
n1:cmp dx,1
jne rec
mov ax,bx
jmp stop
rec:dec dx
push bx
push dx
call near ptr _Cebisev
add sp,4
mov cx,ax
dec dx
push bx
push dx
call near ptr _Cebisev
add sp,4
shl ax,1
sub ax,cx
stop:pop cx
popf
pop dx
pop bx
pop bp
retn
_Cebisev endp
end
MODULUL C
#include <stdio.h>
#include <conio.h>
extern int Cebisev(int,int);
void main(){
int n,x,c;
printf ("n=");scanf ("%d",&n);
printf ("x=");scanf ("%d",&x);
c= Cebisev(n,x);
printf("c=%d",c);
getch();
}
Problema 9/Laborator 10
MODULUL C
#include<conio.h>
#include<stdio.h>
extern int Ackermann(int,int);
void main(){
int m,n,a;
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
a=Ackermann(n,m);
printf("a=%d",a);
getch();
}