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, 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
[Redakto | Redakto nëpërmjet kodit]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
[Redakto | Redakto nëpërmjet kodit]* 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 | Redakto nëpërmjet kodit]* 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 | Redakto nëpërmjet kodit]* 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 | Redakto nëpërmjet kodit]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
[Redakto | Redakto nëpërmjet kodit]* 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 | Redakto nëpërmjet kodit]- 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 | Redakto nëpërmjet kodit]*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
[Redakto | Redakto nëpërmjet kodit]- www.emu8086.com
- Computer Organization and Architecture: Designing for Performance (8th Edition), William Stallings.