|
 |
Le
PseudoOperazioni di MASM |
SCHEDA n° 02 [
17
di 26] |
 |
|
Gestione dei Segmenti -
ASSUME |
|
 | La PseudoOperazione
ASSUME completa la dotazione di
direttive indispensabili nel progetto dei programmi sorgente, raccolte nelle
Matrici
predisposte per questo fine; essa può essere inserita anche più volte nel
testo, ma di solito è posta sulla linea successiva a quella
occupata da SEGMENT e le sue (eventuali) opzioni
di rango
o di allineamento. |
 | Il concetto di ASSUME
è effettivamente un po' complesso; per cercare di
chiarirlo scriviamo il semplice programma (parte sinistra) e ricordiamo come MASM ha
codificato (parte destra) le etichette che ha trovato dentro al SEGMENT
_prog: |
_prog
SEGMENT BYTE PUBLIC 'CODE'
ASSUME
CS:_prog,DS:_prog
ORG 0100H
INIZIO: JMP MAIN
ATTRIB DB 0FH
RamVideo DW 0B800h
dato DD 12345678H
MAIN: NOP
_prog
ENDS
END INIZIO
|
Symbols Name Type Value Attr
---------------------------------
INIZIO L NEAR 0100
_PROG
ATTRIB L BYTE 0103
_PROG
RAMVIDEO L WORD 01CD _PROG
DATO L DWORD 01FB
_PROG
MAIN L NEAR 0219
_PROG |
 |
Per ogni simbolo MASM
annota il suo tipo (indirizzo
Near,
o byte, o word, o altro), il rispettivo valore
(in pratica l'indirizzo di offset nel segmento) e il nome
(Attr) del
segmento in cui le etichette sono state definite: salta subito
agli occhi che tutte le etichette hanno lo stesso
attributo! |
 | La presenza dell'attributo di un simbolo
sottolinea il fatto che l'assemblatore
non da per scontato (come noi, nei nostri esempi) che il segmento di codice
sia unico, ma ammette la possibilità che ce ne siano degli altri (cosa
verosimile in programmi particolarmente complessi). |
 | La possibile presenza di più segmenti mette potenzialmente
in imbarazzo il compilatore: per poter creare il codice macchina in
grado di indirizzare ogni loro simbolo deve sapere
quale registro di segmento (CS,
DS, ES o
SS)
coinvolgere. |
 |
Con
i processori della serie x86 tutte le etichette relative ai
DATI di un segmento
sono puntate per default dal registro DS (per esempio MOV
AL,[ATTRIB]),
così come i riferimenti a locazioni di memoria puntate tramite
registro (per esempio MOV
AL,[SI]); la conseguenza
logica è che il compilatore usa il registro DS per
default quando codifica gli indirizzi delle etichette di
dato! |
 | Dunque la direttiva ASSUME
obbliga il compilatore a generare codice in grado di puntare le etichette di
un determinato SEGMENT con
l'aiuto di un ben preciso registro di segmento: così con la stringa ASSUME
CS:_prog il
compilatore dovrà usare
CS nel codice
macchina che descrive le istruzioni che puntano le etichette del SEGMENT
_prog; da notare che le istruzioni che puntano locazioni del
segmento tramite registro (come MOV
AL,[SI]) continuano ad essere codificate con
utilizzando comunque DS). |
 | In ogni momento la direttiva ASSUME
Nothing, annulla le
assegnazioni date in precedenza ai 4 i registri di segmento, mentre
se la parola chiave viene associata ad un singolo registro (per esempio ASSUME
CS:Nothing) viene annullata solo quella relative
a quel segmento. |
 | Nella pagina seguente riprenderemo questo
impegnativo concetto, con l'aiuto della definizione di segment-override;
conviene comunque prendere atto fin d'ora che l'azione di ASSUME
si esercita solo sulle etichette
di dato (variabili del segmento),
cioè quei simboli definiti senza :
(2 punti), per indirizzare le quali potremo di volta in volta
imporre a piacere (o meglio, secondo le opportunità) i registri
CS, ES o
SS) (oppure DS per riportare nelle condizioni standard assunzioni modificate il
precedenza). |
 | Da questo punto di vista se questa direttiva
non viene esplicitamente dichiarata non viene generato alcun errore di compilazione. |
 | Le etichette con i :
(2 punti) invece, relative agli indirizzi correnti
(near) delle
istruzioni del nostro programma devono
appartenere ad un segmento di codice, per cui per esse è
necessario comunque scrivere la stringa ASSUME
CS:_prog; senza questa direttiva la compilazione sarebbe interrotta,
con segnalazione di errore grave: error A2062: Missing or unreachable CS.,
segmento di codice inesistente o irraggiungibile. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|