Leksione 9 & 10
Transcript of Leksione 9 & 10
Leksione 9-10: ProçeduratLeksione 9-10: Proçedurat
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
HyrjeHyrje
• Lidhja me një Librar i të jashtme• Lidhja me një Librar i 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 Irvine2
Libraria e LidhLibraria e Lidhuur r 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 Irvine3
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ës ndihmës -- Microsoft LIB utility
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine4
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çedurave hyres. 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 ëscall WriteHex ; shfaq numrin hexcall Crlf ; fundi i rreshtit
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine5
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.liblinksto
links to
Programi JuajProgrami Juaj
kernel32.lib
executes
links to
can link to
kernel32.dll
executes
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine6
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 Irvine7
ProProççeduredura a 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 Irvine8
ProProççeduredura a 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 Irvine9
ReadChar – Lexon një karakter të vetëm nga hyrja standarte
ProProççeduredura a 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 Irvine10
ProProççeduredura a 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 Irvine11
ShembullShembull 11
Pastron ekranin, vonon programin për 500 milisekonda, pastaj zbraz flamujtë dhe regjistrat.
.codecall Clrscrmov eax,500mov eax,500call Delaycall 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 Irvine12
ShembullShembull 22
Afishon një string të përfunduar me null dhe zhvendos kursorin në krye të rreshtit tjetër të ekranit.
.datastr1 BYTE “Gjuha Assembly është e thjeshtë!",0
.codemov edx,OFFSET str1call WriteStringcall WriteStringcall Crlf
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine13
Shembull Shembull 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).
.datastr1 BYTE "Assembly language is easy!",0Dh,0Ah,0
e ndërthhurur CR/LF).
str1 BYTE "Assembly language is easy!",0Dh,0Ah,0
.codemov edx,OFFSET str1call WriteStringcall WriteString
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine14
ShembullShembull 33
IntVal = 35
Afishon një numër të plotë pa shenjë në format binar, dhjetor, dhehexadecimal, secili në një rresht të veçantë.
IntVal = 35.code
mov eax,IntValcall WriteBin ; display binarycall WriteBin ; display binarycall Crlfcall WriteDec ; display decimalcall Crlfcall WriteHex ; display hexadecimalcall WriteHex ; display hexadecimalcall Crlf
Shembull Daljeje(output):
0000 0000 0000 0000 0000 0000 0010 00113523
Shembull Daljeje(output):
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine15
23
SembullSembull 44
Pret një hyrje stringu nga përdoruesi. EDX tregon te stringu dheECX përcakton numrin maksimal të karakterëve që përdoruesi lejohet të kalojë.
.datafileName BYTE 80 DUP(0)
lejohet të kalojë.
fileName BYTE 80 DUP(0)
.codemov edx,OFFSET fileNamemov edx,OFFSET fileNamemov ecx,SIZEOF fileName – 1call ReadString
Një byte null shtohet automatikisht te stringu.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine16
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ë teWriteInt në EAX dhe e afishon atë në rresht të veçantë.
.codemov 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 valuecall RandomRange ; generate random intcall WriteInt ; display signed intcall WriteInt ; display signed intcall Crlf ; goto next display lineloop L1 ; repeat loop
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine17
ShembullShembull 66
Afishon një string të përfunduar me null, me karaktere të verdha në sfond blu.
.datastr1 BYTE "Color output is easy!",0
.codemov eax,yellow + (blue * 16)call SetTextColorcall SetTextColormov edx,OFFSET str1call WriteStringcall 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 Irvine18
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 Irvine19
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 Irvine20
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
789
10 top
234567
12
bottom
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine21
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 ESP00001000
00000FFC
00000FF8
00000FF4
00000FF0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine22
* SP në Mënyrën Reale të Adresimit
OperiOperimimi PUSH PUSH (1 (1 nganga 2)2)
• Një operim 32-bit push zvogëlon treguesin e stivesme 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 Irvine23
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 Irvine24
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 Irvine25
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 Irvine26
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 reg jistr atpush ecx
rend të kundërt.
push ecxpush ebx
mov esi,OFFSET dwordVal ; afisho një kujtesëmov ecx,LENGTHOF dwordValmov ecx,LENGTHOF dwordValmov ebx,TYPE dwordValcall DumpMem
pop ebx ; rimerr regjistratpop ecxpop esi
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine27
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 Irvine28
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 Irvine29
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ë 50 të 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 Irvine30
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 Irvine31
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 Irvine32
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 Irvine33
Përcaktimi dhe përdorimi i Pë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 Irvine34
Ndërtimi i Ndë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 Irvine35
DoDokkumentiumentimimi i i 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 Irvine36
ShembullShembull: Pro: Proççeduredura a 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,ebxadd eax,ecxret
SumOf ENDPSumOf ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine37
InstruInstruksionet ksionet 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 Irvine38
Shembull me Shembull me CALLCALL--RETRET (1 (1 nganga 2)2)
main PROC00000020 call MySub
0000025 është ofset-i i00000020 call MySub00000025 mov eax,ebx..
main ENDP
0000025 është ofset-i iinstruksionit që vjen menjëherë pas instruksionitCALL
main ENDP
MySub PROC00000040 mov eax,edx00000040 është ofset-i i..ret
MySub ENDP
00000040 është ofset-i iinstruksionit të parë brendaMySub
MySub ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine39
Shembull me Shembull me CALLCALL--RETRET ((22 nganga 2)2)
00000025 ESP 00000040Instruksioni CALL bën push vlerën 00000025
EIPpush vlerën 00000025 mbi stivë, dhe ngarkon00000040 në EIP
00000025 ESP
EIP
00000025Instruksioni RET bën popvlerën 00000025 nga stiva në EIP
EIP
(stiva paraekzekutimit të instruksionit RET)
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine40
(stiva paraekzekutimit të instruksionit RET)
Thirrje e përsëritur(Thirrje e përsëritur(NestedNested)) ProProççeduredurashashmain PROC . . call Sub1 exit
Gjatë kohës që thirret, the stivapërmban të tre adresat që do
main ENDP
Sub1 PROC . . (ret to main)
përmban të tre adresat që do kthehen:
call Sub2 retSub1 ENDP
Sub2 PROC .
(ret to main)
(ret to Sub1)
(ret to Sub2) ESP . . call Sub3 retSub2 ENDP
(ret to Sub2) ESP
Sub3 PROC . . retSub3 ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine41
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 PROCjmp L2 ; gabim(error)
L1:: ; etiketë global e
dallueshme kudo.
L1:: ; etiketë global eexit
main ENDP
sub2 PROCL2: ; etiketë locale
jmp L1 ; okretret
sub2 ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine42
ParametParametra ra 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 Irvine43
ParametParametra ra 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 PROCmov esi,0 ; indeksi i matricësmov eax,0 ; vendos shumën në zeromov ecx,LENGTHOF myarray ; vendos numrin e element eve
L1: add eax, myArray [esi] ; shton çdo numër te shumaadd esi,4 ; tregon te numri tjetërloop L1 ; përserit sipas përmasave të
; matricës; matricësmov theSum ,eax ; ruan shumënret
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 Irvine44
ParametParametra ra 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 = s huma
në EAX:
; Kthen : EAX = s huma;-------------------------------------------------- ---
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 shumaadd esi,4 ; tregon te numri tjetërloop L1 ; përserit sipas përmasave
; të matricësretret
ArraySum ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine45
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
decisionprocedurecall
yes
nono
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine46
Bllokskema për Bllokskema për begin
ArraySum Procedure
Bllokskema për Bllokskema për ProProççeduredurënënArraySumArraySum
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 Irvine47
Rradha JuajRradha Juaj. . .. . .
Ndërtoni një bllokskemë që shpreh pseudokodin që vijon:pseudokodin që vijon:
Merr si hyrje notën e kontrollit nga përdoruesiif( nota > 70 )
afisho “Kalon"elseelse
afisho “Përserit"endifendif
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine48
. . . (. . . (ZgjidhjaZgjidhja)) beginFillim
input exam gradeinput exam grade
yesno
Kalo noten e kontrollit
grade > 70?yesno
Nota
Afisho Afisho display "Pass"display "Fail"Afisho “Kalon”
Afisho “Përserit”
endFund
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine49
Rradha JuajRradha Juaj. . .. . .
• Modifiko bllokskemën e mësipërme në mënyrë që përdoruesi të kalojë nota kontrolli derisa të shtypet përdoruesi të kalojë nota kontrolli derisa të shtypet
• –1
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine50
OperatorOperatori i USESUSES• Shfaq listën e regjistrave që ruhen
ArraySum PROC USES esi ecxmov eax,0 ; vendos shumën në zeromov eax,0 ; vendos shumën në zeroetc.
MASM gjeneron kodin që duket me gold:MASM gjeneron kodin që duket me gold:
ArraySum PROCpush esipush ecxpush ecx..pop ecxpop ecxpop esiret
ArraySum ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine51
Kur nuk duhet të bëjmëKur nuk duhet të bëjmë push push 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 ; 1add eax,ebx ; 2add eax,ecx ; 3pop eax ; 4pop eax ; 4ret
SumOf ENDP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine52
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 Irvine53
ProjektimiProjektimi ii programitprogramit duke duke përdorurpërdorurProç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 Irvine54
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 Irvine55
ProProççedureduraa DesignDesign (2 (2 nganga 4)4)
MainClrscr ; pastron ekraninClrscr ; pastron ekraninPromptForIntegers
WriteString ; afishon stringunReadInt ; lexon integer
ArraySum ; shuma e numr. të plotëDisplaySumDisplaySum
WriteString ; afishon stringunWriteInt ; afishon numrin e plotëWriteInt ; afishon numrin e plotë
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine56
StruStrukkturturaa ChartChart (3 (3 nganga 4)4)
SummationProgram (main)
Clrscr PromptForIntegers ArraySum DisplaySum
WriteStringWriteString ReadInt WriteIntWriteInt
Ngjyra gri tregon
procedura procedura librarie
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine57
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 Irvine58
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 standartedhe konvertimet e të dhenavedhe konvertimet e të dhenave• Deshironi të dini më shumë? Studioni librarinë me
kodin burimor në dosjen c:\Irvine\Examples\Lib32
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine59
FundFund
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine60