Emu8086

Nga Wikipedia, enciklopedia e lirë
Jump to navigation Jump to search

Emu 8086 është emulator i mikroprocesorit 8086 dhe disasembler. Emulatori lejon shkrimin, rregullimin dhe testimin e programeve në 8086(16 bit/DOS). Gjuha asemblike është një gjuhë e ulët programuese, ku njohuria e mëhershme për gjuhët e larta programuese si Java, Basic, C/C++, Pascal do të ishtë ndihmesë e madhe. Ju duhet të merrni disa njohuri për strukturën e kompjuterit në mënyrë që të kuptoni gjithçka. Modeli i thjeshtë i kompjuterit është:

Modeli i thjeshtë i kompjuterit

System Bus i treguar në të verdhë lidh komponentet e ndryshme të kompjuterit. CPU ose njësia qendrore e përpunimit është pjesa kryesore e kompjuterit,ku shumica e llogaritjeve ndodhin në të. RAM ose memorie me qasje të rastësishme është vendi ku programet ngarkohen në mënyrë që të ekzekutohen.

Brenda CPU[redakto | përpunoni burim]

Procesori 8086 përbëhet prej regjistrave të cilët ndahën në: regjistra me qëllim të përgjithshëm, segment regjistrave si dhe regjistra me qëllime speciale.

Regjistrat

Regjistrat me qëllim të përgjithshëm[redakto | përpunoni burim]

 * AX - regjistri akumulator(ndahet në AH/AL)
 * BX - regjistri me adresën bazë(ndahet në BH/BL) 
 * CX - regjistri numërues(ndahet në CH/CL)
 * DX - regjistri i të dhënave(ndahet në DH/DL)
 * SI - burimi tregues
 * DI - ideksi i destinimit
 * BP - pointeri bazë
 * SP - pointeri i stekut

- Pavarësisht nga emri i regjistrit, është programeri ai që cakton përdorimin e secilit prej regjistrave me qëllim të përgjitshëm. Qëllimi kryesor është të mbajë një numër(variabë). Madhësia e regjistrave të mësipërm është 16 bit, mirpo katër regjistrat e parë janë të ndarë në dy regjistra nga 8 bit, për shembull AX ndahet në AH dhe AL, ku "H" është për high dhe "L" është për loë.

Segment regjistrat[redakto | përpunoni burim]

 * CS - tregon segmentin i cili përmban programin aktual.
 * DS - tregon segmentin në të cilin definohen variablat.
 * ES - ekstra segment regjistër, është në dorën e programerit t'a definoj përdorimin e këtij regjistri.
 * SS - tregon segmentin që e përmban stekun.

- Edhe pse mund të ruajmë çfarë do të dhëne në segment regjistra, kjo nuk është ide e mirë. Segment regjistrat kanë një qëllim të veçantë - tregojnë blloqet e memories të cilat janë të arritshëm. Segment regjistrat veprojnë së bashku me regjistrat me qëllim të përgjitshëm të arrijnë çdo vlerë memorike, ku adresa e formuar nga dy regjistrua quhet adresë efektive.

Regjistrat me qëllim special[redakto | përpunoni burim]

  * IP - pointeri udhëzues
  * Regjistri i flamujve - tregon gjendjen aktuale të mikroprocesorit.

- IP regjistri punon gjithnjë me CS regjistrin dhe tregon instruksionin e tanishëm të ekzekutimit. Flags register modifikiohet automatikisht nga CPU pas operacioneve matematikore, ku kjo lejon përcaktimin e llojit të rezultatit, dhe të përcaktojë kushtet e transferit të kontrollit në pjesët tjera të programit.

Regjistri i flamujve[redakto | përpunoni burim]

Shumica e instruksioneve aritmetike dhe logjike afektojnë regjistrin për status të procesorit(ose Flamujt) Siç edhe shihet në këtë regjistër janë 16 bit, ku secili bit quhet flamur dhe mund të merr vlerën 1 ose 0.

Flamujt
  * Carry Flag(CF) - ky flamur merr vlerën 1 kur ka tepricë pa parashenjë.
  * Zero Flag(ZF) - merr vlerën 1 kur rezultati është zero. Për rezultat të ndryshëm prej zeros ky flamur merr  vlerën 0.
  * Sign Flag(SF) - vendoset tek 1 kur rezultati është negativ ose në 0 kur rezultati është pozitiv.
  * Overflow Flag(OF) - merr vlerën 1 kur kemi tepricë me parashenjë.
  * Parity Flag(PF)  - merr vlerën 1 kur ka numër çift në njërin prej bitave të rezultatit, dhe 0 kur ka numër tek në njërin prej bitave të rezultatit.
  * Auxiliary Flag(AF) - vendoset në 1 kur kemi tepricë pa parashenjë në 4 bita.
  * Interrupt enable Flag(IF) - kur ky flamur vendoset tek 1 procesori reagon në ndërprerje nga pajisje të jashtme.
  * Direction Flag(DF)  - kur ka vlerën 0 - procesi shkon përpara, nëse vlera është 1 procesi shkon prapa.

Lista e instruksioneve kryesore në 8086[redakto | përpunoni burim]

  * ADD - Bën mbledhjen e dy variablave të ndara me presje.
  * AND - DHE logjike e të gjithë bitave të të dy operandëve. Rezultati ruhet në operandin e parë.
  * CMP - Krahason dy variabla, rezultati nukr uhet askund dhe flamujt janë të caktuar në bazë të rezultatit.
  * DEC - Zvogëlon variablën e caktuar për 1.
  * DIV - Pjesëtimi pa parashenjë.
  * IDIV - Pjesëtimi me parashenjë.
  * IMUL - Shumëzimi me parashenjë.
  * INC - e kundërta me DEC, rrit variablën e caktuar për 1.
  * JMP - Kërcimi pa kusht. Kalon kontrollin në një pjesë tjetër të programit.
  * LEA - Gjen adresën efektive.
  * LOOP - Zvogëlon CX, kalon tek pjesa e caktuar nësë CX nuk është e barabartë me zero.
  * MOV - Kopjon operandin e dytë në operandin e parë.
  * MUL - Shumëzim pa parashenjë.
  * NEG - Negacioni, e bën operandin e caktuar negativ.
  * OR - OR logjike në mes të gjith bitave të dy operandëve. Rezultati ruhet në operandin e parë.
  * POP - Merr vlerë 16-bitëshe nga steku.
  * PUSH - Ruan vlerë 16-bitëshe në stek.
  * RET - Kthehet nga procedura e afërme.
  * SUB - Zbritja e dy vlerave.

Ndërprerjet[redakto | përpunoni burim]

- Lista e disa prej ndërhyrjeve të cilat aktualisht përkrahen prej emulatorit. Këto ndërhyrje duhet të jenë të pajtueshëm me IBM PC dhe të gjitha gjeneratat e x86, mikroprocesorë origjinal Intel 8086 dhe AMD, megjithatë Ëindoës XP mund të mbishkruajë disa prej ndërhyrjeve origjinale.

  * INT 10h / AH = 0  - vendosin modin video.
  * INT 10h / AH = 2  - vendos pozicionin e kursorit.
  * INT 10h / AH = 03h  - merr pozicionin dhe madhësinë e kursorit.
  * INT 10h / AH = 06h  - bën lëvizjen e dritares lart.
  * INT 10h / AH = 07h  - bën lëvizjen e dritares poshtë.
  * INT 10h / AH = 0Ah  - shkruan një karakter vetëm tek pozita e kursorit.
  * INT 10h / AH = 0Ch  - ndryshon ngjyrën për një piksel të vetëm.
  * INT 10h / AH = 13h  - shënon një string.

Shembull[redakto | përpunoni burim]

Kodi në emulator

*Emri hi-world

  • org 100h

Vendos modin video

  • mov ax, 3 ; teksti 80x25, 16 ngjyra, 8 faqe (ah=0, al=3)
  • int 10h
  • mov ax, 1003h
  • mov bx, 0
  • int 10h

Vendos segment regjistrin

  • mov ax, 0b800h
  • mov ds, ax

Printon "hello world" Bajti i parë është ASCII kod, bajti i dytë është kodi i ngjyrës.

  • mov [02h], 'H'
  • mov [04h], 'e'
  • mov [06h], 'l'
  • mov [08h], 'l'
Shembulli i ekzekutuar në emulator
  • mov [0ah], 'o'
  • mov [0ch], ','
  • mov [0eh], 'W'
  • mov [10h], 'o'
  • mov [12h], 'r'
  • mov [14h], 'l'
  • mov [16h], 'd'
  • mov [18h], '!'

Ngjyros të gjitha karakteret

  • mov cx, 12 Numri i karaktereve.
  • mov di, 03h Fillo prej bajtit pas h
  • c: mov [di], 11101100b E kuqe e lehtë(1100) në të verdhë(1110)
  • add di, 2 Kalo ASCII kodin e ardhshëm në vga memorie.
  • loop c

Prisni për ndonjë shtypje të butonit:

  • mov ah, 0
  • int 16h
  • ret

Referencat[redakto | përpunoni burim]

  • www.emu8086.com
  • Computer Organization and Architecture: Designing for Performance (8th Edition), William Stallings.