Creeaza.com - informatii profesionale despre


Cunostinta va deschide lumea intelepciunii - Referate profesionale unice
Acasa » scoala » informatica » calculatoare
Introducere in mediul de dezvolatre emu8086

Introducere in mediul de dezvolatre emu8086


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


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.