09__AOK__Ligjërata 09__Bashkësia e instruksioneve x86. Procedurat (funksionet) -- MSc. Valdrin Haxhiu.pdf

Full Transcript

Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 9 Bashkësia e instruksioneve x86 Procedurat (funksionet) MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Shembull 1: Shkruani programin i cili e vendosë vlerën 8 në regjistrin ax, në regjistrin cx vendosë vlerën 3 dhe brenda një unaze që duhet...

Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 9 Bashkësia e instruksioneve x86 Procedurat (funksionet) MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Shembull 1: Shkruani programin i cili e vendosë vlerën 8 në regjistrin ax, në regjistrin cx vendosë vlerën 3 dhe brenda një unaze që duhet të ekzekutohet 4 herë e zvogëlon për 1 vlerën e regjistrit ax. Zgjidhje: Me anë të instruksionit inc (increment) vlera e regjistrit cx është rritur për 1 (vlera aktuale e tij 3 + 1 = 4) sepse unaza duhet të ekzekutohet 4 herë. Nëse regjistri cx ka vlerën 3, atëherë unaza (loop) do të ekzekutohet 3 herë (duhe e zvogëluar vlerën e regjistrit cx). Unazat e përdorin në mënyrë implicite (të nënkuptuar) regjistrin cx gjatë ekzekutimit. Unaza në këtë shembull është shkruar prej rreshtit 10 deri në rreshtin 13. Procesori ekzekuton instruksionin në rreshtin 12 dhe zvogëlon për 1 vlerën e regjistrit ax përmes instruksionit dec (decrement). Në rreshtin 13 vlera e regjistrit cx zvogëlohet për 1, nëse cx bëhet 0 ndërprehet ekzekutimi i unazës dhe nëse cx nuk ka vlerën 0, atëherë ekzekutohet instruksioni në rreshtin 12. Pas 4 herëve të ekzekutimit të unazës, vlera e regjistrit cx do të jetë 0. Unaza loop ekzekutohet së paku një herë. Instruksioni i radhës pas unazës është ret (return) përmes të cilit përfundon programi (kontrolli i kthehet sistemit operativ). 1 MSc. Valdrin Haxhiu Shembull 2: Shkruani programin i cili vendosë vlerën 2 në regjistrin ax, e teston vlerën e regjistrit ax dhe nëse ax ka vlerën 2, atëherë regjistrit ax ia shton vlerën 8. Nëse regjistri ax nuk ka vlerën 2 pas testimit të vlerës, programi duhet të përfundojë ekzekutimin. Zgjidhje: Për testimin e vlerës së regjistrit ax kemi përdorë instruksionin cmp (compare) duke krahasuar vlerën e regjistrit ax dhe vlerën 2. Me rastin e ekzekutimit të instruksionit cmp, në prapavijë është ekzekutuar instruksioni sub ax, 2 për të mësuar nëse ndryshimi është 0 ose jo. Nëse ndryshimi është 0 (pra, nëse ax - 2 = 0) atëherë ky fakt ruhet me bitin e gjendjes (bitin flag) ZF (zero flag) përmes vlerës 1. Me rastin e emulimit të ekzekutimit të këtij programi, mund të klikojmë në butonin flags që të shohim vlerën e regjistrit ZF (mund të shihen edhe disa bitë flag tjerë). Me anë të instruksionit je (jump if equal – kërce nëse janë të barabartë) në rreshtin 07 testohet vlera e bitit flag ZF. Nëse ZF = 1, atëherë vlerat e krahasuara në rreshtin 05 janë të barabarta dhe bëhet kërcimi në labelën (adresën) shuma, përkatësisht bëhet ekzekutimi i instruksionit në rreshtin 12. Nëse biti ZF nuk ka vlerën 1, pra ka vlerën 0, atëherë ax nuk ka vlerën 2 dhe përmes instruksionit jmp (jump) që gjendet në rreshtin 09 kërcehet te labela fundi, përkatësisht ekzekutohet instruksioni ret. 2 MSc. Valdrin Haxhiu Instruksioni jmp përdoret për kërcime (degëzime) pa kusht (nuk testohet ndonjë kusht) dhe bashkë me instruksionet për kërcime me kusht (së pari testohet kushti, për shembull vlera e ndonjërit prej bitëve flag) përdoret për përcaktimin e rrjedhës së ekzekutimit të programit (program flow control). Shembull 3: Shkruani programin i cili e vendosë vlerën 3 në regjistrin ax, vlerën 4 në regjistrin bx, vlerën 2 në regjistrin cx dhe gjenë vlerën më të madhe prej tyre duke e ruajtur në regjistrin ax. Zgjidhje: Me anë të instruksionit cmp krahasohet vlera e regjistrit ax me vlerën e regjistrit bx. Përmes instruksionit jb (jump if below) testohet kushti se a është vlera e ax me e vogël se vlera e bx, nëse po, atëherë bëhet kërcimi te labela nderrimi_vleres1 ku me anë të instruksionit në rreshtin 13 vlera e bx shkruhet në ax. Logjika është që në fund të kemi vlerën më të madhe te regjistri ax. Nëse kushti te jb nuk plotësohet, atëherë përmes instruksionit në rreshtin 09 kërcehet te labela krahasimi_tjeter për të krahasuar vlerën e ax me vlerën e cx dhe nëse vlera e ax është më e vogël se vlera e cx në rreshtin 24 vlera e cx vendoset në ax. Për të gjetur vlerën më të vogël, te ky shembull, instruksioni jb zëvendësohet me instruksionin ja (jump if above). 3 MSc. Valdrin Haxhiu Shembull 4: Shkruani programin i cili deklaron variablën vlera1 me vlerë 4 dhe variablën vlera2 me vlerë 2. Vlera e variablës vlera1 të ruhet në regjistrin al dhe vlera e regjistrit al të shumëzohet me veten 2 herë brenda unazës. Zgjidhje: Deklarimi i variablave me vlera të madhësisë deri në 1 bajt mund të bëhet përmes direktivës db (define byte), kurse deklarimi i variablave me vlera të madhësisë deri në 2 bajt mund të bëhet përmes direktivës dw (define word). 4 MSc. Valdrin Haxhiu Shembull 5: Shkruani procedurën (funksionin) me emrin shuma i cili e mbledh vlerën 1 të regjistrit ax dhe vlerën 5 të regjistrit bx. Procedura të thirret dhe të shikohen vlerat e regjistrave IP, SP dhe pamja e stekut (stack) përmes menysë view  stack. Zgjidhje: Definimi i procedurës (funksionit) në gjuhën assembly bëhet duke vendosur instruksionet e saj ndërmjet direktivave proc dhe endp. Procedura shuma është definuar prej rreshtit 11 deri në rreshtin 15. Për ekzekutimin e procedurës shuma (nëse nuk parandalohet ekzekutimi, procedura në assembly mund të ekzekutohet edhe pa thirrjen e saj), procedura duhet të thirret përmes instruksionit call shuma sikur në rreshtin 07. Me rastin e thirrjes së procedurës shuma, me qëllim që ekzekutimi të vazhdojë në rreshtin 08, përmes adresës (offsetit) në regjistrin SP (stack pointer) i cili përmban adresën e majes së stekut (top of stack), në stek ruhet adresa (offseti) e instruksionit jmp fundi që gjendet në rreshtin 08. Shkrimi në stek bëhet duke e ekzekutuar në prapavijë një instruksion push për vendosjen e vlerës në maje të stekut. Në figurën mëposhtë shihet përmbajtja e regjistrave të procesorit dhe stekut pas ekzekutimit të instruksionit në rreshtin 07. Në figurë shihet se regjistri SP përmban adresën FFFC që tregon vlerën 0109h në stek. Vlera 0109h paraqet adresën (offsetin) e instruksionit jmp fundi në memorien DRAM. 5 MSc. Valdrin Haxhiu Në figurë shihet edhe adresa 010Bh në regjistrin IP e cila i takon instruksionit në rreshtin 13 brenda procedurës shuma. Pas ekzekutimit të instruksionit ret në rreshtin 14, për kthim në rreshtin 08, procesori ekzekuton në prapavijë një instruksion pop për leximin e vlerës (offsetit) 0109h në adresën FFFC në stek dhe vendosë adresën 0109h në regjistrin IP. Pas ekzekutimit të instruksionit në rreshtin 08, bëhet kërcimi te adresa 010Eh e instruksionit ret. Shembull 6: Shkruani programin i cili e vendosë vlerën 1 në regjistrin ax dhe vlerën 2 në regjistrin bx. Të testohet vlera e regjistrit ax, nëse ax = 1, atëherë të ekzekutohet procedura prodhimi e cila e llogaritë vlerën bx3 (pra, 23) duke përdorë unazë (loop) dhe nëse ax ≠ 1 të ekzekutohet procedura shuma e cila llogaritë shumën ax + bx. Zgjidhje: 6 MSc. Valdrin Haxhiu Shembull 7: Shkruani procedurën shuma e cila llogaritë 2 + 3. Vlerat 2 dhe 3 duhet të barten te procedura shuma si parametra. Zgjidhje: Për bartjen e vlerave të parametrave 2 dhe 3 te procedura shuma, së pari kemi vendosur këto vlera në dy variabla. Vlera 2 është vendosur në variablën vlera1 dhe vlera 3 në variablën vlera2. Në regjistrin ax kemi vendosur parametrin 2 dhe në regjistrin bx kemi vendosur parametrin 3. Meqë numri i regjistrave në procesor është i kufizuar (ka pak regjistra), atëherë për një fleksibilitet më të madh, mund të përdoret stek (që punon përmes algoritmit LIFO – Last In First Out). Pas ekzekutimit të instruksionit në rreshtin 07, vlera 2 vendoset në maje të stekut, përkatësisht në adresën FFFC. Vlera 3 vendoset në maje të stekut te adresa FFFA përmes instruksionit në rreshtin 08 duke e zhvendosur vlerën 2 për dy bajtë më poshtë se maja e stekut. Të rikujtojmë se regjistrat e procesorit Intel 8086 janë me gjatësi 16 bit dhe sa herë që vlera e një regjistri vendoset në stek, atëherë në stek vendosen dy bajt. Pas ekzekutimit të instruksionit në rreshtin 09, në maje të stekut vendoset adresa për kthim te rreshti 10 pas ekzekutimit të procedurës shuma. Adresa FFF8 në maje të stekut përmban adresën (offsetin) 010Ch që i takon instruksionit ret. Leximin e vlerave në stek e bëjmë duke shfrytëzuar regjistrin bp (base pointer). Përmes instruksionit në rreshtin 14, kemi vendosur adresën 0000h të regjistrit bp në majen e stekut apo në adresën FFF6. Në mënyrë që të lexojmë vlerat e parametrave që kemi vendosur në stek për të llogaritur shumën 2 + 3, përmes instruksionit në rreshtin 15 kemi ruajtur adresën FFF6 të majes së stekut në regjistrin bp si adresë bazë me të cilën mund të lexohen vlerat prej stekut përmes 7 MSc. Valdrin Haxhiu adresave të formuara në formën [bp + vlera për zhvendosje]. Pamja e re e stekut shihet në figurën e paraqitur mëposhtë. Pas ekzekutimit, instruksioni në rreshtin 17 e lexon vlerën 2 në stek përmes adresës FFFC që formohet duke llogaritur shumën FFF6 + 6 = FFFC (adresa FFF6 gjendet në regjistrin bp dhe është marrë më herët prej regjistrit sp) dhe e ruan në regjistrin dx. Duke e ekzekutuar instruksionin në rreshtin 19, përmes adresës së formuar nga shuma FFF6 + 4 = FFFA e lexon vlerën 3 në stek dhe e mbledh me vlerën e regjistrit dx (që ka vlerën 2). Shuma e fituar 5 ruhet në regjistrin dx. Përmes instruksionit në rreshtin 21, vlera e regjistrit bp ruhet në regjistrin sp dhe përmes instruksionit në rreshtin 22 vlera që gjendet në maje të stekut vendoset në regjistrin bp. Në rreshtin 23, instruksioni ret është shkruar në formën ret 3. Me këtë formë para se të bëhet kthimi për ekzekutim në rreshtin 10, së pari largohen 3 vlera prej stekut. Largohet adresa (010Ch) e kthimit te instruksioni ret (adresa vendoset në regjistrin ip), largohet parametri 3 dhe parametri 2 apo thënë më mirë në maje të stekut do të jetë vlera 0000h. Gjendja e stekut pas ekzekutimit të instruksionit ret 3 shihet në figurën mëposhtë. 8

Use Quizgecko on...
Browser
Browser