Probleme rezolvate
1.S a se scrie un program care copiaz a un sir de valori din locat, ii consecutive de memorie in alta locatie inn ordine invers a..3862. S a se scrie un program pentru adunarea a dou a matrici bidimensionale.
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
sir1 dw 1,2,3
sir2 dw 0,0,0
.code
start:
lea esi, sir1
lea edi, sir2
;iau din primul sir si pun in stiva
push word ptr[esi]
add esi, 2
push word ptr[esi]
add esi, 2
push word ptr[esi]
;scot de pe stiva si pun in al doilea sir
pop word ptr[edi]
add edi, 2
pop word ptr[edi]
add edi, 2
pop word ptr[edi]
;apel functie exit
push 0
call exit
end start
.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
m1 db 1,2,3
db 4,5,6
m2 db 7,8,9
db 10,11,12
.code
start:
mov eax, 0 ;in ax se vor pastra sumele elementelor de pe aceeasi
;pozitie
mov esi, 0 ;pentru parcurgerea liniilor
mov ebx, 0 ;pentru parcurgerea coloanelor
;suma prima linie
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al ;rezultatul se pastreaza in matricea m1
mov al, 0
inc esi
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al
mov al, 0
inc esi
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al
;suma a doua linie
mov al, 0
mov esi, 0
;bx se aduna cu 3
add ebx, 3
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al
mov al, 0
inc esi
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al
mov al, 0
inc esi
add al, m1[ebx][esi]
add al, m2[ebx][esi]
mov m1[ebx][esi], al
;apel functie exit
push 0
call exit
end start
Probleme propuse
1. S a se scrie un program care calculeaz a media unui sir de numere intregi din memorie.
Numerele sunt de tip octet. Media va memorat a ca valoare i ntreaga i ntr-o variabil a de tip octet.
Numerele sunt de tip octet. Media va memorat a ca valoare i ntreaga i ntr-o variabil a de tip octet.
.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
sir db 1,2,3,4,4 ;sirul
cat db 0 ;catul mediei
restul db 0 ;restul mediei
.code
start:
lea esi,sir ;trebuie copiat sirul in esi pentru a-l parcurge
mov eax,0 ;initialiarea registrului pentru suma cu 0
add al,[esi] ;adaugarea primului element in registrul suma
add esi,1 ;referirea la urmatorul element
add al,[esi]
add esi,1
add al,[esi]
add esi,1
add al,[esi]
add esi,1
add al,[esi]
mov ecx,5 ;initializarea registrului ecx (cl) cu 5 - 5 elemente in sir
mov edx,eax ;salvarea sumei in edx
div cl ;impartirea lui al la cl (5) pentru a calcula media
;in AL (bitii 1,2 de la dreapta) - catul, in AH (bitii 3,4 de la dreapta) - restul
mov cat,al ;cat contine catul mediei aritmetice
mov restul,ah ;restul contine restul mediei aritmetice
;apel functie exit
push 0
call exit
end start
2. S a se scrie un program care i nsumeaz a salariile unor angajati. Datele referitoare la
angajati se p astreaz a i ntr-un tablou de i nregistr ari.
Exemplu tablou de ^inregistr ari:
angajati se p astreaz a i ntr-un tablou de i nregistr ari.
Exemplu tablou de ^inregistr ari:
1 ANGAJAT struct
2 nume DB 20 dup(0)
3 salariu DW 0
4 ANGAJAT ends
5
6 nrAngajati DW 4
7 angajati ANGAJAT {"georgescu", 100}, {"pop", 100},
8 {"popescu", 300}, {"ionescu", 450}
.3863. Folosind doar instructiunile push si pop, scrieti un program care roteste registrii
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
;structura ANGAJAT cu doua campuri, nume (de 20 de ori cate un bit) si salariu (2 biti)
ANGAJAT struct
nume DB 20 dup(0)
salariu DW 0
ANGAJAT ends
;declararea unui vector de tip ANGAJAT
nrAngajati DW 4
angajati ANGAJAT {"georgescu", 1}, {"pop", 1},
{"popescu", 3}, {"ionescu", 4}
.code
start:
lea esi,angajati ;mutam vectorul de tip ANGAJAT in esi
mov eax,0 ;registru pentru suma salariilor
add ax,word ptr[esi+20] ;se aduna primul salariu (pentru referirea la salariu se aduna 20 de biti (se sare peste
;cei pentru nume))
add esi,22 ;trecerea la al doilea element al vectorului (se sare peste 20 de biti pt nume si inca 2 pentru
;salariu)
add ax,word ptr[esi+20] ;se aduna pe ax pentru a fi de aceeasi lungime (ax - 16 biti, salariu - 16 biti)
add esi,22
add ax,word ptr[esi+20]
add esi,22
add ax,word ptr[esi+20]
;suma se pastreaza in eax
;apel functie exit
push 0
call exit
end start
EAX, EBX, ECX si EDX (valoarea din EAX merge in EBX, din EBX i n ECX, din ECX i n
EDX iar din EDX in EAX).
.3864. Intr-un sir de 2n - 1 elemente se g asesc i ntr-o ordine aleatoare toate numerele de
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
.code
start:
mov eax,1 ;initializarae registrilor
mov ebx,2
mov ecx,3
mov edx,4
push eax
push ebx
push ecx
push edx
pop eax
pop edx
pop ecx
pop ebx
;apel functie exit
push 0
call exit
end start
la 1 la n, de dou a ori fi ecare, mai putin un num ar k care se g aseste o singur a dat a.
Scrieti un program care g aseste num arul k.
.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;includem msvcrt.lib, si declaram ce functii vrem sa importam
includelib msvcrt.lib
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;declaram simbolul start ca public - de acolo incepe executia
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sectiunile programului, date, respectiv cod
.data
sir db 1,2,1,3,4,3,5,5,6,6,4
lung DB $-sir ;punem lungimea sirului sir in variabila lung
i db 2 ;variabila pentru inmultire/impartire cu 2 (formula sumei primelor n nr nat)
.code
start:
mov eax,0
mov ebx,0
mov cl,lung ;lungimea sirului in cl
mov edx,0
lea esi,sir
eticheta:
add al, [esi+ebx] ;suma elementelor din sir va fi in AL (EAX)
inc bl ;indicele pentru parcurgerea sirului
cmp bl,cl ;conditia de continuare (indicele < lungimea)
jb eticheta ;jump la eticheta daca bl<cl
mov ebx,0
inc cl ;pentru calculul sumei de la 1 la n
push eax
mov eax,ecx
div i ;se calculeaza de fapt pana la n, impartire cu 2
mov ecx,eax ;formula pt suma primelor n nr nat (dar luata de 2 ori, nu se mai face impartirea la 2)
add ecx, 1
mul ecx
mov ecx, 0
pop ecx
;in eax avem de 2 ori suma de la 1 la n
;in ecx avem suma elementelor din sir
sub eax, ecx
;in eax vom avea diferenta dintre suma de la 1 la n (de 2 ori) si suma el din vector
;adica chiar valoarea care apare o singura data in sir
;apel functie exit
push 0
call exit
end start