Sistemi E Reti

Dichiarazione Variabili

Dichiarazione delle variabili in Assembly 8086 con DB e DW e come individuare fisicamente la loro posizione in memoria tramite emu8086.

Durata

PT50M

Software

emu8086

Assembly X86 | Dichiarazione Variabili

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


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.


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.





Assembly, 8086, Variabili, DB, DW, Memoria, Offset, Little-Endian,