Introducere in mediul de dezvolatre emu8086
L1.1. Scopul lucrarii
Familiarizarea cu posibilitatile de editare, asamblare si rulare a programelor scrise in limbajul de asamblare ale microprocesoarelor Intel functionand "in modul real", cu ajutorul asamblorului si emulatorului emu8086.
L1.2. Prezentare generala emu8086
Emu8086 este un emulator al microprocesorului 8086 (compatibil Intel si AMD) cu asamblor 8086 integrat si tutoriale pentru incepatori. Emulatorul executa programe ca si microprocesoarele reale in modul pas cu pas. Pe interfata sa se pot vizualiza registrele, memoria, stiva, variabile si flaguri. Toate valorile de memorie pot fi investigate si editate printr-un dublu clic. Instructiunile pot fi executate in directia inainte sau inapoi. Emulatorul poate crea un sistem de operare foarte scurt (tiny) si scrie codul binar pe un floopy disc bootabil.
Acest pachet soft include cateva dispozitive virtuale externe: robot, motor pas cu pas, afisor cu LED-uri si o intersectie luminata. Toata comunicarea dintre microprocesor si dispozitive este trecuta prin fisierul c:emu8086.io, emularea instructiunilor de intrare/iesire cere schimbarea octetilor corespunzatori in acest fisier binar.
Dupa lansarea programului emu8086, pe ecranul calculatorului apare interfata cu meniuri din care se poate alege tipul de fisier: New, Code examples, Quick start tutor, Recent files.
Realizarea unui program nou impune deschiderea unui fisier nou cu butonul New, care deschide fereastra din care se alege formatul fisierului. Pentru aplicatiile, simple, de laborator in care programul nu depaseste 64Ko se bifeaza .COM (Figura L1.1).
Emulatorul ruleaza sub Windows si are incluse urmatoarele unelte pentru usurarea programarii:
executia programului pas cu pas;
tabel coduri ASCII;
calculator pentru realizarea de calcule in binar, octal, zecimal si hexazecimal;
convertor de variabile in bazele de numeratie zecimala, hexazecimala, binar;
buton de apelare a programelor demonstrative realizate de furnizorul emu8086.
Figura L1.1 Fereastra din care se alege formatul fisierului, in cazul in care se realizeaza un proiect nou
Editarea programului. In acest mod se pot crea/modifica programe sursa scrise in limbajul de asamblare al microprocesorului INTEL 8086, sau orice alte texte ASCII.
Principalele comenzi de editare sunt aceleasi ca la orice editor simplu de text (Figura L1.2).
Figura L1.2 Fereastra de editare a programului in asamblor
Salvarea fisierului sursa se permite scrierea pe disc a fisierului aflat in editare. Programul solicita numele sub care va fi salvat fisierul text. Daca nu se introduce extensia in mod explicit, fisierului i se va atribui implicit extensia ASM.
Citirea fisierului sursa se realizeaza ca la orice editor de text utilizand Open, introducandu-l in buffer-ul de editare.
Listare fisier text. Dupa asamblarea fisierului poate fi vizualizat Listingul din fereastra Assembler status se apasa butonul View si se alege Listing. Permite vizualizarea continutului unui fisier, octet cu octet, atat in valori hexazecimale cat si in caractere ASCII.
Compilarea si asamblarea programelor scrise in limbajul asamblor 8086
Se scrie programul sursa in aria de text dedicata si se apasa cu mouse ul pe butonul Compile sau se apasa tasta F5. Se va deschide fereastra prin care sunteti intrebati calea unde se va salva fisierul compilat si numele lui. Dupa compilare in codul masina toate variabilele sunt inlocuite automat cu offetul lor. Daca este incarcat fisierul COM, registrele DS si CS vor avea aceeasi valoare.
Cand se salveaza un fisier asamblor, compilatorul salveaza deasemenea doua alte fisiere. Acestea sunt utilizate de emulator pentru a arata codul sursa original, in timpul executiei programului binar, marchandu-se linia in curs de executie. Foarte des programul original difera de programul dezasamblat deoarece nu exista comentarii, segmente si nici variabile declarate. Directiva de compilare nu produce un program in binar, dar totul este convertit in cod masina pur.
Extensii ale fisierelor salvate pe hard disc:
*.asm - contine codul sursa original, acesta este utilizat pentru a se realiza un fisier executabil;
*.debug - contine codul original care este prezentat in timpul executiei programului, fiind marcata linia in curs de executie;
*.symbol - contine tabloul de simboluri. Fisierul prezinta fereastra cu variabile, este un fisier text, se poate deschide cu editoare de text (inclusiv in editorul sursa emu8086);
*.binf - acest fisier ASCII contine informatii utilizate de emulator pentru salvarea fisierelor BIN la locatia specificata si pentru setarea valorile registrelor care sunt prioritare in executie; (creat doar daca un executabil este un fisier BIN).
ATENTIE!
Compilatorul nu este sensibil la modul de scriere, litere mici sau mari.
In lista memoriei, prima linie contine un offset, a doua linie contine o valoare hexazecimala, a treia o valoare zecimala iar ultima este valoarea ASCII a unui caracter.
Dupa compilare se apasa pe butonul Emulate pentru a se incarca fisierul compilat in emulator.
Se poate face rularea directa, cu comanda Run din submeniul Executie sau cu butonul . Nu se recomanda insa aceasta comanda decat atunci cand programul nou creat este suficient de bine pus la punct pentru a nu bloca sistemul. In fazele initiale ale dezvoltarii programului se recomanda testarea si depanarea cu comanda Emulate.
Modul de utilizare al emulatorului (Debugger)
Emulatorul poate fi utlizat chiar daca programul nu este scris in Editor. Din meniul Emulator selectati Show Emulator. Se incarca un fisier executabil apasand pe butonul Load din emulator (Figura L1.3).
Figura L1.3 Fereastra emulatorului. Sunt indicate: butonul de incarcare a fisierului executabil, lista memoriei si codul masina dezasamblat
Moduri de executie ale programelor:
1. [Single Step] - executia instructiunilor pas cu pas. Lucrand in acest mod se pot vizualiza modificarile care sunt realizate in interiorul microprocesorului dupa executia instructiunii.
2. [Run] - executia instructiunilor una dupa alta cu o intarziere intre ele setata prin Step delay.
Modul de lucru in Emulator:
Toate modificarile realizate in interiorul microprocesorului in timpul rularii pas cu pas al programului in Emu8086 se pot observa si verifica cu ajutorul acestui emulator.
Dati dublu clic pe fereastra registrelor si se va
deschide fereastra 'Extended Viewer' cu valori ale registrelor
convertite in hexa. Valorile registrelor se pot modifica direct in
fereastra.
Dublu clic pe lista memoriei deschide
'Extended Viewer' cu valori WORD incarcate din lista
memoriei, din locatia selectata. Cel mai putin semnificativ octet
este la adresa mai putin semnificativa. Valorile din locatiile
de memorie pot fi modificate direct in fereastra 'Extended Viewer'.
Butonul [Flags] permite vizualizarea si modificarea flagurilor in timpul executiei.
Variabilele sunt locatii de memorie. Pentru un programator este mai usor sa aiba valori stocate in variabile numite "variabila1" decat prin apel la adresa 5A73:235B, in special cand are 10 sau mai multe variabile. Compilatorul supoarta 2 tipuri de variabile octet si cuvant.
Variabilele care se regasesc in programul executat pot fi vizualizate selectand 'Variables' din meniul 'View' al emulatorului.
Sintaxa generala:
nume DB valoare
nume DW valoare
Nota: DB define byte
DW define worda
Nume poate fi orice combinatie de litere sau cifre cu conditia ca primul caracter sa fie o litera. Valoare poate fi orice valoare numerica suportata in una din bazele de numeratie (hexa, binar, zecimal) sau "?" simbol pentru variabilele neinitializate.
Compilatorul este informat despre tipul datei utilizand unul din prefixele:
byte ptr - pentru octet
word ptr - pentru cuvant.
Exemplu:
byte ptr [BX] ; acces octet
sau
word ptr [BX] ; acces cuvant.
Asamblorul suporta prefixe scurte ca:
b. - pentru byte ptr
w. - pentru word ptr
In anumite cazuri asamblorul poate calcula tipul datei automat.
Constantele sunt la fel ca variabilele, acestea existand insa doar pana programul este compilat (asamblat). Dupa definirea unei constante valoarea ei nu poate fi schimbata. Pentru definirea constantei se utilizeaza directiva EQU.
Sintaxa generala:
nume EQU < orice expresie >
Exemplu
K equ 2
Mov AX,K
Codul de mai sus este identic cu Mov AX,2.
Fig. L1.4 Fereastra de vizualizare a
constantelor si variabilelor utilizate intr-un program
Variabilele pot fi observate in orice baza de numeratie:
HEX - hexazecimal (baza 16).
BIN - binar (baza 2).
OCT - octal (baza 8).
SIGNED - zecimal cu semn (baza 10).
UNSIGNED - zecimal fara semn (baza 10).
CHAR - cod caracter ASCII (sunt 256 simboluri, cateva simboluri sunt invizibile).
Numerele pot fi introduse in orice baza de numeratie prin sufixul 'h' hexa, 'b' binar, 'o' octal, numerele zecimale nu au nevoie de sufix.
Sirurile de caractere pot fi introduse in urmatorul mod:
'hello world', 0 (acest sir se termina prin 0).
Matrice poate fi introdusa astfel:
1, 2, 3, 4, 5 (Matricea poate fi de octeti sau cuvinte, depinde de modul cum sunt setate variabilele initiale BYTE sau WORD).
Expresiile sunt convertite automat, de exemplu, daca se scrie expresia: 5 + 2 dupa enter va fi convertita in 7 etc
L1.4. Utilizarea mediului de dezvoltare Emu8086
Se va copia urmatorul cod sursa in editorul de programe.
ORG 100h
MOV AL, var1
MOV BX, var2
RET ; stops the program.
VAR1 DB 7
var2 DW 1234h
Se compileaza programul si se incarca in emulator. Dupa compilare, in codul masina, toate variabilele sunt inlocuite automat cu offsetul lor. Daca este incarcat fisierul COM, registrele DS si CS vor avea aceeasi valoare.
In lista memoriei, prima linie contine un offset, a doua linie contine o valoare hexazecimala, a treia o valoare zecimala iar ultima este valoarea ASCII a unui caracter.
Compilatorul nu este sensibil la modul de scriere, litere mici sau mari.
Considerand offsetul variabilei VAR1 este 0108h si adresa intreaga este 0B56:0108 iar al variabilei VAR2 este 0109h iar adresa intreaga este 0B56:0109. Aceasta variabila este un cuvant (WORD) deci va ocupa 2 octeti. De exemplu, octetul cel mai putin semnificativ care contine valoarea 34h este memorat la adresa 09h. Dupa instructiunea RET, mai sunt si alte instructiuni, aceasta se intampla deoarece dezasamblorul nu cunoaste data de inceput, el prelucreaza valoarea din memorie si le intelelge ca instructiuni valide.
Realizarea aceluiasi program scris doar cu directiva DB:
ORG 100h
DB 0A0h
DB 08h
DB 01h
DB 8Bh
DB 1Eh
DB 09h
DB 01h
DB 0C3h
DB 7
DB 34h
DB 12h
Se va copia acest cod sursa in editor, apoi se compileaza (F5) si se incarca in emulator. Se va observa ca se obtine acelasi cod dezasamblat si aceleasi functionalitati. Compilatorul, in acest caz, doar converteste programul sursa in octeti, acest set se numeste cod masina. Procesorul intelege codul masina si il executa.
ORG 100h este o directiva a compilatorului. Prin aceasta se va spune compilatorului unde sa plaseze codul sursa in memorie. Aceasta directive este importanta cand se lucreaza cu variabile. Spune compilatorului ca fisierele executabile sa fie incarcate la offset 100h (256 octeti), deci compilatorul trebuie sa calculeze adresa corecta pentru toate variabilele, cand se inlocuieste numele variabilei cu ofsetul ei. Directivele nu vor fi convertite niciodata in cod masina.
Fisierele executabile sunt incarcate de la adresa 100h deoarece sistemul de operare stocheaza cateva date in primii 256 octeti ai segmentului indicat de CS (segment de cod) ca de exemplu parametrii liniei de comanda si altele. Aceasta este valabila doar pentru fisiere COM, fisierele EXE sunt incarcate la ofset 0000, si in general utilizeaza segmente speciale pentru variabile.
Ce este un tablou (array)?
O arie poate fi vazuta ca un sir de variabile. Un caracter text este un exemplu de arie de octeti, fiecare caracter este prezentat ca o valoare de cod ASCII (0.255).
Exemplu:
a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h
b DB 'Hello', 0
b este o copie a matricii a, cand compilatorul ajunge la un character acesta este convertit automat intr un set de octeti. Harta din Figura L1.5 arata o parte a memoriei unde aceasta matrice este declarata .
Figura L1.5. Exemplu de arie de
octeti
Fiecare valoare a matricei poate fi accesata folosind paranteze patrate, ca de exmplu:
MOV AL, a[3]
De asemenea se pot utiliza oricare din registrele index BX, SI, DI, BP,
de exemplu:
MOV SI, 3
MOV AL,
a[SI]
Daca se doreste utilizarea unei matrici largite, se
foloseste operatorul DUP.
Sintaxa generala:
numar DUP ( valoare(s) )
numar - numar de duplicate
value - expresia pe care DUP o va
duplica.
Exemplu
c DB 5 DUP(9) este o alternativa
a declararii: c DB 9, 9, 9, 9, 9
d DB 5 DUP(1, 2) este o alternativa a declararii: d DB 1, 2, 1, 2, 1,
2, 1, 2, 1, 2.
Se poate utiliza DW sau DB daca se cere retinerea valorilor mai mari ca 255 sau mai mici ca 128. DW nu poate fi utilizat sa declare caractere.
Obtinerea adresei de offset a variabilelor se poate realize prin utilizarea instructiunii LEA (Load Effective Address) sau operatorul OFFSET. LEA este mai puternica deoarece permite obtinerea adresei unor variabile index. Obtinerea adreselor variabilelor este folositoare in unele situatii, ca de exemplu pentru utilizarea parametrilor intr o procedura.
Exemple
ORG 100h
MOV AL, VAR1; verificarea valorii lui VAR1 mutand-o in AL
LEA BX, VAR1; obtinerea adresei lui VAR1 in BX
MOV BYTE PTR [BX], 44h; modificarea continutului lui VAR1
MOV AL, VAR1; verificarea valorii lui VAR1 mutand-o in AL
RET
VAR1 DB 22h
END
2. Se utilizeaza OFFSET in loc de LEA:
ORG 100h
MOV AL, VAR1; verificarea valorii lui VAR1 mutand-o in AL
MOV BX, OFFSET VAR1; obtinerea adresei lui VAR1 in BX
MOV BYTE PTR [BX], 44h; modificarea continutului lui VAR1
MOV AL, VAR1; verificarea valorii lui VAR1 mutand-o in AL
RET
VAR1 DB 22h
END
Cele doua exemple au aceeasi functionalitate.
Urmatoarele linii:
LEA BX, VAR1
MOV BX, OFFSET VAR1 sunt compilate in acelasi cod masina: MOV BX, num
num este o valoare pe 16 biti a variabilei offset.
Nota: Registrele care pot fi
utilizate intre paranteze patrate sunt: BX, SI, DI, BP
L1.4. Desfasurarea lucrarii
Se deschide un proiect nou in care fisierul sa fie de tip COM ;
Se editeaza textul sursa de mai jos;
Se salveaza textul pe disc cu numele test1.asm ;
Se compileaza programul si se incarca in emulator;
Se executa pas cu pas ;
Se observa adresa de inceput la care este plasat programul in memoria cod;
Se observa codul hexa al programului salvat in memorie si adresa curenta;
Se observa, prin deschiderea ferestrei Vars, variabilele si constantele definite in program;
Se observa modificarile care au loc in registre ;
Se observa modul de lucru si de stocare a variabilelor in memoria de date prin accesarea butonului Memory din butonul de meniu Aux.
Se va compila programul utilizand butonul Compile apoi se apasa butonul Close din fereastra care apare dupa compilare. Tot in aceasta fereastra putem sa identificam numarul de erori sau atentionari si tipul lor si liniile de program care le produc. Dupa compilare daca se doreste executia programului pas cu pas, pentru a vizualiza modificarile care se produc, se apasa butonul Emulate. Din fereastra emulatorului se va apasa butonul Single Step prin care se executa programul pas cu pas.
Test1.asm
ORG 100h ; directiva ceruta pentru programe COM
MOV AX, 0AC09h ; initializare registrul AX cu valoarea hexazecimala AC09h.
MOV DS, AX ; copie valoarea din AX in DS.
MOV CL, 'A' ; initializare registru CL cu codul ASCII a lui 'A', adica 41h.
MOV CH, 01010011b ; intializeaza registrul CH cu valoarea binara
MOV BX, 17Dh ; initializeaza BX cu 17Dh
MOV [BX], CX ; copiaza continutul registului CX in memorie la adresa B800:017D
MOV VARS1,#23h;
MOV AL, VAR1; salvare variabila VAR1 in AL
RET ; return
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |