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

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

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

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

Referimet

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