🎧 New: AI-Generated Podcasts Turn your study notes into engaging audio conversations. Learn more

10__AOK__Ligjërata 10__Shembuj të programeve me ndërprerje (interrupts) në assembly -- MSc. Valdrin Haxhiu.pdf

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Full Transcript

Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 10 Shembuj të programeve me ndërprerje (interrupts) në assembly MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Shembull 1: Shkruani programin i cili e shtypë në konzolë mesazhin Përshëndetje! duke shtypur karakteret e mesazhit një nga një në t...

Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 10 Shembuj të programeve me ndërprerje (interrupts) në assembly MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Shembull 1: Shkruani programin i cili e shtypë në konzolë mesazhin Përshëndetje! duke shtypur karakteret e mesazhit një nga një në të njëjtin rresht të konzolës. Zgjidhje: Pas ekzekutimit të këtij programi fitohet pamja e paraqitur në figurën më poshtë. 1 MSc. Valdrin Haxhiu Mekanizmi i ndërprerjeve është implementuar brenda sistemeve kompjuterike me qëllim të shfrytëzimit të procesorit në mënyrë sa më racionale (shfrytëzimi për sa më shumë punë). Një ndërprerje (interrupt) paraqet një ngjarje e cila mund të ndërpresë përkohësisht punën aktuale të procesorit për të kryer ndonjë punë tjetër. Pjesët e ndryshme harduerike kanë nevojë për procesorin që të ekzekutojë ndonjë softuer i cili i përmbush kërkesat e pjesës harduerike. Ndërprerjet e shkaktuara nga hardueri njihen si ndërprerje harduerike (hardware interrupt). Nëse një ndërprerje ndodhë me rastin e ekzekutimit të ndonjë instruksioni brenda ndonjë softueri që mund të shkaktojë ndërprerje, atëherë kjo ndërprerje njihet si ndërprerje softuerike (software interrupt). Për procesorin Intel 8086, ndërprerje softuerike mund të shkaktojë ekzekutimi i instruksionit int (interrupt). Instruksioni int shkruhet në formën int nn dhe ka madhësinë 2 bajt. Njëri bajt i instruksionit int paraqet kodin e operacionit (opcode) dhe bajti tjetër paraqet numrin e ndërprerjes. Meqë kemi 8 bitë për numrin e ndërprerjes, atëherë kemi 28 = 256 ndërprerje të ndryshme prej int 00h deri int FFh. Disa prej këtyre ndërprerjeve përdoren për ndërprerje harduerike e disa përdoren për ndërprerje softuerike. Me rastin e ekzekutimit të një ndërprerjeje, procesori e ruan në stek përmbajtjen e regjistrit flags, përmbajtjen e regjistrit ip dhe përmbajtjen e regjistrit cs. Pas këtij hapi, procesori kërcen në një pjesë tjetër të memories DRAM për të ekzekutuar një procedurë e cila njihet edhe si ISR (interrupt service routine) që merret me plotësimin e kërkesave të ndërprerjes. Adresa fizike në të cilën gjendet informata se në cilën pjesë të memories DRAM fillon procedura fitohet duke shumëzuar numrin e ndërprerjes me 4. Shumëzohet me 4 sepse 4 bajt është madhësia e informatës për ndërprerjen. Informata 4 bajtëshe për ndërprerjen që njihet edhe si vektori i ndërprerjes (interrupt vector) ruhet në një tabelë të veçantë të njohur si tabela e vektorit të ndërprerjes (interrupt vector table). Te sistemet kompjuterike që kanë procesorin Intel 8086, kjo tabelë ruhet në një pjesë të veçantë të memories DRAM prej adresës fizike 00000h deri 003FCh. Në Tabela 1 është paraqitur një pjesë e tabelës së vektorit të ndërprerjes. Tabela 1 – Një pjesë e tabelës së vektorit të ndërprerjes Numri për int int 00 int 01 int 02 … int FF Adresa fizike 00000 00004 00008 … 003FC Adresa logjike 0000:0000 0000:0004 0000:0008 … 0000:03FC Në shembullin 1, për shtypjen në konzolë një nga një të shkronjave të mesazhit Përshëndetje!, kemi përdorë procedurën për shtypjen e një karakteri në konzolë e cila thirret përmes ndërprerjes int 10h. Për shtypje në konzolë, në regjistrin ah duhet të vendosim vlerën 0Eh. Procedura që thirret përmes ndërprerjes int 10h, e shtypë në konzolë karakterin (sipas kodit ASCII) të cilin e merr prej regjistrit al. Pra, duhet që paraprakisht të vendosim karakterin në regjistrin al. 2 MSc. Valdrin Haxhiu Procedura që thirret te ky shembull, por edhe të gjitha procedurat që thirren përmes ndërprerjes, brenda trupit të tyre kanë instruksionin iret (interrrupt return) për kthim te programi në të cilin është ekzekutuar instruksioni int. Instruksioni iret dallon prej instruksionit ret. Përmes instruksionit iret, procesori urdhërohet që para se të vazhdojë punën për ekzekutimin e programit të ndërprerë, së pari të kthejë gjendjen (kontekstin) e programit në regjistra duke kthyer vlerat e mëparshme të regjistrave flags, ip dhe cs. Duke e emuluar ekzekutimin e programit të këtij shembulli, mund të shohim se kur ekzekutohet instruksioni int 10h, së pari në stek vendoset përmbajtja e regjistrit flags, regjistrit cs dhe regjistrit ip. Për ekzekutimin e procedurës e cila shtypë në konzolë një karakter, regjistri cs merrë vlerën F400 dhe regjistri ip vlerën 0190h. Shembull 2: Shkruani programin i cili shtypë në konzolë mesazhin Hello, World!. Karakteret e mesazhit nuk duhet të shtypen një nga një. Zgjidhje: Në rreshtin 05 kemi deklaruar variablën mesazhi. Në këtë rresht si pjesë të deklarimit janë edhe pjesët: 0Dh, 0Ah dhe 24h. Pjesa 0Dh është numri heksadecimal sipas ASCII për kthim në kryerresht (carriage return), pjesa 0Ah është numri heksadecimal për kalim në rresht të ri (line feed) në konzolë dhe numri 24h tregon simbolin $ që përdoret për të shënuar fundin e përmbajtjes në një rresht. 3 MSc. Valdrin Haxhiu Përmes instruksionit në rreshtin 03, ekzekutimi i programit vazhdon prej instruksionit në rreshtin 07. Në shembujt e mëhershëm variablat i kemi deklaruar pas instruksionit ret. Në këtë shembull, variabla është deklaruar më herët. Përmes instruksionit në rreshtin 07, në regjistrin dx ruhet offseti (adresa brenda segmentit aktual të kodit) i variablës mesazhi. Në vend që instruksioni në rreshtin 07 të shkruhet në formën mov dx, offset mesazhi, gjatë deklarimit të variablës mesazhi, pas emrit të variablës janë vendosur dy pika. Nëse nuk do të vendoseshin dy pikat, instruksioni do të duhej të shkruhej patjetër në formën mov dx, offset mesazhi ose lea dx, mesazhi (përmes instruksionit lea – load effective address). Procedura për shtypje në konzolë që thirret përmes ndërprerjes int 21h, kërkon që offseti i variablës (përmbajtja e të cilës do të shtypet në konzolë) të vendoset në regjistrin dx dhe në regjistrin ah të vendoset vlera 09h. 4 MSc. Valdrin Haxhiu Shembull 3: Shkruani programin i cili mundëson që të shkruajmë përmes tastierës deri në 16 karaktere që ruhen në baferin (buffer) e tastierës, leximin një nga një të karaktereve të ruajtura në bafer, largimin e tyre prej baferit dhe shtypjen e tyre në konzolë. Zgjidhje: Pas ekzekutimit të instruksioneve në rreshtat 04, 05 dhe 06 në konzolë fitohet pamja si në figurën më poshtë. 5 MSc. Valdrin Haxhiu Përmes unazës (unaza është realizuar përmes instruksionit jz që teston nëse ZF = 1) në rreshtat 09 deri në 14 mundësohet kontrollimi gjatë tërë kohës i baferit të tastierës se a është ruajtur (baferuar) ndonjë karakter duke shtypur tastet. Instruksionet në rreshtat 17 dhe 18 mundësojnë marrjen e simboleve të ruajtura në bafer (me qëllim të shtypjes së tyre në konzolë) dhe largimin e tyre prej baferit. Shtypja e secilit simbol në konzolë bëhet duke ekzekutuar instruksionet në rreshtat 21 dhe 22. Në rast se në tastierë shtypet tasti esc (escape), atëherë përmes instruksioneve në rreshtat 25 dhe 26 mundësohet dalja prej programit. Shembull 4: Shkruani programin i cili pas ekzekutimit shtypë në konzolë mesazhet që shihen në figurë. Për mesazhin ubt të shkruhet procedura ubtShkronjaTeVogla dhe për mesazhin UBT të shkruhet procedura UBTShkronjaTeMedha. 6 MSc. Valdrin Haxhiu Zgjidhje: Në rreshtat 31, 35 dhe 39 kemi përdorë instruksionin xor (exclusive or, ekskluziv ose). Në rreshtin 30 së pari vendoset në regjistrin al shkronja u me bitët e saj 01110101 dhe përmes instruksionit në rreshtin 31, duke llogaritur operacionin logjik 01110101 xor 00100000 fitohen bitët 01010101 të shkronjës U që vendosen në regjistrin al. Shkronja B fitohet përmes operacionit logjik që kryhet duke ekzekutuar instruksionin në rreshtin 35 dhe shkronja T fitohet përmes instruksionit në rreshtin 39. 7 MSc. Valdrin Haxhiu Shembull 5: Shkruani programin i cili llogaritë shumën e dy numrave të cilët programit i jepen përmes tastierës dhe paraqet në konzolë shumën e atyre numrave. Zgjidhje: Për marrjen (leximin) e numrave brenda rangut të vlerave prej -32768 deri në 32767 nga konzola të shtypur përmes tastierës, përdorim procedurën e gatshme scan_num. Përveç që duhet 8 MSc. Valdrin Haxhiu ta thërrasim procedurën, është e domosdoshme t’i tregojmë kompajlerit (asemblerit) se ku është definuar procedura. Për këtë qëllim në rreshtin 01 është shkruar direktiva include ‘emu8086.inc’, me të cilën tregojmë se procedura është definuar brenda librarisë me procedura të gatshme emu8086.inc. Për thirrjen e procedurës scan_num, në program duhet të kemi patjetër edhe direktivën define_scan_num. Në këtë program janë 4 variabla. Variablat: mesazhi1, mesazhi2 dhe mesazhi3 shërbejnë për paraqitjen e mesazheve në konzolë. Variabla shuma shërben për ruajtjen e shumës së llogaritur. Përmes instruksioneve në rreshtat 21 deri 23, në konzolë shtypet përmbajtja e variablës mesazhi1. Në rreshtin 26 thirret procedura scan_num për leximin e numrit të parë dhe ruajtjen e tij në regjistrin cx. Në variablën shuma së pari ruhet numri i parë përmes instruksionit në rreshtin 29. Përmes instruksioneve në rreshtat 33 deri 35, në konzolë shtypet përmbajtja e variablës mesazhi2. Në rreshtin 38, procedura scan_num thirret për leximin e numrit të dytë dhe ruajtjen e tij në regjistrin cx (numrin e parë e kemi ruajtur në variablën shuma). Shuma e dy numrave të dhënë llogaritet përmes instruksionit në rreshtin 42. Nëse shuma e numrave të dhënë tejkalon vlerën 65535, kjo vlerë nuk mund të ruhet në regjistrin ax dhe paraqitet rasti overflow. Gjendjen overflow, procesori e ruan në bitin overflow flag me vlerën 1 (OF = 1). Instruksioni jo (jump if overflow) i shkruar në rreshtin 43, teston vlerën e OF dhe nëse OF = 1, atëherë kërcehet te thirrja e procedurës së gatshme printn e cila e shtyp në konzolë mesazhin ‘kemi overflow’. Duke ekzekutuar instruksionet në rreshtat 47 deri në 48, në konzolë shtypet përmbajtja e variablës mesazhi3. Shtypja në konzolë e vlerës së shumës së llogaritur bëhet përmes thirrjes së procedurës së gatshme print_num në rreshtin 53. Kjo procedurë është definuar në fajllin emu8086.inc. Procedura print_num e shtypë në konzolë numrin që gjendet në regjistrin ax. Vlera e shumës vendoset paraprakisht në regjistrin ax përmes instruksionit në rreshtin 52. Duke ekzekutuar instruksionin në rreshtin 55 kërcehet në rreshtin 66 dhe me ekzekutimin edhe të rreshtit 67, programi pret që të shtypet ndonjë tast në tastierë për të kthyer kontrollin te sistemi operativ. Për llogaritjen e shumës 2 + 3 përmes këtij programi, së pari jepen vlerat e numrave dhe pas llogaritjes së shumës së numrave të dhënë fitohet pamja si në figurën më poshtë. 9 MSc. Valdrin Haxhiu 10

Use Quizgecko on...
Browser
Browser