|
[La logica di presentazione degli argomenti
di questo modulo si ispira a Linguaggio Assembly per pc IBM
di Peter Norton]
Istruzione int
Avviare debug e introdurre 200h in AX e
41h in DX [registro porta variabile].
Int sta per interrupt. Ogni volta che costruiamo un programma
in assembly e inseriamo l'istruzione int il controllo del programma
passa al DOS che fa qualcosa a secondo del codice di chiamta [ad
esempio: stampare su video, prendere un carattere dalla tastiera,
inviare un bit ad una porta]. La stessa cosa vale per il debug,
solo che debug puo' leggere le istruzioni in formato esadecimale.
Dato che lo scopo che ci proponiamo e' quello di stampare un carattere
e l'interruzione deputata e' INT21
L'istruzione INT21 e' codificata come CDh21h.
|
- r ax
ax 0000
: 200
- r bx
dx 0000
: 41
-
e 100
166c:100 ba. cd
- e 101
166c:100 0e. 21
|
Comando g
Ora per procedere alla verifica del risultato non possiamo digitare
t perche' questo camando di debug effettua un'operazione alla
volta mentre la chiamata a DOS implica la realizzazione di piu'
operazioni. Per questo motivo digiteremo g [go] seguito dall'indirizzo
a cui desideriamo che il programma si arresti; nel nostro caso
l'istruzione int occupa le posizioni 100 e 101 quindi dovremo
arrestarci a 102.
Digitiamo:
Il DOS ha stampato il carattere A perche'
abbiamo inserito 02 in AH [inserendo 200 in AX] che chiede al
DOS, quando richiamato da un interruzione INT21, di stampare un
carattere sul monitor.
DOS va a cercare il carattere da stampare nel registro DL. In
DL noi abbiamo messo 41h che e' il codice esadecimale per il carattere
ascii a maiuscolo [A]. Codici
dei caratteri ascii
Avevamo detto che debug puo' leggere istruzioni solo nel loro
formato esadecimale: il prossimo comando che vedremo smentisce
questa affermazione.
Comandi a - u
Il comando a significa assemble.
Essa ci permette di introdurre istruzioni in formato menmonico
senza doverle codificare in esadecimale.
Al contrario u, unassemble, se digitato, consente di osservare
le istruzioni appena digitate.
Si inserisca allora 1234h in AX e abcdh in DX.
si digiti ora a:
|
- a
166c:0102 mov ah,dl
166c:0104
|
Se digitiamo r osserviamo AX=1234 DX=abcd.
Digitando t osserviamo che AX=cd34 DX=abcd e sulla terza riga:
MOV AH,DL.
Se digitiamo ora u osserviamo che nella prima riga c'e' riportata
proprio questa ultima operazione, il resto delle istruzioni risiedeva
in quelle posizioni precedentemente alle nostre istruzioni.
Comandi n - w
Inseriamo tramite debug il seguente
programma:
|
- a
166c:0106 mov ah,02
166c:0108 mov dl,2a
166c:010a int 21
166c:010c int 20
|
Ecco tramite a cosa abbiamo introdotto:
ah,02 codice di stampa per INT21; dl,2a codice esadecimale per
il carattere ascii *; int 21 interrupt di stampa; int 20 interrupt
di fine programma e ritorno del controllo a DOS.
Digitiamo ora g [non c'e' bisogno di specificare la riga visto
che abbiamo inserito int20] e vedremo stampato sul monitor un
*.
Trasformiamo questo piccolo programma in un eseguibile .com: assegnamogli
un nome mediante il comando n che ha questo formato: - n nome.com
dove nome e' il nome da assegnare al programma.
Dopo aver assegnato un nome al programma dobbiamo conteggiare
i byte del programma per comunicare a debug quanta memoria deve
mettere a disposizione per il nostro programma. A questo scopo
utilizziamo il comando h con l'ultima locazione del nostro pragramma
e la prima: - h 108 100 [108 e' l'istruzione successiva a INT20]
e si otterra' 8, ovvero 8byte.
Debug utilizza i registri BX:CX per assegnare la lunghezza al
programma; allora:
|
- n primo.com
- r cx
ax 0000
: 0800
- r bx
dx 0000
: 0000
- w
Scrittura di 00008 byte in corso
|
Nella cartella Windows troverete il programma
primo.com. Se lanciato apparira' una shell di DOS con un asterisco.
|