Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Schede del Tutorial

Home » Programma il Computer » Tutorial Assembly

Le Schede del Tutorial

  Le PseudoOperazioni di MASM

SCHEDA n° 02 [ 17  di 26] 

    

    Gestione dei Segmenti - ASSUME
     
bulletLa 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.
bulletIl 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

      

bullet 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!

      

bulletLa 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). 
bulletLa 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.

      

Ricorda... 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!

      

bulletDunque 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).
bulletIn 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.

      

bulletNella 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).

      

bullet Da questo punto di vista se questa direttiva non viene esplicitamente dichiarata non viene generato alcun errore di compilazione.
bulletLe 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.

    

Pagina Precedente Scheda n° 02 Pagina Successiva Pseudo Operazioni di MASM Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Scheda n° 02 -  17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati