SlideShare a Scribd company logo
1 of 60
Download to read offline
Leksione 9-10: ProçeduratLeksione 9-10: Proçedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
HyrjeHyrje
• Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme
• Libraria e lidhur Book
• Operime Stive(stack)
• Përcaktimi dhe përdorimi i Proçedurave
• Projektimi i programit duke përdorur Procedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
2
Libraria e LidhLibraria e Lidhuurr BookBook
• Hyrje në Libraritë e Lidhura• Hyrje në Libraritë e Lidhura
• Thirrja e një proçedure Librarie
• Lidhja me një Library
• Proçedura Librarie – Hyrje• Proçedura Librarie – Hyrje
• Gjashtë Shembuj
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
3
Hyrje nëHyrje në LibrarLibraritë e Lidhitë e Lidhuurara
• Një skedar që përmban proçedura të kompiluara në
kod makine
• I konstruktuar nga një ose më shumë skedarë OBJ
• Për të ndërtuar një librari, . . .
• Fillojmë me një ose më shumë skedare burimorë ASM• Fillojmë me një ose më shumë skedare burimorë ASM
• Asemblojmë secilin prej tyre në skedarë OBJ
• Krijojmë një skedar libtarie bosh(prapashtesa .LIB)• Krijojmë një skedar libtarie bosh(prapashtesa .LIB)
• Shtojmë skedarin(et) OBJ te skedari i librarisë, duke
përdorur programin ndihmësndihmës -- Microsoft LIB utility
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
4
Thirrja e njëThirrja e një ProProççedureedure LibrarLibrarieie
• Thirrja e një Proçedure Librarie me përdorimin e
instrunksionit CALL. Disa proçedura kërkojnë argumentë
hyres. Direktiva INCLUDE kopjon prototipet e proçeduravehyres. Direktiva INCLUDE kopjon prototipet e proçedurave
(deklarations).
• Shembulli i mëposhtëm afishon në konsolë "1234":
INCLUDE Irvine32.inc
.code
mov eax,1234h ; argumenti hyrës
• Shembulli i mëposhtëm afishon në konsolë "1234":
mov eax,1234h ; argumenti hyrës
call WriteHex ; shfaq numrin hex
call Crlf ; fundi i rreshtit
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
5
LiLidhjadhja me njëme një LibrarLibrarii
• Programet lidhen te libraria Irvine32.lib duke përdorur komandën e
lidhësit (linker) brenda një skedari batch me emër make32.bat.
• Vini re dy skedaret LIB: Irvine32.lib, dhe kernel32.lib• Vini re dy skedaret LIB: Irvine32.lib, dhe kernel32.lib
• Skedari i fundit është pjesë e Microsoft Win32
Software Development Kit (SDK)
Your program Irvine32.lib
links
to
links to
Programi JuajProgrami Juaj
kernel32.lib
executes
links to
can link to
kernel32.dll
executes
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
6
Në vazhdimNë vazhdim
• Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme
• Libraria e lidhur Book
• Operime Stive(stack)
• Përcaktimi dhe përdorimi i Proçedurave
• Projektimi i programit duke përdorur Procedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
7
ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje (1(1 nganga 4)4)
CloseFile – Mbyll një skedar disku të hapur
Clrscr – Mbyll konsolen, lokalizon kursorin në këndin e majtë lartClrscr – Mbyll konsolen, lokalizon kursorin në këndin e majtë lart
CreateOutputFile – Krijon skedar të ri disku për shkrim në output mode
Crlf – Shkruan sekuencën e fundit të rreshtit te dalja standarte
Delay - Ndalon ekzekutimin e programit për interval n milisekonda
DumpMem - Shkruan bllokun e kujtesës te dalja standarte në hex
DumpRegs – Afishon regjistrat e përdorimit të përgjithshëm dhe flamujt (në hex)DumpRegs – Afishon regjistrat e përdorimit të përgjithshëm dhe flamujt (në hex)
GetCommandtail – Kopjon command-line args në tabelë bytesh
GetMaxXY - Merr numrat e kolonave, rreshtave në baferin e dritarës së konsoles
GetMseconds - Kthen milisekondat e kaluara nga mesnataGetMseconds - Kthen milisekondat e kaluara nga mesnata
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
8
ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((22 nganga 4)4)
GetTextColor – Kthen ngjyrat e sfondit dhe të planit të parë të tekstit
aktiv në dritarën e konsolës
Gotoxy - Lokalizon kursorin te rreshti dhe shtylla në konsolë
IsDigit - Vendos flamurin Zero nëse AL përmban kod ASCII për shifrat
dixhitale dhjetore (0–9)
MsgBox, MsgBoxAsk – Afishon boks mesazhi popup
OpenInputFile – Hap skedar ekzistues për hyrje
ParseDecimal32 – Konverton string integer pa shenjë në binar
ParseInteger32 - Konverton string integer me shenjë në binarParseInteger32 - Konverton string integer me shenjë në binar
Random32 - Gjeneron numër të plotë 32-bit pseudo të rastit në rangun
nga 0 në FFFFFFFFh
Randomize – Përcakton elementin e gjeneratorit numrave të rastitRandomize – Përcakton elementin e gjeneratorit numrave të rastit
RandomRange - Gjeneron numër të plotë pseudo të rastit në një rang
specifik
ReadChar – Lexon një karakter të vetëm nga hyrja standarte
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
9
ReadChar – Lexon një karakter të vetëm nga hyrja standarte
ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((33 nganga 4)4)
ReadFromFile – Lexon një skedar disku të hapur për hyrje në një buffer
ReadDec - Lexon 32-bit numër dhjetor të plotë pa shenjë nga tastiera
ReadHex - Lexon 32-bit numër hexadecimal të plotë nga tastieraReadHex - Lexon 32-bit numër hexadecimal të plotë nga tastiera
ReadInt - Lexon 32-bit numër dhjetor të plotë pa shenjë nga tastiera
ReadKey – Lexon një karakter nga buffer-i i hyrjes së tastierës
ReadString – Lexon një string nga Hyrja standarte, e përfunduar nga [Enter]
SetTextColor – Vendos ngjyrat e planit të parë dhe sfondit të të gjithë
nënsekuencave të tekstit të dalë në konsolë
StrLength – Kthen gjatësinë e një vargu karakteresh (string)
WaitMsg – Afishon një mesazh, pret për shtypjen e tastit Enter
WriteBin – Shkruan numër të plotë 32-bit pa shenjë në format binar ASCII.WriteBin – Shkruan numër të plotë 32-bit pa shenjë në format binar ASCII.
WriteBinB – Shkruan një numër të plotë në format byte, word, ose doubleword
WriteChar – Shkruan një karakter të vetëm në Daljen standarte
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
10
ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((44 nganga 4)4)
WriteDec – Shkruan një numër të plote 32-bit pa shenjë në format dhjetor
WriteHex - Shkruan një numër të plote 32-bit pa shenjë në format hexadecimal
WriteHexB – Shkruan byte, word, ose doubleword në format hexadecimal
WriteInt - Shkruan një numër të plote 32-bit me shenjë në format dhjetor
WriteString – Shkruan string të përfunduar me null te dritarja e konsolësWriteString – Shkruan string të përfunduar me null te dritarja e konsolës
WriteToFile - Shkruan buffer-in në një skedar të hapur për Dalje(output file)
WriteWindowsMsg – Afishon mesazhin e gabimit më aktual të gjenëruar nga
MS-WindowsMS-Windows
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
11
ShembullShembull 11
Pastron ekranin, vonon programin për 500 milisekonda, pastaj
zbraz flamujtë dhe regjistrat.
.code
call Clrscr
mov eax,500mov eax,500
call Delay
call DumpRegs
EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000
Shembull Daljeje(output):
EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000
ESI=00000000 EDI=00000100 EBP=0000091E ESP=000000F6
EIP=00401026 EFL=00000286 CF=0 SF=1 ZF=0 OF=0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
12
ShembullShembull 22
Afishon një string të përfunduar me null dhe zhvendos
kursorin në krye të rreshtit tjetër të ekranit.
.data
str1 BYTE “Gjuha Assembly është e thjeshtë!",0
.code
mov edx,OFFSET str1
call WriteStringcall WriteString
call Crlf
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
13
ShembullShembull 2a2a
Afishon një string të përfunduar me null dhe zhvendos
kursorin në krye të rreshtit tjetër të ekranit (përdor çiftin
e ndërthhurur CR/LF).
.data
str1 BYTE "Assembly language is easy!",0Dh,0Ah,0
e ndërthhurur CR/LF).
str1 BYTE "Assembly language is easy!",0Dh,0Ah,0
.code
mov edx,OFFSET str1
call WriteStringcall WriteString
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
14
ShembullShembull 33
IntVal = 35
Afishon një numër të plotë pa shenjë në format binar, dhjetor, dhe
hexadecimal, secili në një rresht të veçantë.
IntVal = 35
.code
mov eax,IntVal
call WriteBin ; display binarycall WriteBin ; display binary
call Crlf
call WriteDec ; display decimal
call Crlf
call WriteHex ; display hexadecimalcall WriteHex ; display hexadecimal
call Crlf
Shembull Daljeje(output):
0000 0000 0000 0000 0000 0000 0010 0011
35
23
Shembull Daljeje(output):
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
15
23
SembullSembull 44
Pret një hyrje stringu nga përdoruesi. EDX tregon te stringu dhe
ECX përcakton numrin maksimal të karakterëve që përdoruesi
lejohet të kalojë.
.data
fileName BYTE 80 DUP(0)
lejohet të kalojë.
fileName BYTE 80 DUP(0)
.code
mov edx,OFFSET fileNamemov edx,OFFSET fileName
mov ecx,SIZEOF fileName – 1
call ReadString
Një byte null shtohet automatikisht te stringu.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
16
ShembullShembull 55
Gjëneron dhe afishon 10 numra të plotë pseudo të rastit me
shenjë në rangun 0 – 99. E kalon çdo numër të tillë të plotë te
WriteInt në EAX dhe e afishon atë në rresht të veçantë.
.code
mov ecx,10 ; loop counter
WriteInt në EAX dhe e afishon atë në rresht të veçantë.
mov ecx,10 ; loop counter
L1: mov eax,100 ; ceiling value
call RandomRange ; generate random int
call WriteInt ; display signed intcall WriteInt ; display signed int
call Crlf ; goto next display line
loop L1 ; repeat loop
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
17
ShembullShembull 66
Afishon një string të përfunduar me null, me karaktere të
verdha në sfond blu.
.data
str1 BYTE "Color output is easy!",0
.code
mov eax,yellow + (blue * 16)
call SetTextColorcall SetTextColor
mov edx,OFFSET str1
call WriteString
call Crlf
Ngjyra e sfondit para se t’i shtohet ngjyrës së planit të parë
shumëzohet me 16.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
18
shumëzohet me 16.
Në vazhdimNë vazhdim
• Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme
• Libraria e lidhur Book
• Operime Stive(stack)
• Përcaktimi dhe përdorimi i Proçedurave
• Projektimi i programit duke përdorur Proçedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
19
OperOperime Stive(stack)ime Stive(stack)
• Stiva gjatë kohës së ekzekutimit (Runtime Stack)• Stiva gjatë kohës së ekzekutimit (Runtime Stack)
• Operimi PUSH
• Operimi POP
• Instruksionet PUSH dhe POP
• Përdorimi i instruksioneve PUSH dhe POP
• Shembull: Këmbim i mbrapshtë i një Stringu• Shembull: Këmbim i mbrapshtë i një Stringu
• Instruksione që kanë të bejnë me stivën.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
20
StStiva gjatë kohës së ekzekutimitiva gjatë kohës së ekzekutimit
• Imagjinoni një stivë pjatash . . .
• Pjatat shtohen vetëm nga kreu(top)
• Pjatat hiqen vetëm nga kreu(top)
• Struktura LIFO
7
8
9
10 top
2
3
4
5
6
7
1
2
bottom
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
21
StStiva gjatë kohës së ekzekutimitiva gjatë kohës së ekzekutimit
• Menaxhohet nga NJ.Q.P.(CPU), duke përdorur dy regjistra
• SS (stack segment)
• ESP (stack pointer) *
Offset
00000006
ESP
00001000
00000FFC
00000FF8
00000FF4
00000FF0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
22
* SP në Mënyrën Reale të Adresimit
OperiOperimimi PUSHPUSH (1(1 nganga 2)2)
• Një operim 32-bit push zvogëlon treguesin e stives
me 4 dhe kopjon vlerën e vendndodhjes së treguar
nga treguesi i stivës.nga treguesi i stivës.
BEFORE AFTER
00000006 00000006
ESP
00001000
00000FFC 000000A5
ESP00001000
00000FFC
00000FF8
00000FF4
00000FF0
00000FF8
00000FF4
00000FF0 00000FF000000FF0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
23
OperiOperimimi PUSHPUSH (2(2 nganga 2)2)
• E njëjta stivë pas vendosjes së dy numrave të tjerë të plotë:
Offset
0000000600001000
Offset
00000FFC 000000A5
ESP
00000FF8
00000FF4
00000001
00000002
00000FF0
Stiva rritet për nga poshtë stives. Hapësira nën treguesin
ESP është gjithnjë e disponueshme (përveç rastit kur stiva
tejmbushet[overflowed]).
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
24
tejmbushet[overflowed]).
OperiOperimimi POPPOP
• Kopjon vlerën e stivës stack[ESP] në një regjistër ose variabël.
• Shton n te treguesi ESP, ku n është ose 2 ose 4.
• Vlera e n-së varet nga atributi i operandit që merr të dhenat• Vlera e n-së varet nga atributi i operandit që merr të dhenat
BEFORE AFTER
00000006
000000A5
00000006
000000A5
00001000
00000FFC
00001000
00000FFC000000A5
00000001
00000002 ESP
000000A5
00000001 ESP
00000FFC
00000FF8
00000FF4
00000FFC
00000FF8
00000FF4
00000FF0 00000FF0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
25
InstruInstruksksionionëtët PUSH dPUSH dhehe POPPOP
• PUSH sintaksa:
• PUSH r/m16• PUSH r/m16
• PUSH r/m32
• PUSH imm32• PUSH imm32
• POP sintaksa:
• POP r/m16
• POP r/m32
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
26
Përdorimi iPërdorimi i PUSH dPUSH dhehe POPPOP
Ruajnë dhe rimarrin vlerat e regjistrave kur ato përmbajnë vlera
të rendësishme. Instruksionet PUSH dhe POP përseritën në
rend të kundërt.
push esi ; push regjistrat
push ecx
rend të kundërt.
push ecx
push ebx
mov esi,OFFSET dwordVal ; afisho një kujtesë
mov ecx,LENGTHOF dwordValmov ecx,LENGTHOF dwordVal
mov ebx,TYPE dwordVal
call DumpMem
pop ebx ; rimerr regjistrat
pop ecx
pop esi
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
27
ShembullShembull:: Cikël i përseritur(Cikël i përseritur(Nested LoopNested Loop))
Kur krijojmë një cikël të përseritur, para se të futemi te cikli i
brendshëm, bëjmë push numëruesin e ciklit të jashtëm :
mov ecx,100 ; vendos numeruesin e ciklit të jashtëm
L1: ; fillon cikli i jashtëm
push ecx ; ruan numëruesin e ciklit të jashtëmpush ecx ; ruan numëruesin e ciklit të jashtëm
mov ecx,20 ; vendos numeruesin e ciklit të
brendshëm
L2: ; fillon cikli i brendshëmL2: ; fillon cikli i brendshëm
;
;
loop L2 ; përserit ciklin e brendshëmloop L2 ;
pop ecx ; rimerr numeruesin e ciklit të jashtëm
loop L1 ; përserit ciklin e jashtëm
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
28
ShembullShembull:: KembimKembim ii mbrapshtëmbrapshtë ii njënjë StringuStringu
• Përdorim një cikël me adresim të indeksuar
• Bejmë Push çdo karakter në stivë• Bejmë Push çdo karakter në stivë
• Fillojmë me kreun e stringut, bejmë pop stivën në rend të
kundërt, ndërfutim çdo karakter mbrapa te stringu
• Kodi burimor• Kodi burimor
• Pyetje: Pse duhet vendosur çdo karakter në EAX para se të
behet push?
Sepse vetëm vlera word (16-bit) ose doubleword (32-bit)
mund të bëhen push në stivë.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
29
Rradha JuajRradha Juaj. . .. . .
• Duke përdorur si pikë fillimi programin e Këmbimit
të mbrapshtë të një Stringu,
• #1: Modifikoni programin në mënyrë që përdoruesi të mund
të bejë hyrje të një stringu që përmban nga 1 deri në 50të bejë hyrje të një stringu që përmban nga 1 deri në 50
karaktere.
• #2: Modifikoni programin në mënyrë që ai të bejë hyrje një• #2: Modifikoni programin në mënyrë që ai të bejë hyrje një
listë me numra të plotë 32-bitësh nga përdoruesi, dhe pastaj
të afishojë numrat me renditje të kundert.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
30
Instruksione tInstruksione të tjera Stiveë tjera Stive
• PUSHFD dhe POPFD
• Bën push dhe pop registrin EFLAGS• Bën push dhe pop registrin EFLAGS
• PUSHAD ben push regjistrat me qëllim të përgjithshëm
me 32-bit në stivëme 32-bit në stivë
• renditja: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
• POPAD bën pop të njëjtat regjistra si më sipër nga stiva
me renditje të kundërtme renditje të kundërt
• PUSHA dhe POPA bëjnë të njëjtën gje për regjistrat me
16-bit16-bit
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
31
Rradha JuajRradha Juaj. . .. . .
• Shkruani një program që bën sa vijojnë:• Shkruani një program që bën sa vijojnë:
• Përcakton vlera të plota te EAX, EBX, ECX, EDX, ESI,
dhe EDI
• Përdor PUSHAD për të bërë push regjistrat me qëllim• Përdor PUSHAD për të bërë push regjistrat me qëllim
të përgjithshëm në stivë
• Duke përdorur një cikël, programi juaj duhet të bëjë
pop çdo numër të plotë nga stiva dhe ta afishojë atë nëpop çdo numër të plotë nga stiva dhe ta afishojë atë në
ekran
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
32
Në vazhdimNë vazhdim
• Lidhja me një Librari të Jashtme• Lidhja me një Librari të Jashtme
• Libraria e Lidhur Book
• Operime stive(stack)
• Përcaktimi dhe përdorimi i proçedurave
• Projektimi i programit duke përdorur Proçedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
33
Përcaktimi dhe përdorimi iPërcaktimi dhe përdorimi i ProProççedureduraveave
• Krijimi i Proçedurave
• Dokumentimi i Proçedurave• Dokumentimi i Proçedurave
• Shembull: Proçedura SumOf
• Instruksionet CALL dhe RET• Instruksionet CALL dhe RET
• Proçedura e përsëritur Calls
• Etiketa(Labels) Lokale dhe Globale• Etiketa(Labels) Lokale dhe Globale
• Parametra Proçedure
• Symbole Flowchart• Symbole Flowchart
• Operatori USES
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
34
Ndërtimi iNdërtimi i ProProççedureduraveave
• Probleme të mëdha mund të ndahen në probleme më
të vogla për t’i bërë ato më të menaxhueshme
• Një procedure është ekuivalentja ASM e një funksioni• Një procedure është ekuivalentja ASM e një funksioni
Java ose C++
• Më poshtë vijon një proçedurë në gjuhë assembly e• Më poshtë vijon një proçedurë në gjuhë assembly e
quajtur shembull:
shembull PROCshembull PROC
.
.
ret
shembull ENDPshembull ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
35
DoDokkumentiumentimimi ii ProProççedureduraveave
• Një përshkrim i të gjitha detyrave që kryhen nga proçedura.
Dokumentacion i sugjeruar për çdo proçedurë:
• Një përshkrim i të gjitha detyrave që kryhen nga proçedura.
• Merr(Receives): Një list me parametra hyrjeje; forma e përdorimit
të tyre dhe kërkesat.
• Kthen(Returns): Një përshkrim i vlerave të kthyera nga proçedura.
• Kërkon(Requires): Listë fakultative e kërkesave të quajtura
kushte paraprake(preconditions) që duhet të kënaqen para se tëkushte paraprake(preconditions) që duhet të kënaqen para se të
thirret proçedura.
Nëse proçedura thirret pa kënaqur kushtet paraprake, ajo
mund të mos prodhojë daljen e pritur.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
36
ShembullShembull: Pro: Proççedureduraa SumOfSumOf
;---------------------------------------------------------
SumOf PROCSumOf PROC
;
; Llogarit dhe kthen shumën e tre numrave të plotë 32-bit.
; Percepton: EAX, EBX, ECX, si tre numra të plotë. Mund të
; jenë me apo pa shenjë.; jenë me apo pa shenjë.
; Kthen: EAX = shuma, dhe gjendjen e flamujve(Carry,
; Overflow, etj.) që ndryshon.
; Kërkesat: asnjë
;---------------------------------------------------------;---------------------------------------------------------
add eax,ebx
add eax,ecx
ret
SumOf ENDPSumOf ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
37
InstruInstruksionetksionet CALL dCALL dhehe RETRET
• Instruksioni CALL thërret një proçedurë• Instruksioni CALL thërret një proçedurë
• Bën push ofset-in e instruksionit pasardhës në stivë
• Kopjon adresën e proçedurës së thirrur në EIP
• Instruksioni RET na kthen nga një proçedurë• Instruksioni RET na kthen nga një proçedurë
• Bën pop kreun e stivës në EIP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
38
Shembull meShembull me CALLCALL--RETRET (1(1 nganga 2)2)
main PROC
00000020 call MySub
0000025 është ofset-i i
00000020 call MySub
00000025 mov eax,ebx
.
.
main ENDP
0000025 është ofset-i i
instruksionit që vjen
menjëherë pas instruksionit
CALL
main ENDP
MySub PROC
00000040 mov eax,edx00000040 është ofset-i i
.
.
ret
MySub ENDP
00000040 është ofset-i i
instruksionit të parë brenda
MySub
MySub ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
39
Shembull meShembull me CALLCALL--RETRET ((22 nganga 2)2)
00000025 ESP 00000040
Instruksioni CALL bën
push vlerën 00000025
EIP
push vlerën 00000025
mbi stivë, dhe ngarkon
00000040 në EIP
00000025 ESP
EIP
00000025Instruksioni RET bën pop
vlerën 00000025 nga
stiva në EIP
EIP
(stiva paraekzekutimit të instruksionit RET)
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
40
(stiva paraekzekutimit të instruksionit RET)
Thirrje e përsëritur(Thirrje e përsëritur(NestedNested)) ProProççeduredurashash
main PROC
.
.
call Sub1
exit
Gjatë kohës që thirret, the stiva
përmban të tre adresat që do
main ENDP
Sub1 PROC
.
.
(ret to main)
përmban të tre adresat që do
kthehen:
call Sub2
ret
Sub1 ENDP
Sub2 PROC
.
(ret to main)
(ret to Sub1)
(ret to Sub2) ESP.
.
call Sub3
ret
Sub2 ENDP
(ret to Sub2) ESP
Sub3 PROC
.
.
ret
Sub3 ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
41
Sub3 ENDP
Etiketa(Etiketa(LabelsLabels)) LoLokkalalee ddhehe GlobalGlobalee
Një etiketë lokale është e dallueshme vetëm te instruksionet
brenda së njëjtës proçedurë. Një etiketë globale është e
dallueshme kudo.
main PROC
jmp L2 ; gabim(error)
L1:: ; etiketë globale
dallueshme kudo.
L1:: ; etiketë globale
exit
main ENDP
sub2 PROC
L2: ; etiketë locale
jmp L1 ; ok
retret
sub2 ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
42
ParametParametrara ProProççedureduree (1(1 nganga 3)3)
• Një proçedurë e mirë mund të jetë e përshtatshme• Një proçedurë e mirë mund të jetë e përshtatshme
për përdorim në shumë programe të ndryshme
• Por jo nëse ajo referohet në emra specifik variablash
• Parametrat ndihmojnë për t’i bërë proçedurat më
elastike për arsye se vlerat e parametrave mund të
ndryshohen gjatë kohës së ekzekutimitndryshohen gjatë kohës së ekzekutimit
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
43
ParametParametrara ProProççedureduree ((22 nganga 3)3)
ArraySum PROC
Proçedura ArraySum llogarit shumën e një matrice. Ajo i
referohet dy emrave specifik variablash:
ArraySum PROC
mov esi,0 ; indeksi i matricës
mov eax,0 ; vendos shumën në zero
mov ecx,LENGTHOF myarray ; vendos numrin e elementeve
L1: add eax,myArray[esi] ; shton çdo numër te shuma
add esi,4 ; tregon te numri tjetër
loop L1 ; përserit sipas përmasave të
; matricës; matricës
mov theSum,eax ; ruan shumën
ret
ArraySum ENDP
Si do llogaritnit shumën e dy ose tre matricave me të njëjtin
program?
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
44
ParametParametrara ProProççedureduree ((33 nganga 3)3)
Ky version i ArraySum kthen shumën e çfarëdo matrice të tipit
doubleword adresa e së cilës ndodhet në ESI. Shuma kthehet
në EAX:
ArraySum PROC
; Përcepton: ESI tregon në një matricë me doublewords,
; ECX = numri elementeve të matricës.
; Kthen: EAX = shuma
në EAX:
; Kthen: EAX = shuma
;-----------------------------------------------------
mov eax,0 ; vendos shumën në zero
L1: add eax,[esi] ; shton çdo numër te shumaL1: add eax,[esi] ; shton çdo numër te shuma
add esi,4 ; tregon te numri tjetër
loop L1 ; përserit sipas përmasave
; të matricës
retret
ArraySum ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
45
SSiimbolmbole Bllokskemash(e Bllokskemash(FlowchartFlowchart))
• Simbolet që vijojnë janë simbolet bazë për ndërtimin
e bllokskemave(flowcharts):
begin / end
manual input
process (task) display
decision
procedure
call
yes
nono
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
46
Bllokskema përBllokskema për
begin
ArraySum Procedure
Bllokskema përBllokskema për
ProProççeduredurënën
ArraySumArraySum
begin
push esi, ecx
ArraySumArraySum eax = 0
add eax,[esi] push esi
push ecx
mov eax,0
add esi, 4
ecx = ecx − 1
mov eax,0
AS1:
add eax,[esi]
add esi,4
loop AS1
ecx > 0?
yes
no
pop ecx
pop esi
no
pop ecx, esi
end
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
47
Rradha JuajRradha Juaj. . .. . .
Ndërtoni një bllokskemë që shpreh
pseudokodin që vijon:pseudokodin që vijon:
Merr si hyrje notën e kontrollit nga përdoruesi
if( nota > 70 )
afisho “Kalon"
elseelse
afisho “Përserit"
endifendif
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
48
. . . (. . . (ZgjidhjaZgjidhja)) beginFillim
input exam gradeinput exam grade
yesno
Kalo noten e kontrollit
grade > 70?
yesno
Nota
Afisho Afishodisplay "Pass"display "Fail"
Afisho
“Kalon”
Afisho
“Përserit”
end
Fund
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
49
Rradha JuajRradha Juaj. . .. . .
• Modifiko bllokskemën e mësipërme në mënyrë që
përdoruesi të kalojë nota kontrolli derisa të shtypetpërdoruesi të kalojë nota kontrolli derisa të shtypet
• –1
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
50
OperatorOperatorii USESUSES
• Shfaq listën e regjistrave që ruhen
ArraySum PROC USES esi ecx
mov eax,0 ; vendos shumën në zeromov eax,0 ; vendos shumën në zero
etc.
MASM gjeneron kodin që duket me gold:MASM gjeneron kodin që duket me gold:
ArraySum PROC
push esi
push ecxpush ecx
.
.
pop ecxpop ecx
pop esi
ret
ArraySum ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
51
Kur nuk duhet të bëjmëKur nuk duhet të bëjmë pushpush njënjë regregjjististëërr
Shuma e tre regjistrave ruhet në EAX në rreshtin (3), por
instruksioni POP e zevëndëson atë me vlerën fillestare të EAX
në rreshtin (4):
SumOf PROC ; shuma e tre numrave të plotë
push eax ; 1
në rreshtin (4):
push eax ; 1
add eax,ebx ; 2
add eax,ecx ; 3
pop eax ; 4pop eax ; 4
ret
SumOf ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
52
Në vazhdimNë vazhdim
• Lidhja me një Librari të Jashtme• Lidhja me një Librari të Jashtme
• Libraria e Lidhur Book
• Operime stive(stack)
• Përcaktimi dhe përdorimi i proçedurave
• Projektimi i programit duke përdorur Proçedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
53
ProjektimiProjektimi ii programitprogramit dukeduke përdorurpërdorur
ProçeduratProçeduratProçeduratProçedurat
• Top-Down Design (Zbërthimi funksional) përfshin sa• Top-Down Design (Zbërthimi funksional) përfshin sa
vijojnë:
• dizenjoni programin tuaj para se të filloni të kodoni
• ndani detyrat e mëdha në më të vogla
• përdorni strukture hierarkike të bazuar në thirrje
proçedureproçedure
• testoni veç proçedurat individuale
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
54
ProgramProgramii Mbledhja e Numrave të plotëMbledhja e Numrave të plotë(1(1 nganga 4)4)
Përshkrimi: Shkruani një program që nxit përdoruesin
për kalimin shumë numrave të plotë 32-bit, i ruan ato nëpër kalimin shumë numrave të plotë 32-bit, i ruan ato në
një matricë, llogarit shumën e matricës, dhe e shfaq atë
në ekran.
Hapat kryesorë:
• Nxit përdoruesin për kalimin shumë numrave• Nxit përdoruesin për kalimin shumë numrave
• Llogarit shumën e matricës
• Afisho shumën• Afisho shumën
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
55
ProProççedureduraa DesignDesign (2(2 nganga 4)4)
Main
Clrscr ; pastron ekraninClrscr ; pastron ekranin
PromptForIntegers
WriteString ; afishon stringun
ReadInt ; lexon integer
ArraySum ; shuma e numr. të plotë
DisplaySumDisplaySum
WriteString ; afishon stringun
WriteInt ; afishon numrin e plotëWriteInt ; afishon numrin e plotë
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
56
StruStrukkturturaa ChartChart (3(3 nganga 4)4)
Summation
Program (main)
Clrscr PromptForIntegers ArraySum DisplaySum
WriteStringWriteString ReadInt WriteIntWriteInt
Ngjyra gri
tregon
proceduraprocedura
librarie
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
57
ShembullShembull Daljeje(Daljeje(OutputOutput)) (4(4 nganga 4)4)
Kalo një nr të plotë me shenjë: 550
Kalo një nr të plotë me shenjë : -23
Kalo një nr të plotë me shenjë : -96Kalo një nr të plotë me shenjë : -96
Shuma e numrave të plotë është: +431
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
58
PërmbledhjePërmbledhje
• Proçedura –bllok i emertuar kodi të ekzekutueshëm
• Runtime stack – strukturë LIFO• Runtime stack – strukturë LIFO
• mban adresat e kthyera, parametrat, variablat lokalë
• PUSH – shton një vlerë te stiva(stack)
• POP – heq vlerën nga stiva• POP – heq vlerën nga stiva
• Përdorni librarinë Irvine32 për të gjitha H/D standarte
dhe konvertimet e të dhenavedhe konvertimet e të dhenave
• Deshironi të dini më shumë? Studioni librarinë me
kodin burimor në dosjen c:IrvineExamplesLib32
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
59
FundFund
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
60

More Related Content

Viewers also liked

Informatika - Viti i pare
Informatika - Viti i pareInformatika - Viti i pare
Informatika - Viti i pareTarget
 
Limiti i Funksionit USHTRIME
Limiti i Funksionit USHTRIMELimiti i Funksionit USHTRIME
Limiti i Funksionit USHTRIMELiridon Muqaku
 
Psikologji pp-permbledhje
Psikologji pp-permbledhjePsikologji pp-permbledhje
Psikologji pp-permbledhjeArton Feta
 

Viewers also liked (7)

Informatika - Viti i pare
Informatika - Viti i pareInformatika - Viti i pare
Informatika - Viti i pare
 
Limiti i vargut
Limiti i vargutLimiti i vargut
Limiti i vargut
 
Limiti i Funksionit USHTRIME
Limiti i Funksionit USHTRIMELimiti i Funksionit USHTRIME
Limiti i Funksionit USHTRIME
 
Psikologji pp-permbledhje
Psikologji pp-permbledhjePsikologji pp-permbledhje
Psikologji pp-permbledhje
 
LEKSIONE ....SHKRIM AKADEMIK
  LEKSIONE ....SHKRIM AKADEMIK   LEKSIONE ....SHKRIM AKADEMIK
LEKSIONE ....SHKRIM AKADEMIK
 
Fusha Magnetike
Fusha MagnetikeFusha Magnetike
Fusha Magnetike
 
M.H. Psikologji
M.H. PsikologjiM.H. Psikologji
M.H. Psikologji
 

Leksione 9 & 10

  • 1. Leksione 9-10: ProçeduratLeksione 9-10: Proçedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
  • 2. HyrjeHyrje • Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme • Libraria e lidhur Book • Operime Stive(stack) • Përcaktimi dhe përdorimi i Proçedurave • Projektimi i programit duke përdorur Procedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 2
  • 3. Libraria e LidhLibraria e Lidhuurr BookBook • Hyrje në Libraritë e Lidhura• Hyrje në Libraritë e Lidhura • Thirrja e një proçedure Librarie • Lidhja me një Library • Proçedura Librarie – Hyrje• Proçedura Librarie – Hyrje • Gjashtë Shembuj Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 3
  • 4. Hyrje nëHyrje në LibrarLibraritë e Lidhitë e Lidhuurara • Një skedar që përmban proçedura të kompiluara në kod makine • I konstruktuar nga një ose më shumë skedarë OBJ • Për të ndërtuar një librari, . . . • Fillojmë me një ose më shumë skedare burimorë ASM• Fillojmë me një ose më shumë skedare burimorë ASM • Asemblojmë secilin prej tyre në skedarë OBJ • Krijojmë një skedar libtarie bosh(prapashtesa .LIB)• Krijojmë një skedar libtarie bosh(prapashtesa .LIB) • Shtojmë skedarin(et) OBJ te skedari i librarisë, duke përdorur programin ndihmësndihmës -- Microsoft LIB utility Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 4
  • 5. Thirrja e njëThirrja e një ProProççedureedure LibrarLibrarieie • Thirrja e një Proçedure Librarie me përdorimin e instrunksionit CALL. Disa proçedura kërkojnë argumentë hyres. Direktiva INCLUDE kopjon prototipet e proçeduravehyres. Direktiva INCLUDE kopjon prototipet e proçedurave (deklarations). • Shembulli i mëposhtëm afishon në konsolë "1234": INCLUDE Irvine32.inc .code mov eax,1234h ; argumenti hyrës • Shembulli i mëposhtëm afishon në konsolë "1234": mov eax,1234h ; argumenti hyrës call WriteHex ; shfaq numrin hex call Crlf ; fundi i rreshtit Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 5
  • 6. LiLidhjadhja me njëme një LibrarLibrarii • Programet lidhen te libraria Irvine32.lib duke përdorur komandën e lidhësit (linker) brenda një skedari batch me emër make32.bat. • Vini re dy skedaret LIB: Irvine32.lib, dhe kernel32.lib• Vini re dy skedaret LIB: Irvine32.lib, dhe kernel32.lib • Skedari i fundit është pjesë e Microsoft Win32 Software Development Kit (SDK) Your program Irvine32.lib links to links to Programi JuajProgrami Juaj kernel32.lib executes links to can link to kernel32.dll executes Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 6
  • 7. Në vazhdimNë vazhdim • Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme • Libraria e lidhur Book • Operime Stive(stack) • Përcaktimi dhe përdorimi i Proçedurave • Projektimi i programit duke përdorur Procedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 7
  • 8. ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje (1(1 nganga 4)4) CloseFile – Mbyll një skedar disku të hapur Clrscr – Mbyll konsolen, lokalizon kursorin në këndin e majtë lartClrscr – Mbyll konsolen, lokalizon kursorin në këndin e majtë lart CreateOutputFile – Krijon skedar të ri disku për shkrim në output mode Crlf – Shkruan sekuencën e fundit të rreshtit te dalja standarte Delay - Ndalon ekzekutimin e programit për interval n milisekonda DumpMem - Shkruan bllokun e kujtesës te dalja standarte në hex DumpRegs – Afishon regjistrat e përdorimit të përgjithshëm dhe flamujt (në hex)DumpRegs – Afishon regjistrat e përdorimit të përgjithshëm dhe flamujt (në hex) GetCommandtail – Kopjon command-line args në tabelë bytesh GetMaxXY - Merr numrat e kolonave, rreshtave në baferin e dritarës së konsoles GetMseconds - Kthen milisekondat e kaluara nga mesnataGetMseconds - Kthen milisekondat e kaluara nga mesnata Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 8
  • 9. ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((22 nganga 4)4) GetTextColor – Kthen ngjyrat e sfondit dhe të planit të parë të tekstit aktiv në dritarën e konsolës Gotoxy - Lokalizon kursorin te rreshti dhe shtylla në konsolë IsDigit - Vendos flamurin Zero nëse AL përmban kod ASCII për shifrat dixhitale dhjetore (0–9) MsgBox, MsgBoxAsk – Afishon boks mesazhi popup OpenInputFile – Hap skedar ekzistues për hyrje ParseDecimal32 – Konverton string integer pa shenjë në binar ParseInteger32 - Konverton string integer me shenjë në binarParseInteger32 - Konverton string integer me shenjë në binar Random32 - Gjeneron numër të plotë 32-bit pseudo të rastit në rangun nga 0 në FFFFFFFFh Randomize – Përcakton elementin e gjeneratorit numrave të rastitRandomize – Përcakton elementin e gjeneratorit numrave të rastit RandomRange - Gjeneron numër të plotë pseudo të rastit në një rang specifik ReadChar – Lexon një karakter të vetëm nga hyrja standarte Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 9 ReadChar – Lexon një karakter të vetëm nga hyrja standarte
  • 10. ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((33 nganga 4)4) ReadFromFile – Lexon një skedar disku të hapur për hyrje në një buffer ReadDec - Lexon 32-bit numër dhjetor të plotë pa shenjë nga tastiera ReadHex - Lexon 32-bit numër hexadecimal të plotë nga tastieraReadHex - Lexon 32-bit numër hexadecimal të plotë nga tastiera ReadInt - Lexon 32-bit numër dhjetor të plotë pa shenjë nga tastiera ReadKey – Lexon një karakter nga buffer-i i hyrjes së tastierës ReadString – Lexon një string nga Hyrja standarte, e përfunduar nga [Enter] SetTextColor – Vendos ngjyrat e planit të parë dhe sfondit të të gjithë nënsekuencave të tekstit të dalë në konsolë StrLength – Kthen gjatësinë e një vargu karakteresh (string) WaitMsg – Afishon një mesazh, pret për shtypjen e tastit Enter WriteBin – Shkruan numër të plotë 32-bit pa shenjë në format binar ASCII.WriteBin – Shkruan numër të plotë 32-bit pa shenjë në format binar ASCII. WriteBinB – Shkruan një numër të plotë në format byte, word, ose doubleword WriteChar – Shkruan një karakter të vetëm në Daljen standarte Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 10
  • 11. ProProççedureduraa LibrarLibrarieie -- HyrjeHyrje ((44 nganga 4)4) WriteDec – Shkruan një numër të plote 32-bit pa shenjë në format dhjetor WriteHex - Shkruan një numër të plote 32-bit pa shenjë në format hexadecimal WriteHexB – Shkruan byte, word, ose doubleword në format hexadecimal WriteInt - Shkruan një numër të plote 32-bit me shenjë në format dhjetor WriteString – Shkruan string të përfunduar me null te dritarja e konsolësWriteString – Shkruan string të përfunduar me null te dritarja e konsolës WriteToFile - Shkruan buffer-in në një skedar të hapur për Dalje(output file) WriteWindowsMsg – Afishon mesazhin e gabimit më aktual të gjenëruar nga MS-WindowsMS-Windows Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 11
  • 12. ShembullShembull 11 Pastron ekranin, vonon programin për 500 milisekonda, pastaj zbraz flamujtë dhe regjistrat. .code call Clrscr mov eax,500mov eax,500 call Delay call DumpRegs EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000 Shembull Daljeje(output): EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000 ESI=00000000 EDI=00000100 EBP=0000091E ESP=000000F6 EIP=00401026 EFL=00000286 CF=0 SF=1 ZF=0 OF=0 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 12
  • 13. ShembullShembull 22 Afishon një string të përfunduar me null dhe zhvendos kursorin në krye të rreshtit tjetër të ekranit. .data str1 BYTE “Gjuha Assembly është e thjeshtë!",0 .code mov edx,OFFSET str1 call WriteStringcall WriteString call Crlf Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 13
  • 14. ShembullShembull 2a2a Afishon një string të përfunduar me null dhe zhvendos kursorin në krye të rreshtit tjetër të ekranit (përdor çiftin e ndërthhurur CR/LF). .data str1 BYTE "Assembly language is easy!",0Dh,0Ah,0 e ndërthhurur CR/LF). str1 BYTE "Assembly language is easy!",0Dh,0Ah,0 .code mov edx,OFFSET str1 call WriteStringcall WriteString Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 14
  • 15. ShembullShembull 33 IntVal = 35 Afishon një numër të plotë pa shenjë në format binar, dhjetor, dhe hexadecimal, secili në një rresht të veçantë. IntVal = 35 .code mov eax,IntVal call WriteBin ; display binarycall WriteBin ; display binary call Crlf call WriteDec ; display decimal call Crlf call WriteHex ; display hexadecimalcall WriteHex ; display hexadecimal call Crlf Shembull Daljeje(output): 0000 0000 0000 0000 0000 0000 0010 0011 35 23 Shembull Daljeje(output): Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 15 23
  • 16. SembullSembull 44 Pret një hyrje stringu nga përdoruesi. EDX tregon te stringu dhe ECX përcakton numrin maksimal të karakterëve që përdoruesi lejohet të kalojë. .data fileName BYTE 80 DUP(0) lejohet të kalojë. fileName BYTE 80 DUP(0) .code mov edx,OFFSET fileNamemov edx,OFFSET fileName mov ecx,SIZEOF fileName – 1 call ReadString Një byte null shtohet automatikisht te stringu. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 16
  • 17. ShembullShembull 55 Gjëneron dhe afishon 10 numra të plotë pseudo të rastit me shenjë në rangun 0 – 99. E kalon çdo numër të tillë të plotë te WriteInt në EAX dhe e afishon atë në rresht të veçantë. .code mov ecx,10 ; loop counter WriteInt në EAX dhe e afishon atë në rresht të veçantë. mov ecx,10 ; loop counter L1: mov eax,100 ; ceiling value call RandomRange ; generate random int call WriteInt ; display signed intcall WriteInt ; display signed int call Crlf ; goto next display line loop L1 ; repeat loop Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 17
  • 18. ShembullShembull 66 Afishon një string të përfunduar me null, me karaktere të verdha në sfond blu. .data str1 BYTE "Color output is easy!",0 .code mov eax,yellow + (blue * 16) call SetTextColorcall SetTextColor mov edx,OFFSET str1 call WriteString call Crlf Ngjyra e sfondit para se t’i shtohet ngjyrës së planit të parë shumëzohet me 16. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 18 shumëzohet me 16.
  • 19. Në vazhdimNë vazhdim • Lidhja me një Librari të jashtme• Lidhja me një Librari të jashtme • Libraria e lidhur Book • Operime Stive(stack) • Përcaktimi dhe përdorimi i Proçedurave • Projektimi i programit duke përdorur Proçedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 19
  • 20. OperOperime Stive(stack)ime Stive(stack) • Stiva gjatë kohës së ekzekutimit (Runtime Stack)• Stiva gjatë kohës së ekzekutimit (Runtime Stack) • Operimi PUSH • Operimi POP • Instruksionet PUSH dhe POP • Përdorimi i instruksioneve PUSH dhe POP • Shembull: Këmbim i mbrapshtë i një Stringu• Shembull: Këmbim i mbrapshtë i një Stringu • Instruksione që kanë të bejnë me stivën. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 20
  • 21. StStiva gjatë kohës së ekzekutimitiva gjatë kohës së ekzekutimit • Imagjinoni një stivë pjatash . . . • Pjatat shtohen vetëm nga kreu(top) • Pjatat hiqen vetëm nga kreu(top) • Struktura LIFO 7 8 9 10 top 2 3 4 5 6 7 1 2 bottom Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 21
  • 22. StStiva gjatë kohës së ekzekutimitiva gjatë kohës së ekzekutimit • Menaxhohet nga NJ.Q.P.(CPU), duke përdorur dy regjistra • SS (stack segment) • ESP (stack pointer) * Offset 00000006 ESP 00001000 00000FFC 00000FF8 00000FF4 00000FF0 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 22 * SP në Mënyrën Reale të Adresimit
  • 23. OperiOperimimi PUSHPUSH (1(1 nganga 2)2) • Një operim 32-bit push zvogëlon treguesin e stives me 4 dhe kopjon vlerën e vendndodhjes së treguar nga treguesi i stivës.nga treguesi i stivës. BEFORE AFTER 00000006 00000006 ESP 00001000 00000FFC 000000A5 ESP00001000 00000FFC 00000FF8 00000FF4 00000FF0 00000FF8 00000FF4 00000FF0 00000FF000000FF0 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 23
  • 24. OperiOperimimi PUSHPUSH (2(2 nganga 2)2) • E njëjta stivë pas vendosjes së dy numrave të tjerë të plotë: Offset 0000000600001000 Offset 00000FFC 000000A5 ESP 00000FF8 00000FF4 00000001 00000002 00000FF0 Stiva rritet për nga poshtë stives. Hapësira nën treguesin ESP është gjithnjë e disponueshme (përveç rastit kur stiva tejmbushet[overflowed]). Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 24 tejmbushet[overflowed]).
  • 25. OperiOperimimi POPPOP • Kopjon vlerën e stivës stack[ESP] në një regjistër ose variabël. • Shton n te treguesi ESP, ku n është ose 2 ose 4. • Vlera e n-së varet nga atributi i operandit që merr të dhenat• Vlera e n-së varet nga atributi i operandit që merr të dhenat BEFORE AFTER 00000006 000000A5 00000006 000000A5 00001000 00000FFC 00001000 00000FFC000000A5 00000001 00000002 ESP 000000A5 00000001 ESP 00000FFC 00000FF8 00000FF4 00000FFC 00000FF8 00000FF4 00000FF0 00000FF0 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 25
  • 26. InstruInstruksksionionëtët PUSH dPUSH dhehe POPPOP • PUSH sintaksa: • PUSH r/m16• PUSH r/m16 • PUSH r/m32 • PUSH imm32• PUSH imm32 • POP sintaksa: • POP r/m16 • POP r/m32 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 26
  • 27. Përdorimi iPërdorimi i PUSH dPUSH dhehe POPPOP Ruajnë dhe rimarrin vlerat e regjistrave kur ato përmbajnë vlera të rendësishme. Instruksionet PUSH dhe POP përseritën në rend të kundërt. push esi ; push regjistrat push ecx rend të kundërt. push ecx push ebx mov esi,OFFSET dwordVal ; afisho një kujtesë mov ecx,LENGTHOF dwordValmov ecx,LENGTHOF dwordVal mov ebx,TYPE dwordVal call DumpMem pop ebx ; rimerr regjistrat pop ecx pop esi Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 27
  • 28. ShembullShembull:: Cikël i përseritur(Cikël i përseritur(Nested LoopNested Loop)) Kur krijojmë një cikël të përseritur, para se të futemi te cikli i brendshëm, bëjmë push numëruesin e ciklit të jashtëm : mov ecx,100 ; vendos numeruesin e ciklit të jashtëm L1: ; fillon cikli i jashtëm push ecx ; ruan numëruesin e ciklit të jashtëmpush ecx ; ruan numëruesin e ciklit të jashtëm mov ecx,20 ; vendos numeruesin e ciklit të brendshëm L2: ; fillon cikli i brendshëmL2: ; fillon cikli i brendshëm ; ; loop L2 ; përserit ciklin e brendshëmloop L2 ; pop ecx ; rimerr numeruesin e ciklit të jashtëm loop L1 ; përserit ciklin e jashtëm Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 28
  • 29. ShembullShembull:: KembimKembim ii mbrapshtëmbrapshtë ii njënjë StringuStringu • Përdorim një cikël me adresim të indeksuar • Bejmë Push çdo karakter në stivë• Bejmë Push çdo karakter në stivë • Fillojmë me kreun e stringut, bejmë pop stivën në rend të kundërt, ndërfutim çdo karakter mbrapa te stringu • Kodi burimor• Kodi burimor • Pyetje: Pse duhet vendosur çdo karakter në EAX para se të behet push? Sepse vetëm vlera word (16-bit) ose doubleword (32-bit) mund të bëhen push në stivë. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 29
  • 30. Rradha JuajRradha Juaj. . .. . . • Duke përdorur si pikë fillimi programin e Këmbimit të mbrapshtë të një Stringu, • #1: Modifikoni programin në mënyrë që përdoruesi të mund të bejë hyrje të një stringu që përmban nga 1 deri në 50të bejë hyrje të një stringu që përmban nga 1 deri në 50 karaktere. • #2: Modifikoni programin në mënyrë që ai të bejë hyrje një• #2: Modifikoni programin në mënyrë që ai të bejë hyrje një listë me numra të plotë 32-bitësh nga përdoruesi, dhe pastaj të afishojë numrat me renditje të kundert. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 30
  • 31. Instruksione tInstruksione të tjera Stiveë tjera Stive • PUSHFD dhe POPFD • Bën push dhe pop registrin EFLAGS• Bën push dhe pop registrin EFLAGS • PUSHAD ben push regjistrat me qëllim të përgjithshëm me 32-bit në stivëme 32-bit në stivë • renditja: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI • POPAD bën pop të njëjtat regjistra si më sipër nga stiva me renditje të kundërtme renditje të kundërt • PUSHA dhe POPA bëjnë të njëjtën gje për regjistrat me 16-bit16-bit Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 31
  • 32. Rradha JuajRradha Juaj. . .. . . • Shkruani një program që bën sa vijojnë:• Shkruani një program që bën sa vijojnë: • Përcakton vlera të plota te EAX, EBX, ECX, EDX, ESI, dhe EDI • Përdor PUSHAD për të bërë push regjistrat me qëllim• Përdor PUSHAD për të bërë push regjistrat me qëllim të përgjithshëm në stivë • Duke përdorur një cikël, programi juaj duhet të bëjë pop çdo numër të plotë nga stiva dhe ta afishojë atë nëpop çdo numër të plotë nga stiva dhe ta afishojë atë në ekran Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 32
  • 33. Në vazhdimNë vazhdim • Lidhja me një Librari të Jashtme• Lidhja me një Librari të Jashtme • Libraria e Lidhur Book • Operime stive(stack) • Përcaktimi dhe përdorimi i proçedurave • Projektimi i programit duke përdorur Proçedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 33
  • 34. Përcaktimi dhe përdorimi iPërcaktimi dhe përdorimi i ProProççedureduraveave • Krijimi i Proçedurave • Dokumentimi i Proçedurave• Dokumentimi i Proçedurave • Shembull: Proçedura SumOf • Instruksionet CALL dhe RET• Instruksionet CALL dhe RET • Proçedura e përsëritur Calls • Etiketa(Labels) Lokale dhe Globale• Etiketa(Labels) Lokale dhe Globale • Parametra Proçedure • Symbole Flowchart• Symbole Flowchart • Operatori USES Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 34
  • 35. Ndërtimi iNdërtimi i ProProççedureduraveave • Probleme të mëdha mund të ndahen në probleme më të vogla për t’i bërë ato më të menaxhueshme • Një procedure është ekuivalentja ASM e një funksioni• Një procedure është ekuivalentja ASM e një funksioni Java ose C++ • Më poshtë vijon një proçedurë në gjuhë assembly e• Më poshtë vijon një proçedurë në gjuhë assembly e quajtur shembull: shembull PROCshembull PROC . . ret shembull ENDPshembull ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 35
  • 36. DoDokkumentiumentimimi ii ProProççedureduraveave • Një përshkrim i të gjitha detyrave që kryhen nga proçedura. Dokumentacion i sugjeruar për çdo proçedurë: • Një përshkrim i të gjitha detyrave që kryhen nga proçedura. • Merr(Receives): Një list me parametra hyrjeje; forma e përdorimit të tyre dhe kërkesat. • Kthen(Returns): Një përshkrim i vlerave të kthyera nga proçedura. • Kërkon(Requires): Listë fakultative e kërkesave të quajtura kushte paraprake(preconditions) që duhet të kënaqen para se tëkushte paraprake(preconditions) që duhet të kënaqen para se të thirret proçedura. Nëse proçedura thirret pa kënaqur kushtet paraprake, ajo mund të mos prodhojë daljen e pritur. Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 36
  • 37. ShembullShembull: Pro: Proççedureduraa SumOfSumOf ;--------------------------------------------------------- SumOf PROCSumOf PROC ; ; Llogarit dhe kthen shumën e tre numrave të plotë 32-bit. ; Percepton: EAX, EBX, ECX, si tre numra të plotë. Mund të ; jenë me apo pa shenjë.; jenë me apo pa shenjë. ; Kthen: EAX = shuma, dhe gjendjen e flamujve(Carry, ; Overflow, etj.) që ndryshon. ; Kërkesat: asnjë ;---------------------------------------------------------;--------------------------------------------------------- add eax,ebx add eax,ecx ret SumOf ENDPSumOf ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 37
  • 38. InstruInstruksionetksionet CALL dCALL dhehe RETRET • Instruksioni CALL thërret një proçedurë• Instruksioni CALL thërret një proçedurë • Bën push ofset-in e instruksionit pasardhës në stivë • Kopjon adresën e proçedurës së thirrur në EIP • Instruksioni RET na kthen nga një proçedurë• Instruksioni RET na kthen nga një proçedurë • Bën pop kreun e stivës në EIP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 38
  • 39. Shembull meShembull me CALLCALL--RETRET (1(1 nganga 2)2) main PROC 00000020 call MySub 0000025 është ofset-i i 00000020 call MySub 00000025 mov eax,ebx . . main ENDP 0000025 është ofset-i i instruksionit që vjen menjëherë pas instruksionit CALL main ENDP MySub PROC 00000040 mov eax,edx00000040 është ofset-i i . . ret MySub ENDP 00000040 është ofset-i i instruksionit të parë brenda MySub MySub ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 39
  • 40. Shembull meShembull me CALLCALL--RETRET ((22 nganga 2)2) 00000025 ESP 00000040 Instruksioni CALL bën push vlerën 00000025 EIP push vlerën 00000025 mbi stivë, dhe ngarkon 00000040 në EIP 00000025 ESP EIP 00000025Instruksioni RET bën pop vlerën 00000025 nga stiva në EIP EIP (stiva paraekzekutimit të instruksionit RET) Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 40 (stiva paraekzekutimit të instruksionit RET)
  • 41. Thirrje e përsëritur(Thirrje e përsëritur(NestedNested)) ProProççeduredurashash main PROC . . call Sub1 exit Gjatë kohës që thirret, the stiva përmban të tre adresat që do main ENDP Sub1 PROC . . (ret to main) përmban të tre adresat që do kthehen: call Sub2 ret Sub1 ENDP Sub2 PROC . (ret to main) (ret to Sub1) (ret to Sub2) ESP. . call Sub3 ret Sub2 ENDP (ret to Sub2) ESP Sub3 PROC . . ret Sub3 ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 41 Sub3 ENDP
  • 42. Etiketa(Etiketa(LabelsLabels)) LoLokkalalee ddhehe GlobalGlobalee Një etiketë lokale është e dallueshme vetëm te instruksionet brenda së njëjtës proçedurë. Një etiketë globale është e dallueshme kudo. main PROC jmp L2 ; gabim(error) L1:: ; etiketë globale dallueshme kudo. L1:: ; etiketë globale exit main ENDP sub2 PROC L2: ; etiketë locale jmp L1 ; ok retret sub2 ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 42
  • 43. ParametParametrara ProProççedureduree (1(1 nganga 3)3) • Një proçedurë e mirë mund të jetë e përshtatshme• Një proçedurë e mirë mund të jetë e përshtatshme për përdorim në shumë programe të ndryshme • Por jo nëse ajo referohet në emra specifik variablash • Parametrat ndihmojnë për t’i bërë proçedurat më elastike për arsye se vlerat e parametrave mund të ndryshohen gjatë kohës së ekzekutimitndryshohen gjatë kohës së ekzekutimit Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 43
  • 44. ParametParametrara ProProççedureduree ((22 nganga 3)3) ArraySum PROC Proçedura ArraySum llogarit shumën e një matrice. Ajo i referohet dy emrave specifik variablash: ArraySum PROC mov esi,0 ; indeksi i matricës mov eax,0 ; vendos shumën në zero mov ecx,LENGTHOF myarray ; vendos numrin e elementeve L1: add eax,myArray[esi] ; shton çdo numër te shuma add esi,4 ; tregon te numri tjetër loop L1 ; përserit sipas përmasave të ; matricës; matricës mov theSum,eax ; ruan shumën ret ArraySum ENDP Si do llogaritnit shumën e dy ose tre matricave me të njëjtin program? Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 44
  • 45. ParametParametrara ProProççedureduree ((33 nganga 3)3) Ky version i ArraySum kthen shumën e çfarëdo matrice të tipit doubleword adresa e së cilës ndodhet në ESI. Shuma kthehet në EAX: ArraySum PROC ; Përcepton: ESI tregon në një matricë me doublewords, ; ECX = numri elementeve të matricës. ; Kthen: EAX = shuma në EAX: ; Kthen: EAX = shuma ;----------------------------------------------------- mov eax,0 ; vendos shumën në zero L1: add eax,[esi] ; shton çdo numër te shumaL1: add eax,[esi] ; shton çdo numër te shuma add esi,4 ; tregon te numri tjetër loop L1 ; përserit sipas përmasave ; të matricës retret ArraySum ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 45
  • 46. SSiimbolmbole Bllokskemash(e Bllokskemash(FlowchartFlowchart)) • Simbolet që vijojnë janë simbolet bazë për ndërtimin e bllokskemave(flowcharts): begin / end manual input process (task) display decision procedure call yes nono Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 46
  • 47. Bllokskema përBllokskema për begin ArraySum Procedure Bllokskema përBllokskema për ProProççeduredurënën ArraySumArraySum begin push esi, ecx ArraySumArraySum eax = 0 add eax,[esi] push esi push ecx mov eax,0 add esi, 4 ecx = ecx − 1 mov eax,0 AS1: add eax,[esi] add esi,4 loop AS1 ecx > 0? yes no pop ecx pop esi no pop ecx, esi end Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 47
  • 48. Rradha JuajRradha Juaj. . .. . . Ndërtoni një bllokskemë që shpreh pseudokodin që vijon:pseudokodin që vijon: Merr si hyrje notën e kontrollit nga përdoruesi if( nota > 70 ) afisho “Kalon" elseelse afisho “Përserit" endifendif Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 48
  • 49. . . . (. . . (ZgjidhjaZgjidhja)) beginFillim input exam gradeinput exam grade yesno Kalo noten e kontrollit grade > 70? yesno Nota Afisho Afishodisplay "Pass"display "Fail" Afisho “Kalon” Afisho “Përserit” end Fund Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 49
  • 50. Rradha JuajRradha Juaj. . .. . . • Modifiko bllokskemën e mësipërme në mënyrë që përdoruesi të kalojë nota kontrolli derisa të shtypetpërdoruesi të kalojë nota kontrolli derisa të shtypet • –1 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 50
  • 51. OperatorOperatorii USESUSES • Shfaq listën e regjistrave që ruhen ArraySum PROC USES esi ecx mov eax,0 ; vendos shumën në zeromov eax,0 ; vendos shumën në zero etc. MASM gjeneron kodin që duket me gold:MASM gjeneron kodin që duket me gold: ArraySum PROC push esi push ecxpush ecx . . pop ecxpop ecx pop esi ret ArraySum ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 51
  • 52. Kur nuk duhet të bëjmëKur nuk duhet të bëjmë pushpush njënjë regregjjististëërr Shuma e tre regjistrave ruhet në EAX në rreshtin (3), por instruksioni POP e zevëndëson atë me vlerën fillestare të EAX në rreshtin (4): SumOf PROC ; shuma e tre numrave të plotë push eax ; 1 në rreshtin (4): push eax ; 1 add eax,ebx ; 2 add eax,ecx ; 3 pop eax ; 4pop eax ; 4 ret SumOf ENDP Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 52
  • 53. Në vazhdimNë vazhdim • Lidhja me një Librari të Jashtme• Lidhja me një Librari të Jashtme • Libraria e Lidhur Book • Operime stive(stack) • Përcaktimi dhe përdorimi i proçedurave • Projektimi i programit duke përdorur Proçedurat Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 53
  • 54. ProjektimiProjektimi ii programitprogramit dukeduke përdorurpërdorur ProçeduratProçeduratProçeduratProçedurat • Top-Down Design (Zbërthimi funksional) përfshin sa• Top-Down Design (Zbërthimi funksional) përfshin sa vijojnë: • dizenjoni programin tuaj para se të filloni të kodoni • ndani detyrat e mëdha në më të vogla • përdorni strukture hierarkike të bazuar në thirrje proçedureproçedure • testoni veç proçedurat individuale Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 54
  • 55. ProgramProgramii Mbledhja e Numrave të plotëMbledhja e Numrave të plotë(1(1 nganga 4)4) Përshkrimi: Shkruani një program që nxit përdoruesin për kalimin shumë numrave të plotë 32-bit, i ruan ato nëpër kalimin shumë numrave të plotë 32-bit, i ruan ato në një matricë, llogarit shumën e matricës, dhe e shfaq atë në ekran. Hapat kryesorë: • Nxit përdoruesin për kalimin shumë numrave• Nxit përdoruesin për kalimin shumë numrave • Llogarit shumën e matricës • Afisho shumën• Afisho shumën Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 55
  • 56. ProProççedureduraa DesignDesign (2(2 nganga 4)4) Main Clrscr ; pastron ekraninClrscr ; pastron ekranin PromptForIntegers WriteString ; afishon stringun ReadInt ; lexon integer ArraySum ; shuma e numr. të plotë DisplaySumDisplaySum WriteString ; afishon stringun WriteInt ; afishon numrin e plotëWriteInt ; afishon numrin e plotë Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 56
  • 57. StruStrukkturturaa ChartChart (3(3 nganga 4)4) Summation Program (main) Clrscr PromptForIntegers ArraySum DisplaySum WriteStringWriteString ReadInt WriteIntWriteInt Ngjyra gri tregon proceduraprocedura librarie Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 57
  • 58. ShembullShembull Daljeje(Daljeje(OutputOutput)) (4(4 nganga 4)4) Kalo një nr të plotë me shenjë: 550 Kalo një nr të plotë me shenjë : -23 Kalo një nr të plotë me shenjë : -96Kalo një nr të plotë me shenjë : -96 Shuma e numrave të plotë është: +431 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 58
  • 59. PërmbledhjePërmbledhje • Proçedura –bllok i emertuar kodi të ekzekutueshëm • Runtime stack – strukturë LIFO• Runtime stack – strukturë LIFO • mban adresat e kthyera, parametrat, variablat lokalë • PUSH – shton një vlerë te stiva(stack) • POP – heq vlerën nga stiva• POP – heq vlerën nga stiva • Përdorni librarinë Irvine32 për të gjitha H/D standarte dhe konvertimet e të dhenavedhe konvertimet e të dhenave • Deshironi të dini më shumë? Studioni librarinë me kodin burimor në dosjen c:IrvineExamplesLib32 Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 59
  • 60. FundFund Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine 60