|
 |
Il Processore e il Debugger |
DEBUG 20/22
[48 di 60] |
|
 |
|
Aggiornato
17 febbraio 2005 |
 |
|
Comando P - Esegue le procedure di un programma eseguibile |
|
 | Il comando P
(PROCEED, procedi) esegue
un'intera procedura, di solito rappresentata dall'istruzione
CALL xxxx
o
INT
xyH:
 | nel primo caso si tratta di un sottoprogramma
proprietario del codice eseguibile sotto test, normalmente allocato nel
medesimo segmento di codice dell'istruzione. |
 | INT rappresenta invece sempre una
procedura di sistema, sempre esterna al segmento del nostro codice:
 | se è una funzione BIOS trova posto
nella parte più alta del primo mega di memoria, nell'area fisica che va dall'indirizzo
F000H, a meno che non sia
stata "rilocata" da programmi di gestione, come drivers o
applicativi residenti in memoria. Capita spesso che la scheda video
si appropri del vettore INT 10H, mappandone i servizi dentro la sua
rom, dall'indirizzo C0000H |
 | se è una funzione DOS è collocata
nella parte bassa della memoria: un indirizzo verosimile è per
esempio 0E000H |
 | se è una funzione speciale (per
esempio quelle del mouse, attivate con INT
33H) è allocata in
posizioni non molto distanti da quelle del DOS, per esempio a
11000H |
|
|
 | Dunque, quando il debug ci presenta una di
queste istruzioni:
 | è
assolutamente necessario dare il comando
P se non desideriamo esplicitamente
entrare nella procedura chiamata da
CALL(per verificarne passo-passo il
funzionamento). |
 | ci conviene
dare il comando P per evitare di entrare
nella procedura di sistema chiamata da INT
(verificarne passo-passo il
funzionamento è inutile e controproducente). |
|
 | Questo comando consente anche di eseguire in
blocco le istruzioni ripetute (quelle con prefisso
REP) e le
istruzioni
gestite da
LOOP: in questo caso può essere conveniente alternare questa
possibilità a quella offerta dal
comando
T, più adatto per cercare e
trovare imperfezioni durante l'esecuzione di queste procedure iterative.
|
 |
|
Comando G - Esegue un programma |
|
 | Il comando G
(GO, vai!) esegue
tutto il programma; se viene dato senza
parametri inizia l'esecuzione del programma presente in
memoria a partire dall'indirizzo CS:0100H; il segmento di default è
ovviamente quello di codice, CS. |
 | Naturalmente l'esecuzione "diretta"
(senza parametri) del programma non ha senso: per fare questo basta lanciare
l'eseguibile dal prompt del Dos, senza scomodare il debugger. |
 | Lo scopo di G è quello
di eseguire in blocco un certo
numero di istruzioni, per poi proseguire passo-passo con il comando
T o con il comando
P; per fare questo è
sufficiente aggiungere un indirizzo dopo la G,
confermando con Invio; il programma sarà eseguito fino al
punto indicato. |
 | La sequenza di
azioni consigliata per la ricerca di malfunzionamenti è
frutto dell'esperienza; personalmente seguo questo metodo:
 | mi procuro la stampa (su carta) delle
istruzioni da esaminare, magari in forma LST (cioè
complete di indirizzi offset e bytes associati alle istruzioni) |
 | apro debug dal DOS e mi preparo l'ambiente
migliore (pulizia con il comando
F, caricamento del
file con i comandi
N e L, in
sequenza) |
 | scorro con il comando
U, dato più volte, il
codice disassemblato per verificare che quanto vedo coincide con il
listato (cosa ovvia, se non ho commesso errori, quindi non del tutto
scontata...) |
 | dopo aver annotato l'indirizzo
dell'istruzione successiva a quella fino alla quale voglio eseguire il
programma (per esempio 010AH,
nell'immagine della figura seguente) do il comando
G 010A e confermo con Invio. |
|
 |
Se fai click sull'icona a
sinistra si apre l'Ambiente Assembly
e puoi
provare DEBUG
on-line.
Scegli
il pulsante di opzione "Aprire il file" o "Esegui
l'applicazione"
e conferma
con
OK. NB: alcuni gestori di protezione (per esempio SP2 di WinXP) non ti consentono questa operazione: in questo caso scrivi c:\arch-lab\bin\sys\assembler.pif direttamente nel campo indirizzo del Browser |
-f 100
6000 00
-n prova.com
-l
-u
1311:0100 B400 MOV AH,00
1311:0102 B003 MOV AL,03
1311:0104 CD10 INT 10
1311:0106 B400 MOV AH,00
1311:0108 CD16 INT 16
1311:010A B44C MOV AH,4C
1311:010C CD21 INT 21
1311:010E 0000 ADD [BX+SI],AL
-g 10a
AX=1C0D BX=0000 CX=000E DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1311 ES=1311 SS=1311 CS=1311 IP=010A NV UP EI PL NZ NA PO NC
1311:010A B44C MOV AH,4C
- |
 | Da questo momento si prosegue con il comando comando
T, osservando con estrema attenzione i
nuovi valori dei registri (soprattutto quello delle flag). |
 |
Ti
posso consigliare un altro modo molto gratificante di eseguire
questo collaudo:
 |
torna
momentaneamente in ambiente windows (con il tasto
WINDOWS,
o semplicemente con Alt-Invio):
la pagina DOS in cui lavora debug con il programma
eseguibile, Prova.COM, viene così costretta in una
finestra, nel desktop. |
 |
apri
un'altra finestra DOS (icona
MsDOS o
su quella Assembly,
se disponi del mio ambiente...) e affiancala alla precedente. |
 |
apri
nella seconda finestra Qedit con il programma sorgente, Prova.ASM. |
 |
esegui
le procedure indicate sopra nella prima finestra e tieni
d'occhio il codice sorgente corrispondente nella seconda!!! |
|
 |
Quando
utilizzi il comando G fai
molta attenzione a specificare un indirizzo corretto,
altrimenti rischi di mandare in crash il computer!! |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|