- Comprendere che una variabile Assembly è una zona di memoria con un nome simbolico.
- Utilizzare correttamente le direttive DB e DW per riservare spazio in memoria.
- Individuare l’indirizzo di memoria (offset) associato a una variabile.
- Riconoscere che le variabili risiedono in memoria e non nei registri.
- Osservare la disposizione sequenziale delle variabili in memoria.
Concetto fondamentale
In Assembly una variabile NON è un contenitore astratto come nei linguaggi ad alto livello.
Una variabile è semplicemente una zona di memoria a cui assegniamo:
- un nome (etichetta)
- una dimensione (byte o word)
- un indirizzo in memoria
La CPU lavora solo con registri e memoria: il nome della variabile serve solo al programmatore e all’assemblatore.
Direttive per dichiarare le variabili
| Direttiva | Significato | Dimensione | Esempio |
|---|---|---|---|
| DB | Define Byte | 1 byte (8 bit) | val db 10 |
| DW | Define Word | 2 byte (16 bit) | tot dw 100 |
Ogni variabile occupa spazio reale in memoria e viene memorizzata in modo sequenziale, una subito dopo l’altra.
Sintassi generale della dichiarazione
nome_variabile direttiva valore
La dichiarazione di una variabile in Assembly può avvenire in due modi diversi:
- Dichiarazione con inizializzazione
- Dichiarazione senza inizializzazione
Dichiarazione con inizializzazione
La variabile viene creata in memoria e le viene assegnato subito un valore iniziale.
num8 db 10 ; byte inizializzato a 10
num16 dw 100 ; word inizializzato a 100
num32 dd 5000 ; double word inizializzato a 5000
In questo caso, nella memoria viene memorizzato direttamente il valore indicato.
Dichiarazione senza inizializzazione
La variabile viene creata in memoria, ma non viene assegnato alcun valore iniziale.
num8 db ? ; 1 byte riservato, valore non definito
num16 dw ? ; 2 byte riservati, valore non definito
Il simbolo ? indica che lo spazio in memoria viene solo riservato: il contenuto iniziale è indefinito e dipende dallo stato della memoria.
Un errore comune: dichiarare le variabili prima del codice
Nei programmi .COM l’esecuzione inizia sempre all’indirizzo CS:0100h.
Questo significa che la prima cosa che la CPU trova a 0100h deve essere codice altrimenti si verifica un errore!
Considera il seguente codice:
org 100h
num1 db 5
num2 db 1
num3 dw 0
num4 dw ?
int 20h ; fine del programma
Guarda l'immagine in alto che mostra la finestra di emulazione del codice. La dichiarazione num1 db 5 viene interpretata come un istruzione add questo perchè
l'assemblatore a quella riga si aspetta di trovare soltato istruzioni e non dichiarazioni di variabili quindi se a 0100h si trovano delle variabili, la CPU:
- non sa che sono dati
- le interpreta come istruzioni
- esegue byte di memoria come se fossero codice
Il risultato è un comportamento errato: istruzioni “strane” e avanzamenti anomali con Single Step.
Regola fondamentale
Le variabili vanno dichiarate dopo l’istruzione di terminazione del programma.
Esempio corretto
org 100h
mov al, num1
add al, num2
mov ax, num3
int 20h ; fine del programma
num1 db 5
num2 db 1
num3 dw 0
num4 dw ?
In questo modo:
- la CPU esegue solo istruzioni valide
- le variabili restano in memoria
- il programma termina correttamente
Importante: le variabili NON sono nei registri, ma in memoria.
LABORATORIO
Individuare codice e variabili in memoria con emu8086
Comprendere le variabili e la loro posizione in memoria.
- PC con emu8086
- Programma Assembly in formato .COM
1 Avvio del programma
org 100h
mov al, num1
add al, num2
mov ax, num3
mov bx, num4
int 20h ; fine del programma
num1 db 5
num2 db 1
num3 dw 0
num4 dw ?
Caricare il programma e avviarlo in modalità Single Step.
Osservare il valore iniziale del registro IP e verificare che punti
all’istruzione mov al, num1.
Questo conferma che l’IP punta a codice e non a dati.
2 Esecuzione del programma single step
Quando viene eseguita mov al, num1 il registro AL contiene il valore corretto
anche se num1 è dichiarata dopo il codice.
Spiega facendo riferimento al ruolo dell’assemblatore e al concetto di indirizzo di memoria.
3 Valore di num3
Che valore contiene num3 in memoria? È stato modificato dal programma oppure no? Motiva la risposta.
4 Posizione delle variabili in memoria
Quali sono gli indirizzi di memoria in cui si trovano le variabili dichiarate?
Che valore contengono i registri?
L’assemblatore conosce i nomi e assegna gli indirizzi; la CPU esegue solo indirizzi di memoria.