|
 |
Il Processore e il Debugger |
DEBUG 19/22
[47 di 60] |
 | I comandi più importanti del debugger sono
certamente quelli descritti in questa pagina e nella
successiva: la loro azione è rivolta
decisamente al collaudo di un programma, cioè alla sua
esecuzione controllata. |
Benedetto sia Debug e il suo inventore!
 | Se il
tuo programma fa i capricci e il tuo umore assomiglia ad una notte senza
luna, basta forzare l'esecuzione fino ad un certo punto sicuro (comando
G) e poi procedere a piccoli passi (comando
T) evitando di eseguire (comando P)
le procedure personali (riconoscibili dallo mnemonico CALL)
o di sistema (attivate dall'istruzione INT). |
 | L'errore salta fuori da solo, di solito con un
ghigno di superiorità, per farti capire quanto sei frescone... Non
dimenticare: |
il computer ha
sempre ragione....
per il semplice fatto che tu lo hai istruito
 |
|
Comando T - Traccia di un programma eseguibile |
|
 | Il comando T
(TRACE, traccia) esegue
una o più istruzioni; di solito viene usato senza
parametri, al fine di eseguire
l'istruzione corrente (cioè quella puntata da CS:IP);
subito dopo visualizza automaticamente la nuova situazione dei registri e le
informazioni relative all'istruzione cha sta per essere eseguita (indirizzo
logico, codici associati e stringa
mnemonica). |
 | La tecnica garantita da questo comando è nota
come esecuzione passo-passo. |
 | Questo comando consente l'uso di 2
parametri, entrambi poco pratici (almeno dal mio punto di vista):
 | il primo consente di specificare
l'indirizzo della prima istruzione da eseguire (P.es: T
= 0112, notare il segno "uguale", mai usato
finora...); anche volendo far partire l'esecuzione da un certo punto
intermedio del programma l'effetto non è quello ottenibile
nell'esecuzione passo-passo dall'inizio: verrebbe a mancare infatti
l'influenza sui registri di tutte le precedenti istruzioni. |
 | il secondo parametro è rischioso, se
usato con sufficienza o scarsa attenzione; consente di eseguire
di seguito più istruzioni, semplicemente indicandone il
numero subito dopo (P.es: T 12).
Il rischio è di entrare dentro le procedure
e perdere il filo del programma, specialmente se si entra in una INT di
sistema. |
|
 | Dopo aver caricato il programma
prova.com, usato nel
capitolo 2 per
esercitarci nella sua creazione, e dopo averlo visualizzato con il comando
U (parte alta dell'immagine), possiamo vedete l'effetto
dell'esecuzione passo-passo delle prime 3 istruzioni (parte bassa): |
| NB: |
per poter vedere questo effetto
devi prima scaricare il file eseguibile
prova.com nella cartella di lavoro dell'Ambiente
Assembler; per fare questo devi:
 |
cliccare su questo
link
e rispondere
Salva |
 |
nel riquadro che si apre,
scegliere la cartella radice
(C:\)
e confermare ancora
Salva |
 |
aprire il gestore risorse
e selezionare la
cartella radice (Disco
locale C:\) |
 |
fare doppio click su prova.zip
e cliccare poi su
extract per estrarre il file prova.com
dall'archivio ZIP |
 |
nel riquadro che si apre confermare
ancora
extract
(l'estrazione avverrà automaticamente al posto giusto) e
confermare
Yes quando verrà richiesto di
sovrascrivere
(Would
you like to replace the exixting file) |
|
 |
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 1000 00
-n prova.com
-l
-u
11A0:0100 B400 MOV AH,00
11A0:0102 B003 MOV AL,03
11A0:0104 CD10 INT 10
11A0:0106 B400 MOV AH,00
11A0:0108 CD16 INT 16
11A0:010A B44C MOV AH,4C
11A0:010C CD21 INT 21
11A0:010E 0000 ADD [BX+SI],AL |
-t
AX=0000 BX=0000 CX=000E DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=11A0 ES=11A0 SS=11A0 CS=11A0 IP=0102 NV UP EI PL NZ NA PO NC
11A0:0102 B003
MOV AL,03
-t
AX=0003 BX=0000 CX=000E DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=11A0 ES=11A0 SS=11A0 CS=11A0
IP=0104 NV UP EI PL NZ NA PO NC
11A0:0104 CD10
INT 10
-t
AX=0003 BX=0000 CX=000E DX=0000 SP=FFF8 BP=0000 SI=0000 DI=0000
DS=11A0 ES=11A0 SS=11A0 CS=0212 IP=08A9 NV UP DI PL NZ NA PO NC
0212:08A9 2E803EA70802 CMP Byte Ptr CS:[08A7],02
CS:08A7=00 |
 | Osserviamo con calma cosa ci fornisce Trace:
 | la pagina si riempie di campi simili: in particolare
possiamo seguire i cambiamenti dei registri dopo l'azione
dell'istruzione appena eseguita; per esempio l'azione della prima T
(esegue MOV AH,00)
non cambia il registro AH (che è già a
00H) ma la seconda T
(esegue MOV AL,03)
produce il cambiamento di AL; si vede chiaramente che
AX=0003H) |
 | l'azione della terza T
è una cosa inutile e sbagliata
perchè ci obbliga a seguire il codice di una procedura di sistema (INT 10)
di cui diamo per scontata l'esattezza; in questi casi bisogna stare
attenti e dare, in vece, il
comando P. |
 |
Le
istruzioni INT xx non vanno tracciate con il comando T,
ma eseguite in blocco con il comando P; la loro traccia
può essere interessante solo a fini didattici o di auto-istruzione,
per vedere come sono fatte... |
 | notare come l'azione della terza T
abbia cambiato il registro IP in modo diverso e
drastico rispetto ai prevedibili cambiamenti imposti dalle
prime 2 tracce; anche il valore del registro
di segmento ha assunto un valore diverso rimarcando il fatto
che non siamo più dentro il nostro programma (o meglio nel segmento ad
esso riservato dal debugger) ma Dio sa dove!...; l'indirizzo fisico è
029C9H, inferiore a quello
11B04H da cui siamo partiti e, dovendo essere
una procedura video (di solito caratterizzata da indirizzi del tipo CxxxxH), qualcuno la ha rimappata nella parte iniziale della Ram. |
 | Se per errore entriamo all'interno del codice di una
INT è poi laborioso ritornare nel nostro programma: bisogna riportare
sia CS che IP ai valori originali, sperando di non essere andati troppo
avanti, cioè di non averli persi di vista irrimediabilmente... |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|