Orar semigroup #2

Orar semigroup #2

[PLA] 4 noiembrie - Lab 4

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.
.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
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
2. S a se scrie un program pentru adunarea a dou a matrici bidimensionale.
.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.
.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:
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}
.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
;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
3. Folosind doar instructiunile push si pop, scrieti un program care roteste registrii
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).

.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

.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
4. Intr-un sir de 2n - 1 elemente se g asesc i ntr-o ordine aleatoare toate numerele de
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

marți, 4 noiembrie 2014 by DlMuresan
Categories: | Leave a comment

Leave a Reply