Professional Documents
Culture Documents
Potprogrami
4.1. PROC i ENDP direktive
Ove direktive oznaavaju poetak i kraj potprograma (procedure). Svaki
program moe da se sastoji iz veeg broja procedura. Pritom mora da sadri proceduru
main koja se prva poziva.
SumArray PROC
...
SumArray ENDP
main PROC
...
CALL SumArray
...
main ENDP
POP ECX
POP EBX
SumArray ENDP
Pomou registara
Pomou memorije
Pomou steka
4. Potprogrami
Videli smo kako izgleda prenos parametara pomou registara i on se koristi ukoliko
potprogram nije rekurzivan i ima malo parametara koji koji su najvie 32bitne
vrednosti. Ukoliko je broj parametara vei, a procedura nije rekurzivna, moe se
koristiti i drugi nain (pomou memorije). U tom sluaju, parametri se smetaju na
unapred deklarisane memorijske lokacije.
Najfleksibilniji nain za prenos parametara je pomou steka. Pre poziva funkcije,
parametri se stave na vrh steka (instrukcija PUSH), a onda ih u potprogramu, po
potrebi koristimo. Ne treba zaboraviti da se nakon poziva procedure stek isprazni. To je
mogue uitiniti tako to dodamo parametar instrukciji RET:
RET
AddTwo PROC
push ebp
mov ebp, esp
mov eax,[ebp + 12]
add eax,[ebp + 8]
pop ebp
ret 8
AddTwo ENDP
; 32-bit
; 32-bit
ret 4
the stack
Uppercase ENDP
; AL =
; less than 'a'?
; yes: do
; greater than
; yes: do
; no: convert it
; clean up
3
main PROC
push x
4. Potprogrami
call Uppercase
main ENDP
push 20
push 10
call MySub
main ENDP
mov DWORD PTR [ebp-4], 10
4. Potprogrami
; calc 5!
; calculate factorial (EAX)
;---------------------------------------------------Factorial PROC
; Calculates a factorial.
; Receives: [ebp+8] = n, the number to calculate
; Returns: eax = the factorial of n
;---------------------------------------------------push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,0
; n > 0?
ja L1
; yes: continue
mov eax,1
; no: return 1 as the value of 0!
jmp L2
; and return to the caller
L1:
dec eax
push eax
; Factorial(n-1)
call Factorial
; Instructions from this point on execute when each
; recursive call returns.
mov ebx,[ebp+8]
mul ebx
L2:
pop ebp
ret 4
Factorial ENDP
END main
; return EAX
; clean up stack
MyProc proc
PUSH EBP
MOV EBP,ESP
ADD ESP,-8
PUSH ECX
MOV ECX,DWORD PTR SS:
[EBP+8]
MOV EBX,DWORD PTR SS:
[EBP+C]
MOV DWORD PTR SS:[EBP-4],ECX
MOV DWORD PTR SS:[EBP-8],EBX
POP ECX
LEAVE
4. Potprogrami
RETN 8
MyProc EndP
4.X. Zadaci
U narednim zadacima se podrazmeva da se vrednosti svih promenljivih ne
uitavaju, ve se upisuju zajedno sa podacima (u okviru .data segmenta). Ispis obaviti
pomou print macroa. Prilikom rezervisanja memorije, pretpostaviti da svi nizovi i
stringovi nemaju vie od 100 elemenata/karaktera.
Zadatak 1. Napisati proceduru Max koja odredjuje maksimalni element nekog niza
neoznaenih 32bitnih brojeva. Parametri ove procedure su poetna adresa niza kao i
broj elemenata u nizu. Rezultat smestiti u EAX. Napisati test program.
Zadatak 2. Napisati proceduru Ispis koja ispisuje sve elemente niza neoznaenih
32bitnih brojeva. Parametri ove procedure su poetna adresa niza kao i broj elemenata
u nizu. Brojeve tampati jedan do drugog sa proredom izmedju i na kraju prei u novi
red. Napisati test program.
Zadatak 3. Napisati proceduru Obrni koja okree niz neoznaenih 32bitnih brojeva.
Parametri ove procedure su isti kao i u prethodna dva zadatka, a poetna adresa
novog niza je smetena u EDI. Na kraju procedure odtampati novi niz pomou
procedure Ispis.
Zadatak 4. Napisati proceduru koja pretvara string dekadnih cifara u broj, i vrednost
smeta u EAX. Napomena: String je niz karaktera i zavrava se vrednou 0, a ASCII
kod svake dekadne cifre ima u heksadekadnom sistemu oblik 3c, gde je c cifra (dakle,
30 je '0', 31 je '1', itd).
Zadatak 5. Napisati proceduru NizOperacija koja iz niza 32bitnih neoznaenih brojeva
izbacuje sve neparne elemente, a parne deli sa 2. Parametri procedure su adresa niza,
broj elemenata niza kao i poetna adresa novodobijenog niza. Ukupan broj elemenata
novodobijenog niza smestiti u EDX.
U glavnom programu, primenjivati ovu proceduru sve dok postoji barem jedan element
niza. Posle svakog koraka ispisati niz (procedura Ispis).
Zadatak 6. Neka veliina se opisuje pomou tri trocifrena broja (u dekadnom
sistemu). Napisati funkciju Compress koja pamti ova 3 broja u jedinstvenu 32bitnu
lokaciju. Prva dva bita rezultata su 0, a naredne 3 grupe od po 10 bita odgovaraju
redom prvom, drugom i trecem broju. Vrednosti prvog, drugog i treeg broja nalaze se
u registrima BX, CX i AX, a rezultat treba smestiti u registar EDX.
Nakon ovoga napisati proceduru UnCompress koja radi obrnutu operaciju.
Zadatak 7. Napisati proceduru koja rauna broj pojavljivanja velikih slova, malih slova
i brojeva u stringu S. Parametar procedure je poetna adresa stringa S, a izraunate
vrednosti se redom smetaju u registre EAX, EBX, EDX.
Zadatak 8. Napisati proceduru Swap koja menja vrednosti dve memorijske lokacije.
Parametri ove procedure su adrese lokacija i nalaze se na steku.
Zadatak 9. Napisati proceduru koja na osnovu niza karaktera A formira novi niz B u
kome je svako pojavljivanje slova B zamenjeno sa jednom takom, a svako
pojavljivanje slova W sa dve take ... Parametri ove procedure su poetna adresa
niza A, broj elemenata niza A kao i poetna adresa niza B. Napisati glavni program.
Pretpostaviti da nizovi A i B nemaju vie od 100 elemenata.
4. Potprogrami
a0 , a1 , , an1 . Niz
je deo niza
b0 , b1 , , bk1
s
takav da
je
deo niza
21.
Napisati
rekurzivnu
proceduru
BrzoStepenovanje
po modulu
M =2
16
za
rekurzivno
. Koristiti sledeu
rekurentnu vezu
a
( n2)2 , n parno
a
2
( n2) a , n neparno
an =
Pritom je
3100000000
po modulu
M .