Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Utilitarele Debug si Turbo Debugger
1.1 Debug
Aceasta utilitara este un program de depanare care furnizeaza un mediu de testare controlat pentru fisiere obiect binare si executabile; elimina nevoia de reasamblare a programului pentru a vedea daca o problema a fost rezolvata printr-o modificare minora.
El permite sa se modifice continutul unui fisier sau continutul registrelor CPU, si apoi imediat, sa se reexecute un program pentru a verifica validitatea modificarilor facute.
Toate comenzile debug pot fi abandonate in orice moment prin tastarea Ctrl-C. Secventa Ctrl-S suspenda afisarea, astfel ca sa poata fi citita imaginea de pe ecran, inainte de a se continua defilarea liniilor pe ecran. Afisarea se reia cu orice tasta, in afara de Ctrl-C sau Ctrl-S.
Sunt doua moduri in care poate fi lansat programul de depanare debug :
- primul permite toate comenzile ca raspuns la promptul sau;
- cel de-al doilea permite, in plus, specificarea unor comenzi si in linia de comanda, utilizata pentru a lansa debug.
Metoda 1:
>debug
Se va lansa in executie programul debug, care va raspunde cu promptul (-), semnaland ca este gata de a primi comenzi. Se poate lucra in memoria curenta, sectoare de disc sau fisiere de pe disc.
Daca se primeste mesajul
Program terminated normally
nu relansati un program; trebuie reincarcat programul cu comenzile N (Name) sau L (Load) pentru o executie adecvata.
Metoda 2:
>debug [ nume_fisier [ lista_argumente ]]
de exemplu :
>debug fisier.exe
In urma acestei comenzi se va incarca in memorie, pe langa utilitara de depanare - debug, si fisier.exe, incepand de la adresa 100h, in segmentul disponibil, cel mai de jos. In registrele BX:CX se incarca numarul de octeti (in hexazecimal) ocupati in memorie de programul incarcat (fisier.exe).
Campul lista_arumente - reprezinta restul liniei de comanda utilizata de catre debug, cand apeleaza si incarca fisierul in memorie.
Cand se depaneaza un fisier .exe sau .com nu trebuie modificat continutul memoriei mai jos de adresa 5Ch sau, altfel, programul de depanare se va termina.
Fiecare comanda consta dintr-o singura litera urmata de unul sau mai multi parametrii.
Iata, enumerate, aceste comenzi:
A [ adresa ] - asamblare de la 'adresa' sau 100h;
C domeniu adresa - compara doua zone de memorie;
D [ domeniu ] - afiseaza continutul unei zone de memorie;
E adresa [ lista ] - introduce 'lista' de octeti de la adresa specificata;
F domeniu lista - umple zona de memorie cu 'lista' de octeti;
G [ = adresa [ adresa ] ] - lanseaza in executie o secventa de program de la adresa de dupa =, pana la una din adresele urmatoare;
H valoare valoare - calculeaza suma si diferenta hexazecimala a celor doi parametrii;
I valoare - citeste de la portul de intrare specificat;
L [ adresa [ disc : inregistrare inregistrare ] ] - incarca un fisier sau inregistrari de pe disc;
M domeniu adresa - muta continutul unei zone de memorie la adresa specificata;
N nume_fisier [ nume_fisier ] - specifica numele unui fisier ce va fi invocat de o comanda L sau W, ulterioara;
O valoare octet - scrie octetul specificat la portul respectiv;
Q - sfarsit sesiune de lucru Debug, revenire in MS-DOS;
R [ nume_registru ] - permite afisarea si modificarea registrelor;
S domeniu lista - cauta 'lista' in domeniul specificat;
T [ = adresa ] [ valoare ] - executie pas cu pas a unui program, cu afisarea registrelor, indicatorilor si a instructiunii ce urmeaza sa se execute;
U [ domeniu ] - dezasambleaza zona de memorie specificata;
W [ adresa [ disc : inregistrare inregistrare ] ] - scrie pe disc un fisier sau inregistrari;
Parametrii din aceste comenzi sunt despartiti intre ei de spatii libere sau de virgule si au urmatoarea forma:
disc indica discul de pe care se citeste sau pe care se scrie: 0 = A: , 1 = B: , 2 = C: , 3 = D: ;
octet valoare de tip octet (doua cifre hexazecimale);
inregistrare valoare de 1-3 cifre hexa care indica numarul inregistrarii logice de pe disc si numarul de sectoare de pe disc ce vor fi scrise / citite. Inregistrarile logice corespund sectoarelor;
valoare o valoare hexa, de cel mult 4 cifre hexa;
adresa reprezinta o destinatie, formata din doua parti, continand fie numele unui registru de segment sau o adresa de segment de cel mult 4 cifre hexa, plus o valoare de deplasament (offset), despartita de prima prin doua puncte. Daca se omite numele sau valoarea registrului segment se considera implicit registrul segment DS pentru toate comenzile, cu exceptia comenzilor G , L , T , U si W, pentru care se considera registrul CS. De exemplu: CS:0200
04BA:0300
domeniu contine doua adrese sau 'adresa L valoare', in care valoare reprezinta numarul de linii pentru care se da comanda. Exemplu :
CS:100 1B00
200:200 L 20
Pentru cea de-a doua adresa se poate omite adresa de segment, intrucat se
considera egala cu prima adresa de segment, specificata.
lista o serie de valori de tip octet sau un sir de caractere (string); de exemplu :
f cs:100 42 45 52 54 41
Parantezele drepte [,] utilizate in descrierea comenzilor nu trebuie tastate, deoarece ele specifica doar faptul ca parametrii respectivi sunt optionali; acolo unde aceste paranteze lipsesc inseamna ca parametrii respectivi sunt obligatorii. Daca se introduce o comanda eronata (eroare de sintaxa), Debug nu o ignora si afiseaza promptul - asteptand introducerea de noi comenzi, corecte.
A [ adresa ]
Permite editarea unui program in limbaj de asamblare, cu anumite restrictii (nu se pot utiliza nume simbolice, deci toate adresele sunt absolute, iar toate constantele sunt specificate prin valori absolute, in hexazecimal, fara a fi urmate de litera h corespunzatoare acestei conventii din limbajele de asamblare). Editarea se va incepe de la adresa specificata sau, in caz contrar, de la adresa 100h in cadrul segmentului disponibil, cel mai de jos; pentru operatorii de conversie de tip: word ptr, byte ptr se pot utiliza formele prescurtate: wo si respectiv by.
La inceputul fiecarei linii se afiseaza adresa curenta din memorie (segment : offset), si se asteapta introducerea de instructiuni, in limbaj de asamblare, terminate cu Enter (CR), dupa care se reia editarea cu o linie noua. Pentru linia anterioara el genereaza codul masina respectiv si indexeaza, in mod corespunzator, adresa urmatoarei instructiuni. Daca trebuie sa se specifice un camp al unei instructiuni (ca in cazul unei instructiuni de salt la o adresa ulterioara), care nu este cunoscut in momentul introducerii liniei respective, se vor completa octetii corespunzatori cu zero (sau alta valoare), iar dupa editarea celorlalte linii, cand campurile respective devin cunoscute, se poate reedita (reasambla), integral, numai instructiunea respectiva, prin specificarea adresei instructiunii.
Daca se introduce o instructiune gresita (eroare sintactica), editorul nu asambleaza linia respectiva si afiseaza aceeasi adresa pe o linie noua, asteptand introducerea de noi instructiuni, corecte.
Revenirea in modul comanda, din modul de editare, se realizeaza tastand Enter (CR), cand se afiseaza pe o linie o noua adresa, fara a mai edita nimic pe linia respectiva.
Daca comanda nu este urmata de parametru 'adresa', se va continua asamblarea (editarea) de la adresa la care ramasese editarea anterioara.
Exemplu :
-A 5A2C:200 (CR)
5A2C:0200 _
C domeniu adresa
Compara zona de memorie specificata de 'domeniu' cu o zona, de aceeasi dimensiune, incepand de la adresa specificata. Daca cele doua zone de memorie sunt identice nu se afiseaza nimic, si se revine in modul comanda din Debug. Daca exista diferente intre cele doua zone de memorie se afiseaza octetii diferiti si adresele corespunzatoare, din cele doua zone, in formatul:
adresa_zona_1 octet_zona_1 octet_zona_2 adresa_zona_2
Exemplu :
-C 3AB2:100 200 300
- va compara continutul zonei de memorie cuprinsa intre adresele relative 100h si 200h, in segmentul care incepe la adresa 3A2Bh, cu continutul unei zone de aceeasi lungime care incepe de la adresa 300h, in acelasi segment de memorie.
D [ domeniu ]
Afiseaza continutul zonei de memorie specificata prin 'domeniu'. Daca comanda nu este urmata de parametrul 'domeniu', atunci se afiseaza 128 de octeti, incepand de la afisarea anterioara. Afisarea se face in doua campuri: hexazecimal si ASCII. Pentru caracterele netiparibile se afiseaza '.'. Se afiseaza pe fiecare linie adresa, continutul hexa pentru 16 octeti incepand de la adresa respectiva, separati in doua grupe prin -, iar dupa aceea caracterele ASCII corespunzatoare codurilor hexa, respective. Exemplu :
-D 100 10f
3AB2:0100 30 41 42 43 44 45 46 47 - 38 39 4a 4b 4c 4d 4e 4f 0ABCDEFG89JKLMNO
E adresa [ lista ]
Comanda permite introducerea in memorie a unor valori de tip octet, incepand de la adresa specificata. Daca 'lista' nu este specificata se pot introduce valori octet cu octet. Debug afiseaza adresa specificata si vechiul continut si asteapta:
introducerea unei noi valori, dupa care trece la adresa urmatoare, afisand din nou vechiul continut al acesteia;
daca se tasteaza spatiu (blanc), atunci se trece la urmatoarea locatie de memorie, fara modificarea celei curente;
daca se tasteaza - se revine la octetul anterior, pe care il tipareste pe o linie noua, precedat de adresa sa;
daca se tasteaza Enter (CR), se incheie comanda E.
F domeniu lista
Comanda permite umplerea unei zone de memorie cu valorile din 'lista'. Daca domeniul este mai mare decat lungimea listei, aceasta va fi depusa repetat in memorie pana se umple domeniul specificat. Daca lista este mai lunga, valorile suplimentare din lista sunt ignorate.
G [ = adresa [ adresa adresa ] ]
Aceasta comanda permite executia unui program; programul incepe de la adresa specificata dupa semnul =, care face deosebirea intre adresa de start si celelalte adrese care reprezinta puncte de breakpoint (de suspendare a executiei programului in momentul in care sunt atinse). In cazul in care se intalneste o astfel de adresa, specificata in comanda, se intrerupe executia programului si se afiseaza adresa la care s-a ajuns, instructiunea executata, continutul registrelor si a indicatorilor. Se pot specifica pana la 10 de astfel de adrese de breakpoint, dar numai la adrese ce contin primul octet al unei instructiuni. De fapt la adresele de beakpoint se plaseaza codul intreruperii 3 (INT 3), care trateaza intreruperea; in stiva trebuie sa fie disponibili cel putin 6 octeti, deoarece se salveaza registrul indicatorilor, registrele segment si IP.
Lansarea in continuare a programului se poate face doar cu comanda G, fara nici un parametru. Se evita, de obicei, acest mod de lansare in executie deoarece se poate pierde controlul asupra calculatorului, daca programul nu este bine pus la punct.
H valoare valoare
Comanda furnizeaza suma si diferenta, fara transport (imprumut), a celor doi parametri. Exemplu :
-H 1234 ABCD
BE01 6667
I valoare
Citeste si afiseaza un octet de la portul specificat (valoare).
L [ adresa [ disc inregistrare inregistrare ]]
Comanda fara parametrii incarca in memorie, de la adresa CS:0100, un fisier al carui nume a fost specificat intr-o comanda N , anterioara; se va depune in BX:CX numarul de octeti incarcati. Daca se specifica adresa, fisierul va fi incarcat, in memorie, de la adresa specificata.
Daca se utilizeaza comanda cu toti parametrii se vor incarca, de pe disc, sectoare absolute in locul unui fisier. Unitatea de disc de la care se face citirea este specificata de campul 'disc'. Se va incarca prima inregistrare specificata si se continua cu urmatoarele, pana cand numarul de sectoare este egal cu cel de-al doilea parametru din comanda. De exemplu:
-L04BA:100 2 0F 6D
se vor incarca 109 (6Dh) inregistrari, incepand cu inregistrarea logica numarul 15 (0Fh), in memorie incepand cu adresa 04BA:0100. Parametrul adresa este ignorat pentru fisierele .exe. Daca comanda L contine 'adresa', Debug o va aduna la adresa gasita in fisierul .exe, pentru a determina adresa de start la care se incarca fisierul.
M domeniu adresa
Comanda permite mutarea unui bloc de memorie, specificat de 'domeniu', incepand de la adresa specificata. Mutarea suprapusa este fara pierdere de date, deoarece octetul de la adresa ce ar putea fi pierdut prin scriere peste el, este salvat primul. Adresele trebuie sa fie in ordine crescatoare.
N nume_fisier
Aceasta comanda realizeaza doua functii :
asigneaza un nume de fisier pentru o comanda L sau W, ulterioara. Daca s-a lansat Debug fara a se specifica numele unui fisier, atunci trebuie utilizata aceasta comanda inainte de incarcarea sau scrierea unui fisier;
asigneaza parametrii nume_fisier la fisierul in depanare.
O valoare octet
Transmite la portul de iesire specificat (valoare), octetul.
Q Sfarsit sesiune de lucru Debug; revenire MS-DOS.
R [ nume_registru ]
Aceasta comanda, fara nici un parametru, afiseaza continutul tuturor registrelor si starea indicatorilor de conditii. Daca comanda este urmata de numele unui registru, se afiseaza continutul curent al acestuia si se poate modifica continutul sau.
Starea indicatorilor de conditii este afisata astfel :
Indicator Set(1) Clear(0)
OF OV NV
DF DN UP
IF EI DI
SF NG PL
AF AC NA
PF PE PO
CF CY NC
Indicatorii pot fi afisati separat, deci numai ei, prin comanda RF, si se pot modifica prin precizarea mnemonicii dorite a indicatorului respectiv.
Se cauta in 'domeniul' specificat 'lista' de octeti. Lista poate contine unul sau mai multi octeti, separati prin spatiu sau virgula. Comanda returneaza adresele la care este gasita lista de octeti.
T [ = adresa ] [ valoare ]
Aceasta comanda executa instructiune cu instructiune incepand de la adresa specificata dupa semnul =, si afiseaza continutul tuturor registrelor, indicatorilor si urmatoarea instructiune de executat; daca parametrul 'valoare' lipseste, se va executa o singura instructiune, altfel se vor executa cate instructiuni specifica acest parametru (hexazecimal).
Daca comanda nu are nici un parametru se executa o singura instructiune, de la adresa curenta din CS. De exemplu :
-T=11A 10
va executa 16 instructiuni incepand de la adresa CS:011A.
U [ adresa ]
Comanda dezasambleaza octeti si afiseaza declaratiile sursa ce le corespund, impreuna cu adresele si valorile octetilor. Daca comanda nu este urmata de parametru sunt dezasamblati 32 octeti, de la prima adresa dupa cea afisata de comanda U anterioara.
W [ adresa [ disc inregistrare inregistrare ] ]
Scrie fisierul in depanare intr-un fisier de pe disc, al carui nume a fost precizat intr-o comanda N, anterioara. In rest comanda este asemanatoare, din punct de vedere al parametrilor si al semnificatiei acestora, cu comanda L. In registrele BX:CX trebuie sa se specifice numarul de octeti de transferat pe disc.
Mesaje de eroare
bf = s-au tastat caractere gresite pentru indicatorii de conditii (bad flag);
bp = s-au specificat prea multe puncte de breakpoint intr-o comanda G (too many breakpoints);
br = nume gresit de registru (bad register);
df = s-au specificat doua valori diferite pentru acelasi indicator (double flag).
1.2. Turbo Debugger
Se poate utiliza Turbo Debugger (TD) pentru a depana orice program scris in C, Pascal sau limbaj de asamblare. El permite sa se gaseasca eroarea si cauza acesteia; permite executia partiala a programului (executand instructiune cu instructiune), astfel ca se poate examina starea programului.
TD permite executia pas cu pas, linie cu linie, puncte de intrerupere, vizualizarea variabilelor, registrelor, continutul stivei, inspectarea, modificarea si urmarirea programului. De asemenea permite depanarea de programe orientate obiect Pascal si C++. In schimb TD nu permite:
editarea programului; el nu contine un editor incorporat, si, deci nu permite modificarea codului sursa. Pentru modificarea acestuia se reediteaza si recompileaza;
recompilarea programului; el nu poate recompila programul, care se realizeaza cu programul original.
TD are un meniu global convenabil accesibil, tot timpul, dintr-o 'bara' de meniuri, afisata in partea de sus a ecranului, prin intermediul unui cursor. Sistemul de meniuri are o organizare ierarhica; pentru fiecare meniu se deschide un submeniu (pull-down menu), care permite executia unei comenzi , sau care permite deschiderea unui nou submeniu (pop-up menu), pentru acele elemente urmate de o iconita meniu (R), sau a unei casete de dialog, pentru acele elemente urmate de o iconita de dialog ().
Sunt patru moduri in care se poate deschide un meniu :
tasta F10, urmata de sagetile de deplasare, stanga respectiv dreapta, pana la pozitionarea pe meniul dorit, si apoi tasta Enter (CR), va deschide meniul selectat;
F10, si apoi prima litera a meniului dorit ( spatiu, F , V , R , B , R , O , W , H );
Alt + prima litera a meniului dorit ( spatiu, F , V , R , B , R , O , W , H );
cu mouse-ul se deplaseaza pe nivelul dorit si se apasa pe butonul din dreapta;
Pentru deplasarea de la un meniu la altul se utilizeaza sagetile directionale (stanga, dreapta), iar pentru deplasarea in cadrul unui meniu specificat, de la o comanda la alta se utilizeaza sagetile de deplasare sus, jos. Pentru deplasarea la primul sau ultimul meniu se utilizeaza tastele 'Home' si 'End'.
Pentru iesirea dintr-un submeniu si revenirea la meniul anterior se tasteaza 'Esc'; la fel se procedeaza ('Esc') si pentru revenirea dintr-un meniu la fereastra activa. De asemenea tastand F10, la orice nivel de meniu se revine la fereastra activa.
Unele comenzi ale meniului permit accesul rapid, prin tastarea unei anumite combinatii de taste speciale (hot key), care apar, in meniu, in dreapta acestor comenzi. In figura urmatoare se prezinta meniul complet al TD.
Casetele de dialog pot contine unul sau mai multe elemente de tipul:
butoane, reprezentate printr-un text umbrit (sau in video invers). Daca se alege un buton TD realizeaza imediat actiunea respectiva. Pentru a confirma alegerea facuta se selecteaza butonul 'OK' (tasta speciala pentru 'ok' este Alt-K), iar pentru a se anula se selecteaza 'Cancel'. Casetele de dialog contin si butonul 'Help', care ofera informatii suplimentare despre ele.
casete de listare, care contin o lista de elemente dintre care se poate selecta.
Parcurgerea diferitelor casete de dialog se realizeaza cu tastele Tab (inainte) si Shift-Tab (inapoi). Pentru a modifica 'butoanele radio' se utilizeaza sagetile directionale. Pentru a selecta un 'buton' se tasteaza 'Tab' si apoi 'Enter'.
TD este sensibil la context, adica el stie precis ce se cauta si unde este cursorul cand se alege o comanda. El utilizeaza aceasta informatie cand raspunde la o comanda. De exemplu sa consideram o linie dintr-un program Pascal:
variabila [ i ] := variabila [ i ] + 1;
Daca se tasteaza Ctrl-I, se deschide o fereastra de inspectare (Inspector Window). Cand cursorul este pe 'variabila', TD prezinta informatii despre intregul vector (variabila). Daca insa cursorul e pozitionat (deci supraafisat) pe 'variabila [ i ]', si apoi se tasteaza Ctrl-I, TD stie ca se doreste inspectarea unui singur element si il va afisa numai pe acesta. In acest mod se pot obtine detalii din ce in ce mai fine asupra programului.
Un alt aspect al dependentei de context a TD este la utilizarea meniurilor locale, specifice diferitelor ferestre sau afisari in cadrul ferestrelor. Meniurile locale sunt dependente de fereastra sau afisarea particulara in care se afla utilizatorul. Nu pot fi active simultan ambele tipuri de meniuri.
Meniurile globale
sunt accesibile prin tasta F10 si sagetile (stanga, dreapta), sau prin tastarea primei litere a meniului ales din bara de meniuri;
meniurile globale sunt, intotdeauna, accesibile din bara de meniuri (afisata in partea superioara a ecranului );
continutul lor este fix;
unele dintre comenzile meniului au taste speciale, rapide, de activare din orice parte a TD.
|
un meniu local poate fi activat prin Alt-F10 sau Ctrl-F10, sau prin apasarea butonului drept al mouse-ului;
plasarea si continutul meniului depinde de fereastra sau afisajul (panoul) in care este utilizatorul, si unde este cursorul;
continutul poate varia de la un meniu la altul; rezultatele comenzilor cu nume asemanatoare, pot fi, totusi, diferite, depinzand de context;
fiecare comanda dintr-un meniu local are o tasta speciala de activare, rapida, constand din Ctrl + litera supraafisata a comenzii.
O alta facilitate oferita de TD este aceea ca el pastreaza o lista a istoriei comenzilor introduse in casetele de intrare si afiseaza textul introdus anterior intr-o astfel de caseta, ori de cate ori este apelata. Se poate utiliza aceasta lista, ca scurtatura, pentru a tasta, prin utilizarea sagetilor si a tastei 'Enter', si a selecta orice intrare anterioara. Daca se utilizeaza o intrare nemodificata din lista istoriei, aceasta intrare e copiata in varful listei. Se pot, de asemenea, edita intrarile, prin deplasare cu sagetile pentru a insera cursorul in textul supraafisat, si apoi se editeaza textul, utilizand 'Del' si 'Backspace'. Lista istoriei afiseaza, de obicei, ultimele cinci raspunsuri; dimensiunea poate fi modificata utilizand programul TDINST.
TD mai permite specificarea incompleta a textului unei intrari, si completarea ei automata prin specificarea corecta a unei parti a numelui simbolic din program, si apoi se tasteaza Alt-N.
Macro-urile sunt taste speciale definite de utilizator. Se poate asigna orice serie de comenzi TD si taste la o singura tasta, pentru reluarea lor ori de cate ori este cazul. Pentru a crea un macro se selecteaza Options³Macros. In acest moment sunt disponibile patru comenzi: Create, Stop Recording, Remove, Delete all, care permit crearea, terminarea, inlocuirea sau stergerea de macro-uri. Dupa introducerea comenzilor se tasteaza o tasta sau combinatie de taste, dorite, la care vor fi asignate acestea. Pentru a termina sesiunea de editare a unui macro, se poate alege intre:
- Options³Macros³Stop Recording;
- tastati noua tasta sau combinatie de taste, definite anterior;
tastati Alt-.
Meniul Sistem ( s )
Repaint Desktop - reafiseaza intregul ecran;
Restore Standard - reface amplasarea standard a ferestrei;
About - afiseaza informatii despre TD.
Meniul fisier ( File )
Acest meniu afiseaza continutul unui fisier de pe disc sub forma unor linii de octeti hexa sau ca text ASCII. Se poate cauta un anumit text sau secventa de octeti. Comenzile acestui meniu sunt :
Open - deschide un nou program pentru depanare;
Change Dir - modifica directorul sau discul curent;
Get Info - afiseaza informatii asupra programului;
DOS Shell - revine in DOS pentru a primi comenzi DOS;
Resident - termina TD si ramane rezident;
Symbol Load - incarca tabela de simboluri, independent de fisierul .exe, pentru a o inlocui pe cea curenta;
Table Relocate - seteaza segmentele de baza ale tabelei de simboluri;
Quit - revenire in DOS, parasire TD.
Comanda File³Resident se utilizeaza la depanarea unui program TSR (Terminate and Stay Resident): se incarca programul TSR, cu tabela de simboluri, ca la un program normal. Apoi se ruleaza programul, se termina si ramane rezident. Se poate seta orice breakpoint, si comanda pentru a face TD rezident. Pentru revenire in TD se utilizeaza tasta de 'intrerupere' (Ctrl-Break).
Breakpoints - afiseaza punctele de breakpoint;
Stack - afiseaza stiva pentru apeluri de functii;
Log - afiseaza informatii pentru evenimente si date;
Watches - afiseaza variabilele care sunt monitorizate;
Variables - afiseaza variabilele globale si locale;
Module - afiseaza modulul programului sursa;
File - afiseaza fisier de pe disc (ASCII sau hexa);
CPU - afiseaza instructiuni CPU, date, stiva;
Dump - afiseaza date, pe linii;
Register - afiseaza registrele generale si indicatorii CPU;
Numeric processor - afiseaza daca este procesor matematic in sistem, sau este emulat;
Execution History - afiseaza codul de asamblare salvat, pentru reluare;
Urmatoarele comenzi sunt utilizate pentru depanarea programelor orientate obiect (OOP):
Hierarchy - afiseaza lista tipurilor de obiecte sau clase si ierarhia lor;
Another
Module - realizeaza o alta fereastra 'Module';
Dump - realizeaza o alta fereastra 'Dump';
File - realizeaza o alta fereastra 'File';
Meniul Executie program (Run)
Run - executa programul incarcat, pana la capat, deci fara opriri;
Go To Cursor - executa programul pana la locatia curenta a cursorului;
Trace Into - executa o singura linie sursa sau instructiune, dupa cum este activa o fereastra 'Module' sau 'CPU';
Step Over - executa o singura linie sursa sau instructiune, mai putin apelurile de proceduri sau functii (pe care le executa integral);
Execute To - executa programul pana la adresa specificata in caseta de dialog;
Until Return - executa programul pana cand se intalneste instructiunea de revenire din functie sau
procedura;
Animate - realizeaza o serie de comenzi Trace Into, actualizand ecranul dupa fiecare comanda;
permite rularea programului cu o viteza redusa. Se poate intrerupe prin tastarea oricarei taste;
Back Trace - revine, pentru executie, la o linie sursa sau instructiune anterioara;
Instruction Trace - executa o singura instructiune;
Arguments - permite introducerea de noi argumente in linia de comanda a programului;
Program Reset - permite reincarcarea, de pe disc, a programului curent, dar utilizatorul ramane cu
cursorul in pozitia in care era la apelarea comenzii;
Toggle - permite starea (pozitionarea) sau stergerea unui breakpoint (punct de suspendare a executiei programului), la adresa curenta (supra-afisata) in fereastra 'Module' sau 'CPU';
At - amplasarea unui breakpoint la adresa specificata, in caseta de dialog ce se deschide pentru aceasta optiune;
Changed Memory Global - amplaseaza punct de breakpoint, global, care devine activ cand o zona
de memorie modifica o valoare;
Expression True Global - seteaza punct de breakpoint, care este activat cand valoarea unei expresii, date de utilizator, devine adevarata;
Hardware breakpoint - determina activarea unui breakpoint de un driver de dispozitiv (TDH386.SYS ), asistat hardware (placa de depanare hardware);
Delete All - sterge toate punctele de breakpoint;
Meniul de date (Data)
Acest meniu permite examinarea si modificarea datelor programului; se poate evalua o expresie, modifica valoarea unei variabile, si deschide ferestre 'Inspector', pentru a afisa continutul variabilelor.
Inspect - inspecteaza o data obiect, si deschide o fereastra de inspectare, care afiseaza continutul unei expresii sau variabile din program; se poate introduce numele unei variabile sau o expresie complexa.
Evaluate/Modify - deschide o caseta de dialog, care permite introducerea si evaluarea unei expresii;
Add Watch - permite adaugarea de variabile/expresii in fereastra 'Watches';
Function Return - afiseaza intr-o fereastra 'Inspector' valoarea de returnat a functiei curente ;
Meniul Optiuni (Options)
Acest meniu permite setarea sau ajustarea unor parametrii care controleaza operarea TD.
Language - permite precizarea limbajului sursa (C, Pascal sau Asamblare), pentru evaluarea expresiilor din caseta de dialog Evaluate/Modify;
Macros - permite definirea de macro-uri , de noi taste, sau stergerea unora, deja asignate la o tasta (a fost descrisa anterior, la construirea de macro); contine urmatoarele comenzi :
Create - defineste un macro, asociat la o tasta;
Stop recording - sfarsitul sesiunii de definire de macro;
Removes - sterge un macro;
Delete All - sterge toate macro-urile si restabileste semnificatia initiala a tastelor;
Display Options - deschide o caseta de dialog, in care se pot pozitiona cateva optiuni, care comanda modul de afisare;
Path for Source - se precizeaza directoarele in care TD cauta fisiere sursa;
Save Options - se deschide o caseta de dialog, din care se pot salva optiunile curente (macro, formate de afisare, ferestre si toate setarile facute in meniul 'Options') intr-un fisier de configuratie, pe disc;
Restore Options - reface optiunile de pe disc, prin selectarea fisierului de configuratie, dorit;
Zoom - permite modificarea dimensiunii ferestrei la intregul ecran, si invers;
Next - activeaza ferestrele urmatoare;
Next Pane - trece la urmatoarea caseta dintr-o fereastra;
Size/Move - muta sau modifica dimensiunile ferestrei;
Iconize/Restore - reduce fereastra la o iconita (un simbol redus) sau o reface;
Close - inchide fereastra;
Undo Close - redeschide ultima fereastra, care a fost inchisa;
Dump Pane to Log - scrie caseta curenta in fereastra 'Log';
User Screen - afiseaza 'ecranul utilizator' - adica afisarile (iesirile) programului;
Open Window list - afiseaza lista ferestrelor deschise, pentru activare;
Window Pick - afiseaza un meniu cu meniurile deschise, daca sunt deschise mai mult de 9;
Meniul de informatii (Help)
Index - acces la indexul de informatii, pentru selectarea topicii pentru care se doresc informatii;
Previous Topic - se reafiseaza la ultimul ecran cu informatii;
Help on Help - informatii despre utilizarea acestui meniu;
1.4. Lista Comenzilor (Taste speciale)
F1 = informatii despre dependenta de context a TD;
F2 = Breakpoints³Toggle;
F3 = View³Module;
F4 = Run³Go to Cursor;
F5 = Window³Zoom;
F6 = Window³Next Window;
F7 = Run³Step Over;
F8 = Run³Run;
F10 = acces la bara meniu;
Alt-F1 = Help³Previous Topic;
Alt-F2 = Breakpoints³At;
Alt-F3 = Windows³Close;
Alt-F4 = Run³Back Trace;
Alt-F5 = Window³User Screen;
Alt-F6 = Window³Undo Close;
Alt-F7 = Run³Instruction Trace;
Alt-F8 = Run³Until Return;
Alt-F9 = Run³Execute To;
Alt-F10 = meniul local al ferestrei;
Alt-1¸9 = comutare intre ferestrele numerotate de la 1 la 9;
Alt-spatiu = intra in meniul Sistem;
Alt-B = meniul Breakpoints;
Alt-D = meniul Data;
Alt-F = meniul File;
Alt-H = meniul Help;
Alt-O = meniul Options;
Alt-R = meniul Run;
Alt-V = meniul View;
Alt-W = meniul Window;
Alt-X = meniul File³Quit - iesire di TD, revenire in DOS;
Alt-= = meniul Options³Macros³Create;
Alt-- = meniul Options³Macros³Stop Recording;
Ctrl-F2 = Run³Program Reset - sfarsit sesiune de depanare si reinitializare, o noua lansare;
Ctrl-F4 = Data³Evaluate;
Ctrl-F5 = Window³Size/Move;
Ctrl-F7 = Data³Add Watch;
Ctrl-F8 = Breakpoints³Toggle;
Ctrl-F9 = Run³Run;
Ctrl-F10 = meniul local al ferestrei;
Ctrl = deplaseaza adresa de start, in caseta Code/ Data /Stack (CPU), cu un octet, in sus;
Ctrl ¯ = deplaseaza adresa de start, in caseta Code/Data/Stack (CPU ), cu un octet, in jos;
Ctrl-A = deplasare pe cuvantul anterior;
Ctrl-C = defilare un ecran, in jos;
Ctrl-D = deplasare cu o coloana;
Ctrl-E = deplasare cu o linie, in sus;
Ctrl-F = deplasare pe cuvantul urmator;
Ctrl-R = defilare un ecran, in sus;
Ctrl-S = deplasare cu o coloana, la stanga;
Ctrl-X = deplasare cu o linie, in jos;
Shift-F1 = Hepl³Index;
Shift-Tab = deplasarea cursorului in caseta anterioara a ferestrei, sau in caseta de dialog;
Shift = deplasarea cursorului intre casetele
Shift = unei ferestre (caseta din directia sagetii
Shift = devine caseta activa );
Esc = inchide o fereastra 'Inspector', sau iesire din meniu;
Ins = selectia unui bloc de text (ce va fi supra-afisat), impreuna cu sagetile ¯
Tab = Window³Next³Pane;
. Editarea si executia unor programe simple in Debug.
2.1. Interschimbarea a doua locatii de memorie
(3000h:200h si 3000h:300h, respectiv, de tip cuvant).
Adresele absolute propuse, 3000h:200h, pot fi modificate daca nu sunt disponibile (de fapt este vorba de modificarea adresei de segment, 3000h, cu o adresa superioara)
a) Utilizarea utilitarei Debug
Pentru exemple simple, compuse doar din cateva instructiuni, este mult mai simplu sa utilizam Debug-ul care permite atat editarea cat si executia acestor programe. Editorul este unul foarte redus si simplu, intrucat nu permite corectarea liniilor scrise, decat prin reeditarea lor; mai mult, liniile urmatoare celor eronate, care au fost reeditate trebuie rescrise si ele, intrucat pe masura editarii liniile sunt translatate in cod masina si depuse in memorie peste codul anterior editat, astfel incat dupa liniile corectate vor urma 'fragmente' din liniile urmatoare celor corectate, in functie de numarul de octeti ocupat de liniile reeditate.
Singura situatie in care nu este necesara reeditarea liniilor urmatoare, celor corectate, este cea in care numarul de octeti al instructiunilor reeditate este egal cu numarul de octeti avut de aceste instructiuni, inainte de reeditare (dar probabilitatea este destul de mica).
Revenind la problema propusa, secventa de comenzi necesara este urmatoarea:
- se lanseaza, mai intai utilitara Debug:
C:> Debug
- dupa care se intra in modul de comanda al acesteia, si se da comanda de asamblare:
- a2000:100
mov ax,3000
Textul scris supraimprimat reprezinta comenzile introduse de utilizator, restul (adresa, scrisa cursiv) reprezentand raspunsurile utilitarei Debug. Editarea unei linii se termina prin apasarea tastei RETURN; pana atunci se pot face corectii ale textului scris, utilizand tastele de deplasare (sagetile) si tastele DEL, BS. In continuare, dupa fiecare linie introdusa, care este imediat asamblata, asamblorul afiseaza locatia de memorie a urmatoarei linii, pe care pentru a nu ingreuna urmarirea programului am omis-o (dar ea este permanent afisata). deci programul propriu-zis este urmatorul:
mov ax,3000
mov ds,ax
mov ax,[200]
xchg ax,[300]
mov [200],ax
mov ax,4c00
int 21
Reamintim ca pentru asamblorul Debug toate datele imediate sunt interpretate implicit in hexazecimal, deci nu este nevoie sa punem dupa o valoare numerica tipul 'h', acesta fiind implicit; mai mult chiar daca din greseala tastati 'h'-ul asamblorul va va semnala o eroare pe linia respectiva si continua editarea de la aceeasi adresa, ca de altfel pentru orice alta eroare.
Cat timp se afiseaza adresa locatiei urmatoare sunteti in modul 'editare'. Pentru a executa programul trebuie sa parasiti modul de editare (asamblare) si sa treceti in modul comanda, prin tastare RETURN pe o linie noua, urmatoarea celei ce reprezinta ultima instructiune din program.
Pentru executie se poate opta pentru executia pas cu pas, daca programul nu este prea lung si doriti sa vedeti ce se intampla dupa executia fiecarei instructiuni, sau daca doriti sa depanati programul. Comanda pentru executie pas cu pas este, in acest caz:
-T2000:100
care va executa doar prima instructiune, dupa care pentru executia urmatoarelor instructiuni se va tasta, in mod repetat pentru fiecare instructiune, doar:
-T
Daca se doreste executia integrala a programului se va utiliza comanda G:
- G = adresa de start (segment:offset), adresa de sfarsit (offset-ul)
adresa de sfarsit = prima adresa, furnizata de asamblor, dupa cea a ultimei instructiuni din programul editat.
Pentru vizualizarea rezultatelor si introducerea datelor se vor utiliza comenzile: D, E, F, descrise in capitolul precedent.
b) Editare utilizand un editor de text.
Pentru editare se poate folosi orice editor de text disponibil, cum ar fi editoarele din mediile C, Pascal, editorul din NC (cel mai simplu si mai direct de folosit), si altele. Programul editat, cu un astfel de editor, este urmatorul:
prog segment word public 'code'
assume cs:prog
start: mov ax,3000h ; adresa de segment unde vor fi datele introduse din Debug
mov ds,ax
mov ax,[200] ; adresele relative ale celor doi operanzi
xchg ax,[300]
mov [200],ax
mov ax,4C00h ; revenire in DOS
int 21h
prog ends
end start
Dupa editare programul va fi salvat intr-un fisier cu extensia 'asm': intersch.asm. Pentru obtinerea fisierului obiect se va apela utilitara TASM:
C:>tasm intersch.asm
care va furniza, daca nu sunt erori, fisierul obiect: intersch.obj. Urmatoarea etapa este cea de editare de legaturi, utilizand utilitara TLINK:
C:>tlink intersch.obj
care va furniza fisierul executabil: intersch.exe.
Acesta poate fi direct executat, dar pentru a vedea efectele sale el va fi rulat sub controlul Debugger-ului:
C:>debug intersch.exe
Comanda de lansare este aceeasi ca in cazul anterior. Pentru a vizualiza programul se va utiliza comanda U, descrisa in primul capitol.
Pentru exemplele urmatoare se vor prezenta doar programele, fara detaliile de editare si etapele necesare executiei programelor, intrucat ele au fost prezentate pe larg pentru acest prim exemplu, dar si in primul capitol.
2.2. Interschimbarea a doua locatii succesive de memorie
(3000h:200h si 201h, respectiv, de tip octet).
Pentru astfel de situatii (informatii aflate la locatii succesive de memorie) se va utiliza pentru adresare un registru index (SI sau DI) sau de baza (BX, de regula sau BP, dar acesta face referire implicit la segmentul de stiva, referit de SS)
a) Utilizarea utilitarei Debug (aceasta nu permite utilizarea de comentarii).
mov ax,3000
mov ds,ax
mov si,200
mov al,[si]
inc si
xchg al,[si]
dec si
mov [si],ax
mov ax,4c00
int 21
b) Editare utilizand un editor de text.
prog segment word public 'code'
assume cs:prog
start: mov ax,3000h ; adresa de segment unde vor fi datele introduse din Debug
mov ds,ax
mov si,200h ; adresa relativa a primului octet
mov al,[si] ; citirea primului octet
inc si ; pozitionare pe cel de-al doilea octet
xchg al,[si] ; interschimbare (AL) <-> al doilea octet
dec si ; revenire la adresa primului octet
mov [si],al ; depunerea celui de-al doilea octet, deci interschimbarea
mov ax,4C00h ; revenire in DOS
int 21h
prog ends
end start
2.3. Adunarea a doua locatii succesive de memorie
(3000h:200h si 202h, respectiv, si depunerea rezultatului in continuare,
dupa cei doi operanzi, de tip cuvant, fara semn).
a) Utilizarea utilitarei Debug.
mov ax,3000
mov ds,ax
mov si,200
mov ax,[si]
add si,2
add ax,[si]
add si,2
mov [si],ax
mov ax,4c00
int 21
b) Editare utilizand un editor de text.
prog segment word public 'code'
assume cs:prog, ds:date
start: mov ax,3000h ; adresa de segment unde vor fi datele introduse din Debug
mov ds,ax
mov si,200h ; adresa relativa a primului cuvant
mov ax,[si] ; citirea primului cuvant
add si,2 ; pozitionare pe cel de-al doilea cuvant
add ax,[si] ; (AX) = suma celor doi octeti
; aici se poate testa indicatorul (CF) pentru depasire rezultat
jc afis_mesaj ; (CF) = 1 ? , daca da -> mesaj depasire
; numerele sunt fara semn, deci rezultatul este > 65535
; daca consideram numerele cu semn, atunci rezultatul va fi
; in intervalul [-32768,+32767], pentru detectarea depasirii
; limitei superioare sau inferioare in locul instructiunii 'jc'
; se va utiliza instructiunea 'jo' (Jump Overflow)
add si,2 ; adresa rezultatului
mov [si],ax ; depunerea celui de-al doilea octet, deci interschimbarea
rev_DOS:
mov ax,4C00h ; revenire in DOS
int 21h
afis_mesaj:
lea dx,mes_err ; afisarea mesajului de eroare
mov ah,9
int 21h
jmp rev_DOS
prog ends
date segment
mes_err db 'eroare: depasire dimensiune cuvant a rezultatului'
date ends
end start
2.4. Adunarea elementelor unui sir de valori (de tip cuvant, cu semn).
a) Utilizarea utilitarei Debug
Se aduna 16 cuvinte incepand de la adresa 3000:200, cu rezultat de lungime 16 biti, fara detectarea depasirii.
mov ax,3000
mov ds,ax
mov si,200
mov cx,10
mov ax,0
add ax,[si]
add si,2
loop adresa_add_ax_si
mov si,300
mov [si],ax
mov ax,4c00
int 21
Programul va depune rezultatul la adresa 3000h:300h. In locul adresei 'adresa_add_ax_si' se va pune adresa fizica a instructiunii 'add ax,[si]', furnizata de asamblor, si nu o etichta simbolica, cum este prezentata (de altfel nici nu se poate in acest asamblor).
b) Editare utilizand un editor de text.
Se aduna un numar oarecare de cuvinte si se semnaleaza o eventuala depasire a formatului initial de 16 de biti.
date segment
sir dw 0f54h, 20000, 0ff56, 8000 ; si sirul poate continua
lung_sir equ ($-sir)/2
rezultat dw 2 dup (?)
mes_err db 'eroare: depasire dimensiune cuvant a rezultatului'
date ends
end start
prog segment word public 'code'
assume cs:prog, ds:date
start: mov ax,date ; adresa de segment pentru date
mov ds,ax
lea si,sir ; adresa relativa a primului cuvant
mov ax,0 ; initializare rezultat
mov cx,lung_sir ; contor numar de cuvinte de insumat
reia_add:
add ax,[si] ; adunare cuvant curent
jo afis_mesaj ; (CF) = 1 ? , daca da -> mesaj depasire superioara/inferioara
add si,2 ; pozitionare pe cel de-al doilea cuvant
loop reia_add ; daca nu s-a terminat sirul, reia adunarea, cu urmatorul cuvant
mov rezultat,ax ; memorare rezultat
rev_DOS:
mov ax,4C00h ; revenire in DOS
int 21h
afis_mesaj:
lea dx,mes_err ; afisarea mesajului de eroare
mov ah,9
int 21h
jmp rev_DOS
prog ends
Copyright © 2024 - Toate drepturile rezervate