Emu8086

**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](https://sq.wikipedia.org/wiki/Java_(gjuh%C3%AB_programimi)), 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ë:

* 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
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 me qëllim të përgjithshëm
  *** 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
  *** 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
   *** 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
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**.

   *** 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
   *** 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
- 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
*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'

*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

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