10__AOK__Ligjërata 10__Adresimi i operandëve përmes instruksioneve në procesorin Intel 8086 -- MSc. Valdrin Haxhiu.pdf
Document Details
Uploaded by NiftyGodel
Kolegji "UBT"
Tags
Full Transcript
Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 10 Adresimi i operandëve përmes instruksioneve në procesorin Intel 8086 MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Arkitekturat e bashkësive të instruksioneve Për gjenerata të ndryshme të sistemeve kompjuterike janë implementuar arkitektur...
Kolegji UBT Arkitektura dhe organizimi i kompjuterëve Ligjërata 10 Adresimi i operandëve përmes instruksioneve në procesorin Intel 8086 MSc. Valdrin Haxhiu MSc. Valdrin Haxhiu Arkitekturat e bashkësive të instruksioneve Për gjenerata të ndryshme të sistemeve kompjuterike janë implementuar arkitektura të ndryshme të bashkësive të instruksioneve (ISA - instruction set architecture). Instruksionet aritmetike dhe instruksionet logjike mund të kenë operandët e tyre në memorien DRAM, në stek (që gjithashtu është në DRAM), në regjistra ose brenda instruksioneve (në DRAM). Varësisht se ku janë operandët (apo ku lejohet të jenë operandët) e instruksioneve aritmetike dhe logjike, arkitekturat ISA ndahen në: ▪ ▪ ▪ arkitekturë stek (stack ISA) arkitekturë akumulator (accumulator ISA) arkitekturë me regjistra të përgjithshëm (GPR - general purpose registers ISA): regjistër - regjistër (register - register) regjistër - memorie (register - memory) memorie - memorie (memory - memory) Arkitektura Intel x86 e bashkësisë së instruksioneve është arkitekturë e bazuar në akumulatorë (procesori Intel 8086 ka dy regjistra akumulatorë: ax dhe dx) dhe në regjistra të përgjithshëm (kuptohet, edhe regjistrat ax dhe dx janë regjistra me qëllim të përgjithshëm). Bashkësia e instruksioneve x86 për procesorin Intel 8086 nuk lejon që instruksionet aritmetike dhe logjike të ekzekutohen mbi operandë (vlera) që të gjithë janë në memorien DRAM, së paku njëri prej operandëve duhet të jetë në njërin prej regjistrave që përdoren për ruajtjen e të dhënave (vlerave të operandëve). Sigurisht, vlerat e ruajtura në stek mund të përdoren si operandë për llogaritje të ndryshme. Bashkësia x86 për procesorin Intel 8086 nuk përkrahë ekzekutimin e instruksioneve aritmetike dhe logjike që i kanë të gjithë operandët në stek. Nëse për shembull, duam të llogarisim shumën 2 + 3, ku vlerat 2 dhe 3 janë në stek, së pari duhet që së paku njërin prej operandëve të vendosim në njërin prej regjistrave për të dhëna në procesor. Gjithashtu, bashkësia x86 për procesorin Intel 8086 nuk përkrahë ekzekutimin e instruksioneve aritmetike dhe logjike që i kanë të gjithë operandët në memorien DRAM, nuk mund të mbledhen dy numra drejtpërdrejtë në DRAM. Duhet që së paku njëri nga numrat (operandët) të vendoset në njërin prej regjistrave (për të dhëna) në procesor. Më poshtë kemi paraqitur figurat e programeve (të shkruara në emu8086) për llojet e ndryshme të arkitekturave ISA në përputhje me bashkësinë x86 të instruksioneve (përjashtim arkitektura memorie - memorie që shihet në figurën e fundit) për shprehjen: E= A+B C+D ku: A = 2, B = 4, C = 1 dhe D = 2. 1 MSc. Valdrin Haxhiu 2 MSc. Valdrin Haxhiu 3 MSc. Valdrin Haxhiu Kur përdorim instruksionin për pjesëtim div, duhet të kemi parasysh këto rregulla të këtij instruksioni. Nëse operandi (p.sh. vlera në regjistrin bl) në pjesëtues është me madhësi 1B, atëherë nëse kemi instruksionin div bl, pjesëtimi do të llogaritet sipas ax/bl ashtu që herësi do të ruhet në regjistrin al dhe mbetja e pjesëtimit do të ruhet në regjistrin ah. Nëse pjesëtuesi është për shembull në regjistrin bx me madhësi 2B, atëherë nëse kemi instruksionin div bx, vlera e regjistrave ax dhe dx (si vlerë e të pjesëtueshmit merret vlera e ax dhe dx sipas radhitjes dx ax) do të pjesëtohet me bx ashtu që herësi do të ruhet në regjistrin ax dhe mbetja e pjesëtimit do të ruhet në regjistrin dx. 4 MSc. Valdrin Haxhiu Mënyrat e adresimit të operandëve në procesorin Intel 8086 Adresimi i operandëve përmes instruksioneve në procesorin Intel 8086 bëhet me anë të këtyre mënyrave të adresimit: adresimi i menjëhershëm (immediate) adresimi direkt (direct) adresimi regjistër (register) adresimi indirekt përmes regjistrit (register indirekt) adresimi relativ ndaj regjistrave bazë (based relative) adresimi relativ ndaj regjistrave për indeksim (indexed relative) adresimi relativ ndaj regjistrave bazë dhe regjistrave për indeksim (based indexed relative) Shembull 1: Në figurën më poshtë kemi paraqitur disa instruksione të procesorit Intel 8086 për mënyrat e ndryshme të adresimit të operandëve. Instruksionet në rreshtat 03, 05 dhe 07 të figurës më sipër kanë përdorë adresim të menjëhershëm (immediate) të vlerës së operandit. Te kjo mënyrë e adresimit, vlera e operandit gjendet në instruksion dhe në memorien DRAM gjendet menjëherë pas kodit të operacionit të instruksionit (shikoni përmes emulatorit se ku gjendet vlera e operandit për këto instruksione). Te adresimi i menjëhershëm, nevojitet vetëm një referencim (një qasje) në DRAM për leximin e instruksionit dhe nuk nevojitet ndonjë referencim (adresim) shtesë për vlerën e operandit (sepse vlera merret bashkë me instruksionin). 5 MSc. Valdrin Haxhiu Adresimi regjistër është përdorë te instruksioni në rreshtin 08. Te kjo mënyrë e adresimit, vlera e operandit është në një regjistër dhe lexohet shumë më shpejtë në krahasim me operandët që janë në memorien DRAM. Instruksioni në rreshtin 12 ka përdorë adresim indirekt përmes regjistrit. Përmes pjesës [bx], vlera e operandit merret përmes offsetit (adresës brenda segmentit të kodit) të variablës vlera që gjendet në regjistrin bx. Offsetin e variablës vlera e kemi ruajtur në regjistrin bx përmes instruksionit në rreshtin 10 duke përdorë operatorin offset. Te adresimi indirekt përmes regjistrave, si regjistra indirekt përdoren regjistrat: bx, si (source index) dhe di (destination index). Në rastet kur këta regjistra përdoren si pointerë (offset), duhet të kombinohen me vlerën e regjistrit ds (data segment) për të formuar adresën fizike 20 bitëshe. Llogaritja e adresës fizike të variablës vlera në figurën më sipër bëhet duke ia ndërruar vendin për një pozitë majtas (ose në formë binare për 4 pozita majtas) secilit numër në vlerën 0700h të regjistrit ds për të fituar vlerën 07000h. Vlera 07000h mbledhet (mbledhje heksadecimale) me vlerën 0111h të offsetit dhe fitohet adresa fizike 07111h e vlerës 9 të variablës (të shikohet në emulator). Shembull 2: Një mënyrë tjetër e adresimit të operandëve është adresimi direkt. Në figurën më poshtë është paraqitur një instruksion që përdorë mënyrë direkte të adresimit. Vlera 0105h brenda kllapave të mesme në rreshtin 04 në figurë tregon offsetin e vlerës 9 të variablës vlera që është deklaruar në rreshtin 07. Me anë të instruksionit në rreshtin 04 lexohet vlera e variablës vlera në memorien DRAM dhe një kopje e saj ruhet në regjistrin dl. Te ky instruksion, nevojiten dy referencime në memorien DRAM. Një referencim për të lexuar instruksionin dhe një referencim tjetër për të lexuar vlerën e operandit. Te kjo mënyrë e adresimit, offseti i operandit gjendet në instruksion dhe në memorien DRAM gjendet menjëherë pas kodit të operacionit të instruksionit (shikoni përmes emulatorit se ku gjendet offseti i operandit për këtë instruksion). Adresa fizike (20 bitëshe) llogaritet ngjashëm si në shembullin 1. 6 MSc. Valdrin Haxhiu Shembull 3: Në figurën më poshtë kemi paraqitur një program i cili i shkruan në stek vlerat 5 dhe 4, pastaj llogaritë ndryshimin 5 – 4 të vlerave të lexuara prej stekut përmes adresimit relativ ndaj regjistrit bazë bp (base pointer) duke e mbledhur me një vlerë për zhvendosje (displacement). Instruksioni në rreshtin 10 ka përdorë adresimin relativ ndaj regjistrit bp përmes pjesës [bp+4] për leximin e vlerës 5 në stek dhe ruajtjen e saj në regjistrin ax. Leximi i vlerës 4 në stek dhe ruajtja e saj në regjistrin bx bëhet përmes instruksionit në rreshtin 12. Shembull 4: Një mënyrë tjetër e adresimit të operandëve është adresimi relativ ndaj regjistrave për indeksim si dhe di. Në këtë shembull, ashtu siç shihet në figurën më poshtë, në rreshtin 12 kemi deklaruar një vektor me emrin vektori me anë të direktivës db (define byte). Vektori ka anëtarët 6, 7, 8 dhe 9. Përmes regjistrit si dhe vlerës për zhvendosje 2, instruksioni në rreshtin 07 lexon vlerën 8 në pozitën 2 të vektorit dhe e ruan një kopje të saj në regjistrin al. 7 MSc. Valdrin Haxhiu Shembull 5: Duke kombinuar adresimin relativ ndaj regjistrave bazë dhe adresimin relativ ndaj regjistrave për indeksim, fitohet një mënyrë tjetër e adresimit, adresimi relativ ndaj regjistrave bazë dhe regjistrave për indeksim. Në këtë shembull, kemi përdorë regjistrin bazë bx dhe regjistrin për indeksim si, si një mënyrë për të lexuar vlerën e anëtarit në pozitën 3 të vektorit të deklaruar në rreshtin 17. Përmes instruksionit në rreshtin 06, krahasohet vlera 4 që gjendet në pozitën 3 brenda vektorit me vlerën 0. Ky instruksion teston se a është negative vlera në pozitën 3. Nëse vlera në pozitën 3 të vektorit nuk është më e madhe dhe as e barabartë me 0 (pra, nëse ajo është negative), atëherë përmes instruksionit jnge (jump if not greater or equal) bëhet kërcimi te instruksioni ret. 8 MSc. Valdrin Haxhiu Shembull 6: Në këtë shembull përmes adresimit relativ ndaj një regjistri bazë dhe një regjistri për indeksim, llogaritet shuma e anëtarëve pozitiv të vektorit të deklaruar në reshtin 24. Unaza (loop) është realizuar përmes instruksionit jmp ashtu që të lexohet vlera e secilit anëtarë të vektorit dhe nëse vlera e anëtarit është negative, ajo vlerë negative nuk përfshihet në shumë. Në fund të vektorit, gjatë deklarimit, kemi vendosur simbolin $ për të shënuar fundin e vektorit. Përmes instruksioneve në rreshtat 17 dhe 18 bëhet e mundur që llogaritja e shumës të mos vazhdojë nëse kemi arritur te simboli $. Shumën e llogaritur e kemi ruajtur në regjistrin ax. 9 MSc. Valdrin Haxhiu Shembull 7: Shtypja e anëtarëve të vektorit vektori = {1, 2, 3, 4, 5} në konzolë (ekran) në formën 12345. Shembull 8: Shtypja e anëtarëve të vektorit vektori = {1, 2, 3, 4, 5} në konzolë (ekran) në formën vektori = {1, 2, 3, 4, 5} 10 MSc. Valdrin Haxhiu 11