Assembly I

[La logica di presentazione degli argomenti di questo modulo si ispira a Linguaggio Assembly per pc IBM di Peter Norton]

Debug

Il file Debug.com e' un programma allegato al DOS.
Debug e' una utility che consente di controllare il funzionamento passo passo di un programma.

- Aprire la shell di DOS.
- Digitare debug. Il DOS resta in attesa.


Comando r

Digitando r [register] debug mostra il valore dei registri del processore.
Analizziamo il contenuto: compaiono 3 righe di valori.
Nella prima riga troviamo:

AX
BX
CX
DX
SP
BP
SI
DI


Le prime 4 coppie di lettere simbolizzano i 4 registri d'impiego generale, le seconde 4 coppie di lettere simbolizzano registri dedicati del nostro processore. Il numero di 4 cifre che segue al registro rappresenta il contenuto (in forma esadecimale) del registro. Sempre tramite il comando r si puo' visualizzare il contenuto di un registro specifico e modificarne il contenuto [i caratteri in neretto sono quelli che dovremo inserire. I caratteri non in neretto sono gia' presenti in memoria e variano da pc a pc a seconda delle operazioni che questi hanno compiuto in precedenza]:

- r ax
ax 0000
:

Se accanto a : scriviamo un numero e premiamo invio possiamo riscrivere r e verificare se il contenuto del registro e' stato modificato. E' stato modificato.
Utilizziamo ora i registri tramite debug. I processori x86 per compiere qualsiasi operazione utilizza i registri. Ad esempio per addizionare 1 a 2 utilizzeremo i registri AX e BX.

- r ax
ax 0000
: 1
- r bx

ax 0000
: 2

Ora collochiamo l'istruzione di addizione nella memoria [01d8 e' il corrispettivo in linguaggio macchina dell'istruzione ADD (addizione)].

- e 100
166c:100 ba. 01
- e 101
166c:100 0e. d8

Se digitiamo il comando r vedremo che:
i registri AX e BX contengono effettivamente i numeri esadecimali 1 e 2 e che nella terza riga della schermata appare l'istruzione esadecimale dell'addizione [01d8] e anche la sua definizione mnemonica ADD AX,BX.
La prossima operazione e' quella di segnalare al debug la locazione del'istruzione di addizione. A questo scopo vengono impiegati il registro CS [Code Segment] e il puntatore IP [Instruction Pointer]. CS e' stato impostato automaticamente da Debug mentre IP punta di default a 100 [ma i valori potevano essere diversi].

- r ip
ip 0000
: 100

Comando t

Digitando il comando t [trace] debug esegue l'operazione.
Se digitiamo ora r vedremo che:
AX=3 BX=2, ovvero la somma dei due registri AX e BX e' finita in AX come nel caso della somma x = x + y.
L'operazine di addizione appena effettuata e' stata compiuta inserendo il numero esadecimale 2h [h sta per esadecimale, 0010 in bit. Tabella di conversione esadecimale-binario] nel registro AX di 16 bit [8088 e' un processore a 16 bit: 0000 0000 0000 0000].
Tutti i registri possono essere divisi in due registri [2 byte]: registro alto AH e registro basso AL.
Ora se volessimo inserire due valori da addizionare nello stesso registro utilizzando i due byte [0000 0000 - 0000 0000, ovvero AH e AL] dovremmo procedere in questo modo utilizzando un diverso comando di addizione [00c4]:

- e 100
166c:100 ba. 00
- e 101
166c:100 0e. c4

Ora se digitiamo r vedremo nella terza riga: ADD AH,AL [bisogna ricordare di impostare ip a 100]. Il prossimo passo e' quello di inserire i due numeri in AX.

- r AX
ax 0000
: 0102

Se digitiamo ora r vedremo che il registro AX ha adesso il contenuto 0102.
Ora digitando t vedremo questo risultato: AX=0302. cio significa che AL ha addizionato il proprio contenuto a AH [02 + 01] e il risultato e' stato inserito in AH lasciando in AL il contenuto originale [02].

 
 

Assembly modulo I e' la prima lezione su assembly per macchine 8086-8088 e illustra il funzionamento del processore per mezzo del programma Debug. Quanto riportato in questo modulo vale anche per processori superiori.