You are on page 1of 10

4.

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

4.2. Instrukcije CALL i RET


Ove instrukcije slue za pozivanje potprograma. Instrukcija RET nema
parametara a instrukcija CALL ima jedan parametar koji predstavlja adresu poetka (tj.
naziv procedure) koja se poziva.
Primer:
SumArray PROC
...
RET
SumArray ENDP

main PROC
...
CALL SumArray
...
main ENDP

Ukoliko potprogram koristi neki registar, potrebno je sauvati njegovu vrednost


pre izvrenja potprograma i nakon izvrenja je obnoviti. Za ovo je najbolje koristiti stek
na sledei nain
SumArray PROC
PUSH EBX
PUSH ECX

POP ECX
POP EBX
SumArray ENDP

4.3. Prenos parametara iz programa u potprogram


Prenos parametara je mogu na 3 naina:

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

; izadji iz funkcije i izbaci 8 bajta sa steka

AddTwo PROC
push ebp
mov ebp, esp
mov eax,[ebp + 12]
add eax,[ebp + 8]
pop ebp
ret 8
AddTwo ENDP

; base of stack frame


; first parameter
(6)
; second parameter
(5)
; clean up the stack

U glavnom programu (procedura main) stoji sledee:


main PROC
push 6
push 5
call AddTwo
print ustr$(eax), 13, 10
exit
main ENDP

; 32-bit
; 32-bit

Primetimo da su parametri push instrukcije neposredni operandi. U ovom sluaju,


podrazumeva se da su u pitanju 32bitni operandi. Naravno, ukoliko napiemo push
A, i tada e se karakter najpre proiriti od 8 bita na 32 bita, a zatim smestiti na stek.
Podsetimo se da procesori familije IA-32 koriste little-endian format, pa ovaj 8bitni
parametar moemo pribaviti kao da je u pitanju 32bitni.
Sledi primer procedure koja konvertuje veliko slovo u malo. Parametar ove
procedure je jedno slovo i nalazi se na steku, a rezultat se smeta u registar al.
Uppercase PROC
push ebp
mov ebp,esp
mov al,[ebp+8]
character
cmp al,'a'
jb L1
nothing
cmp al,'z'
'z'?
ja L1
nothing
sub al,32
L1: pop ebp

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

Da bi poveali itljivost programa, moemo oznaiti parametre procedure


pomou direktive EQU. Ova imena koristimo unutar procedure kad god su nam
potrebni parametri.
y_param EQU [ebp + 12]
x_param EQU [ebp + 8]
AddTwo PROC
push ebp
mov ebp,esp
mov eax,y_param
add eax,x_param
pop ebp
ret
AddTwo ENDP

4.4. Lokalne promenljive potprograma


Procedura rezervie prostor na steku za lokalne promenljive. U sledeem kodu
imamo dve lokalne promenljive (X i Y) za koje se najpre rezervie prostor i dodeli im se
vrednost dva parametra potprograma, a onda se one uklone sa steka.
MySub PROC
push ebp
mov ebp,esp
sub esp,8
; create locals
mov eax, DWORD PTR [ebp+8]
mov ebx, DWORD PTR [ebp+12]
mov DWORD PTR [ebp-4], eax ; X
mov DWORD PTR [ebp-8], ebx ; Y
mov esp,ebp
; remove locals from stack
pop ebp
ret 8
MySub ENDP
main PROC

push 20
push 10
call MySub

main ENDP
mov DWORD PTR [ebp-4], 10

Marko Petkovic: Osnovi informatike i raunarstva


4
Da bi program bio itljiviji, i ovde je mogue oznaiti lokalne promenljive
simbolima, koji se kasnije koriste u proceduri.
P1
EQU DWORD PTR [ebp + 12]
P2
EQU DWORD PTR [ebp + 8]
X_local
EQU DWORD PTR [ebp - 4]
Y_local
EQU DWORD PTR [ebp - 8]
MySub PROC
push ebp
mov ebp, esp
sub esp, 8
mov eax, P1
mov ebx, P2
mov X_local, eax
mov Y_local, ebx
mov esp, ebp
pop ebp
ret
MySub ENDP

; reserve space for locals


;X
;Y
; remove locals from stack

4. Potprogrami

4.5. Rekurzivne procedure (ne radimo)


Kod rekurzivnih procedura, prenos parametara ide iskljuivo pomou steka.
Ukoliko procedura vraa vrednost, ona se nalazi najee u nekom od registara. Sledi
primer procedure za rekurzivno raunanje faktorijela datog broja.
include \masm32\include\masm32rt.inc
.data
.code
main PROC
push 5
call Factorial
print ustr$(eax),13,10
exit
main ENDP

; 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

; get n, EAX is now (n-1)!


; EDX:EAX = EAX * EBX

L2:
pop ebp
ret 4
Factorial ENDP
END main

; return EAX
; clean up stack

Marko Petkovic: Osnovi informatike i raunarstva


6

4.6. Direktive INVOKE, PROC i LOCAL


Pomou ovih direktiva mogue je definisanje i pozivanje potprograma na
asemblerskom jeziku, nalik onom na viim programskim jezicima.
Proceduru definiemo na sledei nain:
label PROC [attributes] [USES reglist],
parameter_1,
parameter_2,
.
.
parameter_n
Svaki opis parametra ima format:
paramName:type
Naziv parametra je paramName a tip je type. Prilikom implementacije procedure, na
parametre se pozivamo pomou imena. Dve ili vie procedura mogu imati isti
parametar, ali ime parametra ne sme biti ujedno i globalna promenljiva, ili labela. Tip
parametra moe biti jedan od sledeih:
BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, ili TBYTE
Parametri mogu biti i pointeri, i u tom sluaju se oznaavaju sa:
PTR BYTE PTR SBYTE, PTR WORD, PTR SWORD, PTR DWORD, PTR SDWORD, PTR
QWORD, PTR TBYTE
U okviru USES specifikacije navode se registri koje aplikacija koristi.
Direktiva INVOKE smeta parametre potprograma na stek i poziva potprogram.
Sintaksa je sledea:
INVOKE procedureName [, argumentList]
Primer: Funkcija napisana sa i bez direktiva.
MyFun proc uses ecx,
parX : dword, parY : dword
local a:dword, b:dword
mov ecx, parX
mov ebx, parY
mov a, ecx
mov b, ebx
Ret
MyFun EndP

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

SumArray proc uses ecx,


niz : ptr dword,
duz : dword
xor eax, eax
mov esi, niz
mov ecx, duz
ciklus:
add eax, [esi]
add esi, 4
loop ciklus
Ret
SumArray EndP

MyProc EndP

Marko Petkovic: Osnovi informatike i raunarstva


8

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

Zadatak 10*. Napisati proceduru DeoNiza koja proverava da li je niz


deo niza

a0 , a1 , , an1 . Niz

je deo niza

ukoliko postoji indeks

b0 , b1 , , bk1
s

takav da

je

a s=b 0 , a s+1=b1 , , a s+k1=bk1 .

Parametri procedure su adrese nizova a i b, kao i brojevi elemenata n i k. Ukoliko je niz

deo niza

a , potrebno je u registar EAX upisati vrednost indeksa s . U

suprotnom, u EAX upisati -1.


Zadatak 11. Dat je niz oznaenih brojeva A. Napisati program koji odredjuje podniz
uzastopnih elemenata niza iji je zbir maksimalan.
Zadatak 12. Napisati proceduru ProstiFaktori koja formira niz X svih prostih faktora
broja A. Parametar ove procedure je broj A i poetna adresa broja X, i oni se prenose
pomou steka. Broj elemenata niza X upisati u registar ECX.
Zadatak 13. Napisati proceduru Cif1 koja za uneti broj A formira niz X iji su lanovi
pozicije na kojima se nalazi cifra 1 u binarnom zapisu broja A. Parametri procedure Cif1
su redom broj A, kao i poetna adresa niza X, i oni se prenose pomou steka. Broj
elemenata niza X upisati u registar ECX. U glavnom programu ispisati vrednosti niza X
(pozivom procedure Ispis) za A=1,2,,127. ta predstavlja izlaz programa?
Zadatak 14. Napisati funkciju SumDupliFakt koja odredjuje sumu 1!!+2!!+3!!++n!!,
za zadat prirodni broj n. Parametar funkcije je broj n i nalazi se na steku, a rezultat
smestiti u EAX. Za raunanje duplog faktorijela moete napisati posebnu funkciju.
Zadatak 15*. Napisati proceduru Period koja za dati niz A (neoznaenih 32bitnih
brojeva) proverava da li je periodian. Niz je periodian ako postoji broj p (1<=p<n)
takav da je A[i]=A[i+p] za svako 0<=i<n-p, gde je n broj elemenata niza. Poetna
adresa niza, kao i broj elemenata, nalaze se na steku, a minimalnu vrednost broja p
upisati u EAX (ako niz nije periodian, onda u EAX upisati vrednost n).
Zadatak 16. Napisati proceduru BrPojavljivanja koja rauna broj pojavljivanja broja x
u nizu A od n 8bitnih neoznaenih celih brojeva. Poetna adresa niza, broj elemenata
niza, kao i broj x nalaze se na steku. Rezultat treba upisati u registar EAX.
Zadatak 17*. Napisati proceduru Majority koja proverava da li se u nizu A od n
16bitnih neoznaenih celih brojeva, neki broj pojavljuje vie od n/2 puta. Ako takav
broj postoji, upisati njegovu vrednost u AX a u gornjih 16 bita registra EAX upisati 0. U
suprotnom, u gornjih 16 bita registra EAX upisati 32767 (odnosno sve jedinice,
gledano u binarnom zapisu). Poetna adresa niza A, kao i broj elemenata n nalaze se
na steku.
Zadatak 18. U nekoj zemlji X, pristojnim se smatraju reenice u kojima broj slova A
nije vei od broja slova O. Napisati proceduru Pristojna koja proverava da li string S
predstavlja pristojnu reenicu. Adresa stringa nalazi se u registru ESI. Ukoliko je
reenica pristojna, procedura upisuje 255 u registar AL, a u suprotnom upisuje 0. U
glavnom programu pozvati proveriti da li su reenice DOBAR DAN i DOZVOLJENO
KOKODAKANJE pristojne. Ispis treba da bude Pristojna ili Nije pristojna.
Zadatak 19. Napisati proceduru MaxUzast1 koja rauna maksimalni uzastopni broj
jedinica u binarnom zapisu nekog 32bitnog neoznaenog broja. Na primer, binarni
zapis broja 3078350749 je 10110111011110111110011110011101 a maksimalni broj

Marko Petkovic: Osnovi informatike i raunarstva


10
uzastopnih jedinica u istom je 5 (podvuene su). Broj jedinica treba upisati u registar
BL.
Zadatak 20. Napisati proceduru BUSObrnuto koja formira string sastavljen od
dekadnih cifara nekog 32bitnog neoznaenog broja, poredjanih u obrnutom redosledu.
Broj je smeten u registru EAX a poetna adresa stringa u registru ESI. U glavnom
programu ispisati string pozivom makro naredbe print offset S, gde je S oznaka
(labela) stringa. Prilikom deklaracije pretpostaviti da string ima najvie 10 cifara.
Napomena. Karakter 1 ima ASCII kod 31h, karakter 2 ima 32h, itd. String se
zavrava bajtom 0.
Zadatak

21.

Napisati

rekurzivnu

raunanje stepena prirodnog broja

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

a0 =1 . U glavnom programu izraunati

3100000000

po modulu

M .

You might also like