Assembly II

[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:

- g 102
A

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.

torna a modulo I  
 
 

Assembly modulo II e' la seconda lezione su assembly per macchine 8086-8088 e illustra il funzionamento del processore per mezzo del programma Debug. Con questa lezione concludiamo la parte dedicata a debug.