Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
1. Introducere
Pachetul de programe Turbo-Assembler pune la dispozitia
utilizatorului toate instrumentele necesare pentru dezvoltarea programelor in
limbaj de asamblare. Macroasamblorul TASM produce module obiect
relocabile din fisiere sursa in limbaj de asamblare. Pentru aceste module
obiect se pot edita legaturile cu programul TLINK in scopul crearii de
programe executabile sub sistemul de operare DOS. Pachetul cuprinde:
a) macroasamblorul TASM;
b) editorul de legaturi TLINK;
c) bibliotecarul TLIB;
d) depanatorul simbolic TD.
Pentru
depanare se poate folosi si depanatorul standard al sistemului de operare DOS,
DEBUG.
2. Alegerea tipului de fisier executabil
Sunt posibile urmatoarele formate de fisiere executabile:
. EXE este formatul uzual pentru fisiere executabile
sub sistemul de operare DOS. Programele executabile pastrate in acest
format pot avea segmente multiple. Este formatul recomandat pentru programe de
dimensiuni mari. Extensia lor implicita este .EXE;
. COM - programele in acest format sunt limitate
pentru un singur segment, din acest motiv ele nedepasind 64 Ko (exceptand
cazurile cand nu se specifica segmente). Se recomanda pentru programe mici. Un
dezavantaj important este acela ca nu contin informatii despre sursa si
simbolice pentru depanatorul simbolic TD. Ele pot fi depanate insa cu DEBUG
sau cu TD in mod nesimbolic;
3. Comenzi necesare dezvoltarii unui program
Pentru aflarea optiunilor la linia de comanda a
programelor TASM si TLINK se lanseaza in executie aceste
programe fara nici un parametru in linia de comanda. Efectul este afisarea
sintaxei liniei de comanda impreuna cu optiunile disponibile. Comenzile uzuale
sunt:
. pentru asamblarea unui program:
TASM nume
unde nume este numele fisierului ce contine programul sursa, implicit cu
extensia .ASM;
. pentru asamblarea unui program cu obtinerea fisierului
listing:
TASM /l nume
unde nume este numele fisierului ce contine programul sursa, implicit cu
extensia .ASM;
. pentru asamblarea unui program cu depunerea de informatii
simbolice in fisierul obiect rezultat, informatii necesare depanatorului
simbolic TD:
TASM /zi nume
unde nume este numele fisierului ce contine programul sursa, implicit cu
extensia .ASM;
. pentru editarea legaturilor unui program:
TLINK nume
unde nume este numele fisierului obiect rezultat in urma asamblarii, implicit
cu extensia .OBJ. Implicit se genereaza si harta de alocare a
memoriei;
. pentru editarea legaturilor unui program cu depunerea de
informatii simbolice in fisierul executabil rezultat necesare depanatorului
simbolic TD:
TLINK /v nume
unde nume este numele fisierului obiect rezultat in urma asamblarii cu optiunea
/zi, implicit cu extensia .OBJ. Implicit se genereaza si
harta de alocare a memoriei;
. pentru editarea legaturilor unui program in vederea
obtinerii unui fisier executabil in format COM:
TLINK /t nume
unde nume este numele fisierului obiect rezultat in urma asamblarii unui
program sursa in format COM. Implicit are extensia .OBJ;
. pentru depanarea programului executabil obtinut:
TD nume
unde nume este numele fisierului executabil rezultat in urma editarii
legaturilor, implicit cu extensia .EXE sau .COM.
Depanarea cu TD poate fi obisnuita sau simbolica.
Depanarea obisnuita presupune ca in momentul depanarii sa se cunoasca adresele
variabilelor din program impreuna cu segmentele in care se afla aceste
variabile. Depanarea simbolica presupune ca in momentul executiei programul
depanator sa aiba acces la numele simbolice ale variabilelor din program,
depanarea fiind in acest caz mai usor de realizat.
Pentru depanarea obisnuita se parcurg urmatorii pasi:
. Se asambleaza si link-editeaza programul;
. Se lanseaza TD in executie cu comanda mentionata
mai sus. Efectul este aparitia pe ecran a unei ferestre impartita in 5
subferestre: subfereastra cu programul, subfereastra de registre, subfereastra
de flaguri, subfereastra de stiva si subfereastra de date. Trecerea dintr-o
subfereastra in alta se face apasand tasta TAB;
. Se identifica deplasamentele si adresele de segment ale
variabilelor din program pe baza examinarii fisierelor listing si / sau a
subferestrei cu programul;
. Se vizualizeaza valorile initiale ale variabilelor prin
activarea subferestrei de date, apasarea tastelor CTRL-G si
introducerea in casuta de dialog a adresei variabilei ce se vrea examinata sub
forma segment: offset;
. Se activeaza subfereastra cu programul si se executa apoi
programul pas cu pas (instructiune cu instructiune) apasand tastele F7
sau F8 si simultan examinand celelalte subferestre;
. La terminarea depanarii se paraseste programul depanator cu Alt-X.
Pentru depanarea simbolica se parcurg urmatorii pasi:
. Se asambleaza si se link-editeaza programul cu optiunile de
depanare simbolica prezentate mai sus;
. Se lanseaza TD in executie cu comanda indicata. Pe
ecran apare o fereastra ce contine programul asa cum a fost introdus in
fisierul sursa;
. Se introduc in fereastra Watches variabilele al
caror continut se doreste a fi urmarit in timpul executiei prin apasarea
tastelor Ctrl-F7 si introducerea in casuta de dialog ce apare a
numelui acestor variabile; Eventual se deschide fereastra de registre cu
comanda Alt-V R;
. Se executa apoi programul pas cu pas (instructiune cu
instructiune) apasand tastele F7 sau F8 urmarind fereastra Watches
si fereastra de registre;
. La terminarea depanarii se paraseste programul depanator cu Alt-X.
4. Desfasurarea lucrarii
Procedura generala de lucru este urmatoarea:
1. Se foloseste un editor de texte pentru crearea sau
modificarea modulelor sursa. Prin conventie acestea au extensia implicita .ASM.
Ele se pot organiza in diverse moduri. Spre exemplu toate procedurile se pot
plasa intr un modul mai mare sau se pot scinda pe mai multe module;
2. Se utilizeaza TASM pentru asamblarea fiecarui modul de program. Se
pot utiliza optional fisiere de includere (fisiere ce sunt incluse in modulul
asamblat doar pe durata asamblarii). Daca apar erori dupa executarea acestui
pas se revine la pasul anterior. Pentru fiecare fisier sursa .ASM se
creeaza in urma asamblarii:
. un fisier obiect cu extensia implicita .OBJ;
. un fisier listing cu extensia implicita .LST
(optional);
. un fisier de referinte incrucisate cu extensia implicita .REF
(optional).
Daca se doreste legarea de module scrise in asamblare cu module scrise intr un
limbaj de nivel inalt, acestea se vor compila in fisiere obiect.
3. Optional se foloseste TLIB pentru plasarea mai multor fisiere
obiect intr un singur fisier biblioteca cu extensia implicita .LIB.
Acest lucru se intampla cand se doreste legarea unor fisiere obiect standard la
mai multe programe. De asemenea TLIB poate crea un fisier optional de
listare a continutului bibliotecii;
4. Se foloseste TLINK pentru a combina toate fisierele obiect si
modulele biblioteca ce formeaza un program in cadrul unui singur fisier
executabil care are implicit extensia .EXE. Optional se poate crea si
o harta de alocare a memoriei, cu extensia implicita .MAP;
5. Se poate realiza editarea
legaturilor cu optiunea /l pentru crearea (daca este necesara) a unui
fisier executabil in format binar. Aceasta operatie este necesara pentru
programele scrise in format COM (care vor avea extensia .COM)
sau pentru fisierele binare.
6. Se depaneaza programul pentru depistarea erorilor de logica. Dintre tehnicile
utilizate se amintesc:
. studiul raspunsului programului la diferite seturi de date
de intrare;
. studiul fisierelor sursa si listing;
. utilizarea fisierului listing cu referinte incrucisate;
. utilizarea depanatorului simbolic TD pentru
depanare dinamica.
4.1. Exemple de programe in format EXE
Primul program afiseaza pe ecran un mesaj de salut.
TITLE hello
.MODEL small
.STACK 100h
.DATA
Message1 DB 'Hello! ',13,10,'Hello!',13,10,'$'
.CODE
Start:
mov ax,@data
mov ds,ax;
mov dx, offset Message1
mov ah,9h
int 21h
mov ah,4ch
int 21h
END Start
Se remarca urmatoarele:
1. Directiva .MODEL este folosita pentru
initializarea modelului de memorie.
Efectul cumulat al celor doua directive este definirea segmentelor implicite pentru
programe de model mic generandu-se directivele ASSUME si GROUP
utilizate de programele de model mic;
2. Directiva .STACK defineste o stiva de 256 octeti, suficienta pentru
programe mici;
3. Directiva .DATA marcheaza inceputul segmentului de date. In cazul
nostru acest segment contine o variabila sir de caractere si lungimea acestuia;
4. In linia Message1 se retine mesajul care va fi afisat in program. Numerele
13, 10 codifica "Enter" (trecerea la randul urmator).
5. Eticheta primei instructiuni ce urmeaza directivei .CODE marcheaza
inceputul portiunii executabile a programului. Aceeasi eticheta este utilizata
dupa directiva END ea definind astfel punctul de unde va incepe
executia programului (numit si punctul de intrare in program);
6. Primele doua instructiuni initializeaza registrul ds. Simbolul @data
reprezinta numele segmentului creat cu directiva .DATA. Registrul ds
va fi intotdeauna initializat pentru fisiere sursa in format EXE;
7. Continutul variabilei de tip sir de caractere definita in program se
afiseaza pe ecran utilizand functia DOS cu codul 40h.
Fisierul 'handle' 1 (driver predefinit pentru iesirea standard) este
specificat pentru afisarea pe ecran. Sirurile pot fi de asemenea afisate pe
ecran cu functia DOS cu codul 09h;
8. Functia DOS cu codul 4Ch este utilizata pentru terminarea
programului si iesirea la sistem. Exista si alte tehnici de iesire la sistem
dar aceasta este cea recomandata.
Programul urmator are ca scop citirea a doua numere naturale si realizeaza suma
dintre acestea.
TITLE adunare
.MODEL small
.STACK 100h
.DATA
a DB ?
b DB ?
Message1 DB 'a= ','$'
Message2 DB 13,10,'b= ','$'
Message3 DB 13,10,'$'
Message4 DB '+','$'
Message5 DB '=','$'
.CODE
Start:
mov ax,@data
mov ds,ax
mov dx, offset Message1
mov ah,09h
int 21h
mov ah, 01h
int 21h
sub al,48
mov a,al
mov dx, offset Message2
mov ah,9h
int 21h
mov ah, 01h
int 21h
sub al,48
mov b,al
mov dx, offset Message3
mov ah,9h
int 21h
; scrierea valorii primei variabile
mov dl,a
add dl,48
mov ah, 02h
int 21h
mov dx, offset Message4
mov ah,9h
int 21h
; scrierea valorii celei de-a doua
variabile
mov dl,b
add dl,48
mov ah, 02h
int 21h
mov dx, offset Message5
mov ah,9h
int 21h
; adunarea celor doua variabile
mov dl,a
add dl,b
add dl,48
mov ah, 02h
int 21h
mov ah,4ch
int 21h
END start
Instructiunea
add realizeaza adunarea a celor doi parametrii cititi anterior.
In
Turbo Assambler punerea in comentariu a unor linii se realizeaza prin punerea
la inceputul liniei a semnului de punctuatie ";".
4.2. Citirea fisierelor de listare a asamblarii
TASM va crea un fisier de listare a asamblarii
fisierului sursa ori de cate ori se da un nume de fisier de listare a
asamblarii pe linia de comanda TASM sau se foloseste optiunea de
asamblare /l. Fisierul de listare a asamblarii contine atat
instructiunile din fisierul sursa cat si codul obiect (daca exista) generat
pentru fiecare instructiune. Listarea prezinta, de asemenea, numele si valorile
tuturor etichetelor, variabilelor si simbolurilor din fisierul sursa.
Asamblorul creeaza tabele pentru macrodefinitii, structuri, inregistrari,
segmente, grupuri si alte simboluri. Aceste tabele sunt plasate la sfarsitul
fisierului de listare a asamblarii (exceptand cazul in care ele sunt suprimate
cu optiunea /n). TASM listeaza numai tipurile de simboluri
intalnite in program. De exemplu, daca programul nu contine macrodefinitii, in
tabloul de simboluri nu va exista o sectiune de macrodefinitii. Toate numele de
simboluri vor fi prezentate cu litere mari, exceptand cazul in care sunt
utilizate optiunile /ml sau /mx pentru a specifica nume ce
contin si litere mici.
Asamblorul listeaza codul generat de instructiunile unui fisier sursa. Fiecare
linie are sintaxa ce urmeaza:
Numar_linie deplasament cod instructiune
unde:
. numar_linie - este numarul liniei din listing.
Numararea incepe de la prima instructiune din fisierul de listare a asamblarii.
Numerele liniilor sunt generate numai atunci cand se cere un fisier de
referinte incrucisate. Numerele liniilor dintr un listing nu corespund
intotdeauna liniilor din fisierul sursa;
. deplasament - reprezinta deplasarea de la inceputul
segmentului curent pana la codul corespunzator liniei respective;
. cod - indica valoarea numerica in hexazecimal a
codului generat daca aceasta valoare este cunoscuta in timpul asamblarii. Daca
valoarea este calculata in timpul executiei, TASM indica actiunea
necesara pentru calcularea valorii;
. instructiune - este instructiunea sursa prezentata
exact asa cum apare in fisierul sursa, sau asa cum este expandata in urma unei
macrosubstitutii.
Daca apar erori in timpul asamblarii, fiecare mesaj de eroare va aparea chiar
sub instructiunea in care a aparut eroarea. In continuare este prezentat un
exemplu de linie ce contine o eroare si mesajul de eroare corespunzator.
11 0005 A1
0000 mov ax,aa
**Error** adunare.ASM(11) Undefined symbol: AA
Numarul 11
din mesajul de eroare reprezinta linia sursa in care a aparut eroarea.
Listingul model prezentat in continuare este realizat prin asamblarea
programului din fisierul adunare.asm.
Linia de comanda este urmatoarea:
TASM /l adun
Listingul rezultat, plasat in fisierul adunare.lst, este prezentat in continuare:
Turbo Assembler Version 4.1
05/09/02 21:30:52
d:tasmbinalexadunare.asm
adunare
.MODEL small |
||
.STACK 100h |
||
|
.DATA |
|
a DB ? |
||
b DB ? |
||
0002 61 3D 20 24 |
Message1 DB 'a= ','$' |
|
0006 0D 0A 62 3D 20 24 |
Message2 DB 13,10,'b= ','$' |
|
000C 0D 0A 24 |
Message3 DB 13,10,'$' |
|
000F 2B 24 |
Message4 DB '+','$' |
|
0011 3D 24 |
Message5 DB '=','$' |
|
.CODE |
||
Start: |
||
0000 B8 0000s |
mov ax,@data |
|
0003 8E D8 |
mov ds,ax |
|
0005 BA 0002r |
mov dx, offset Message1 |
|
0008 B4 09 |
mov ah,09h |
|
000A CD 21 |
int 21h |
|
000C B4 01 |
mov ah, 01h |
|
000E CD 21 |
int 21h |
|
0010 2C 30 |
sub al,48 |
|
0012 A2 0000r |
mov a,al |
|
0015 BA 0006r |
mov dx, offset Message2 |
|
0018 B4 09 |
mov ah,9h |
|
001A CD 21 |
int 21h |
|
001C B4 01 |
mov ah, 01h |
|
001E CD 21 |
int 21h |
|
0020 2C 30 |
sub al,48 |
|
0022 A2 0001r |
mov b,al |
|
0025 BA 000Cr |
mov dx, offset Message3 |
|
0028 B4 09 |
mov ah,9h |
|
002A CD 21 |
int 21h |
|
002C 8A 16 0000r |
mov dl,a |
|
0030 80 C2 30 |
add dl,48 |
|
0033 B4 02 |
mov ah, 02h |
|
0035 CD 21 |
int 21h |
|
|
;sub al,48 |
|
;mov a,al |
||
0037 BA 000Fr |
mov dx, offset Message4 |
|
003A B4 09 |
mov ah,9h |
|
003C CD 21 |
int 21h |
|
003E 8A 16 0001r |
mov dl,b |
|
0042 80 C2 30 |
add dl,48 |
|
0045 B4 02 |
mov ah, 02h |
|
0047 CD 21 |
int 21h |
|
;sub al,48 |
||
;mov b,al |
||
0049 BA 0011r |
mov dx, offset Message5 |
|
004C B4 09 |
mov ah,9h |
|
004E CD 21 |
int 21h |
|
0050 8A 16 0000r |
mov dl,a |
|
0054 02 16 0001r |
add dl,b |
|
0058 80 C2 30 |
add dl,48 |
|
005B B4 02 |
mov ah, 02h |
|
005D CD 21 |
int 21h |
|
005F B4 4C |
mov ah,4ch |
|
0061 CD 21 |
int 21h |
|
END start |
Turbo
Assembler Version 4.1 05/09/02 21:30:52
Symbol Table
adunare
Segmentele si grupurile utilizate in fisierul sursa sunt listate la sfarsitul programului, indicandu-se dimensiunea lor, tipul de aliniere, de combinare si clasa. Daca in fisierul sursa au fost utilizate directive de segment simplificate, numele reale de segmente generate de TASM vor fi listate in tabela. Pentru exemplificare prezentam tabela de segmente si grupuri corespunzatoare listingului anterior:
Groups & Segments |
Bit Size |
Align |
Combine |
Class |
DGROUP |
Group | |||
STACK |
Para |
Stack |
STACK |
|
_DATA |
Word |
Public |
DATA |
|
_TEXT |
Word |
Public |
CODE |
Prima
coloana indica numele tuturor segmentelor si grupurilor din modulul sursa.
Numele de segmente si grupuri sunt date in ordine alfabetica, exceptand cazul
in care numele de segmente ce apartin unui grup sunt plasate sub numele
grupului in ordinea in care au fost adaugate grupului.
Coloana
Bit indica numarul de biti ai cuvantului segmentului respectiv.
Coloana Size indica dimensiunea in numar de octeti (in hexazecimal) a
fiecarui segment. Nu este prezentata dimensiunea grupurilor.
Coloana Align indica tipul de aliniere al segmentului, implicit fiind Para,
adica aliniere la paragraf (multiplu de 16).
Coloana Combine indica tipul de combinare al segmentului. Daca nu este
definit un tip de combinare explicit pentru segment, se asociaza implicit none,
care este un tip de combinare special.
Coloana Class indica numele clasei segmentului.
Toate simbolurile (cu exceptia numelor pentru macrodefinitii, structuri,
inregistrari si segmente) sunt prezentate in tabela de simboluri aflata la
sfarsitul listingului. Pentru
exemplificare consideram tabela de simboluri corespunzatoare listingului
anterior:
Symbol Name |
Type |
Value |
??DATE |
Text | |
??FILENAME |
Text |
'adunare ' |
??TIME |
Text | |
??VERSION |
Number |
040A |
@32BIT |
Text | |
@CODE |
Text |
_TEXT |
@CODESIZE |
Text | |
@CPU |
Text |
0101H |
@CURSEG |
Text |
_TEXT |
@DATA |
Text |
DGROUP |
@DATASIZE |
Text | |
@FILENAME |
Text |
ADUNARE |
@INTERFACE |
Text |
000H |
@MODEL |
Text | |
@STACK |
Text |
DGROUP |
@WORDSIZE |
Text | |
A |
Byte |
DGROUP:0000 |
B |
Byte |
DGROUP:0001 |
MESSAGE1 |
Byte |
DGROUP:0002 |
MESSAGE2 |
Byte |
DGROUP:0006 |
MESSAGE3 |
Byte |
DGROUP:000C |
MESSAGE4 |
Byte |
DGROUP:000F |
MESSAGE5 |
Byte |
DGROUP:0011 |
START |
Near |
_TEXT:0000 |
Coloana Symbol
Name prezinta numele simbolurilor in ordine alfabetica.
Coloana Type prezinta fiecare tip de simbol. Un tip este specificat ca
fiind unul dintre urmatoarele:
Tip |
Semnificatie |
Near |
Eticheta cu referinta apropiata |
Far |
Eticheta cu referinta indepartata |
Number |
Eticheta absoluta |
Alias |
Simbol definit cu directiva EQU |
Text |
Echivalare de text |
Byte |
Un octet |
Word |
Un cuvant (doi octeti) |
Dword |
Dublu cuvant (patru octeti) |
Fword |
Cuvant de lungime sase octeti |
Qword |
Cuvant de lungime opt octeti |
Tbyte |
Zece octeti |
Tipul unei variabile generata cu operatorul de
multiplicare DUP, cum ar fi un tablou sau un sir, este tipul unui
singur element.
Coloana Value indica valorile simbolurilor din program. Valoarea unui
simbol depinde de tipul simbolului. Spre exemplu, daca simbolul reprezinta o
variabila, o eticheta sau o procedura, coloana Value contine
deplasamentul simbolului in hexazecimal fata de inceputul segmentului in care
este definit, impreuna cu numele segmentului respectiv.
Echivalarile de text de la inceputul tabelei sunt cele definite automat de
asamblor.
5. Modul de lucru
1. Se vor asambla si rula programele prezentate obtinandu
se fisiere .EXE;
2. Se vor obtine si se vor analiza fisierele listing si de referinte
incrucisate;
3. Se vor testa cat mai multe dintre optiunile de lucru ale macroasamblorului TASM;
4. Se va rula sub DEBUG
sau TD cel putin unul dintre programele prezentate.
Copyright © 2024 - Toate drepturile rezervate