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